1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
#define CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
#pragma once
#if defined(ENABLE_GPU)
#include <string>
#include <vector>
#include "base/id_map.h"
#include "base/memory/weak_ptr.h"
#include "content/common/gpu/media/gpu_video_decode_accelerator.h"
#include "gpu/command_buffer/common/constants.h"
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/gpu_scheduler.h"
#include "ipc/ipc_channel.h"
#include "ipc/ipc_message.h"
#include "ui/gfx/gl/gl_context.h"
#include "ui/gfx/gl/gl_surface.h"
#include "ui/gfx/gl/gpu_preference.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/size.h"
#include "ui/gfx/surface/transport_dib.h"
#if defined(OS_MACOSX)
#include "ui/gfx/surface/accelerated_surface_mac.h"
#endif
class GpuChannel;
class GpuWatchdog;
class GpuCommandBufferStub
: public IPC::Channel::Listener,
public IPC::Message::Sender,
public base::SupportsWeakPtr<GpuCommandBufferStub> {
public:
GpuCommandBufferStub(
GpuChannel* channel,
GpuCommandBufferStub* share_group,
gfx::PluginWindowHandle handle,
const gfx::Size& size,
const gpu::gles2::DisallowedFeatures& disallowed_features,
const std::string& allowed_extensions,
const std::vector<int32>& attribs,
gfx::GpuPreference gpu_preference,
int32 route_id,
int32 client_id,
int32 render_view_id,
GpuWatchdog* watchdog,
bool software);
virtual ~GpuCommandBufferStub();
// IPC::Channel::Listener implementation:
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// IPC::Message::Sender implementation:
virtual bool Send(IPC::Message* msg) OVERRIDE;
// Whether this command buffer can currently handle IPC messages.
bool IsScheduled();
// Whether this command buffer needs to be polled again in the future.
bool HasMoreWork();
// Set the swap interval according to the command line.
void SetSwapInterval();
gpu::gles2::GLES2Decoder* decoder() const { return decoder_.get(); }
gpu::GpuScheduler* scheduler() const { return scheduler_.get(); }
// Identifies the renderer process.
int32 client_id() const { return client_id_; }
// Identifies a particular renderer belonging to the same renderer process.
int32 render_view_id() const { return render_view_id_; }
// Identifies the various GpuCommandBufferStubs in the GPU process belonging
// to the same renderer process.
int32 route_id() const { return route_id_; }
gfx::GpuPreference gpu_preference() { return gpu_preference_; }
// Sends a message to the console.
void SendConsoleMessage(int32 id, const std::string& message);
private:
void Destroy();
// Cleans up and sends reply if OnInitialize failed.
void OnInitializeFailed(IPC::Message* reply_message);
// Message handlers:
void OnInitialize(IPC::Message* reply_message);
void OnSetGetBuffer(int32 shm_id, IPC::Message* reply_message);
void OnSetParent(int32 parent_route_id,
uint32 parent_texture_id,
IPC::Message* reply_message);
void OnGetState(IPC::Message* reply_message);
void OnGetStateFast(IPC::Message* reply_message);
void OnAsyncFlush(int32 put_offset, uint32 flush_count);
void OnEcho(const IPC::Message& message);
void OnRescheduled();
void OnCreateTransferBuffer(int32 size,
int32 id_request,
IPC::Message* reply_message);
void OnRegisterTransferBuffer(base::SharedMemoryHandle transfer_buffer,
size_t size,
int32 id_request,
IPC::Message* reply_message);
void OnDestroyTransferBuffer(int32 id, IPC::Message* reply_message);
void OnGetTransferBuffer(int32 id, IPC::Message* reply_message);
void OnCreateVideoDecoder(
media::VideoDecodeAccelerator::Profile profile,
IPC::Message* reply_message);
void OnDestroyVideoDecoder(int32 decoder_route_id);
void OnSetSurfaceVisible(bool visible);
void OnCommandProcessed();
void OnParseError();
void ReportState();
// The lifetime of objects of this class is managed by a GpuChannel. The
// GpuChannels destroy all the GpuCommandBufferStubs that they own when they
// are destroyed. So a raw pointer is safe.
GpuChannel* channel_;
// The group of contexts that share namespaces with this context.
scoped_refptr<gpu::gles2::ContextGroup> context_group_;
gfx::PluginWindowHandle handle_;
gfx::Size initial_size_;
gpu::gles2::DisallowedFeatures disallowed_features_;
std::string allowed_extensions_;
std::vector<int32> requested_attribs_;
gfx::GpuPreference gpu_preference_;
int32 route_id_;
bool software_;
uint32 last_flush_count_;
// The following two fields are used on Mac OS X to identify the window
// for the rendering results on the browser side.
int32 client_id_;
int32 render_view_id_;
scoped_ptr<gpu::CommandBufferService> command_buffer_;
scoped_ptr<gpu::gles2::GLES2Decoder> decoder_;
scoped_ptr<gpu::GpuScheduler> scheduler_;
scoped_refptr<gfx::GLContext> context_;
scoped_refptr<gfx::GLSurface> surface_;
// SetParent may be called before Initialize, in which case we need to keep
// around the parent stub, so that Initialize can set the parent correctly.
base::WeakPtr<GpuCommandBufferStub> parent_stub_for_initialization_;
uint32 parent_texture_for_initialization_;
GpuWatchdog* watchdog_;
// Zero or more video decoders owned by this stub, keyed by their
// decoder_route_id.
IDMap<GpuVideoDecodeAccelerator, IDMapOwnPointer> video_decoders_;
DISALLOW_COPY_AND_ASSIGN(GpuCommandBufferStub);
};
#endif // defined(ENABLE_GPU)
#endif // CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
|