Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: content/common/gpu/image_transport_surface.cc

Issue 9194005: gpu: reference target surfaces through a globally unique surface id. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix more tests Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if defined(ENABLE_GPU) 5 #if defined(ENABLE_GPU)
6 6
7 #include "content/common/gpu/image_transport_surface.h" 7 #include "content/common/gpu/image_transport_surface.h"
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "content/common/gpu/gpu_channel.h" 11 #include "content/common/gpu/gpu_channel.h"
12 #include "content/common/gpu/gpu_channel_manager.h" 12 #include "content/common/gpu/gpu_channel_manager.h"
13 #include "content/common/gpu/gpu_command_buffer_stub.h" 13 #include "content/common/gpu/gpu_command_buffer_stub.h"
14 #include "content/common/gpu/gpu_messages.h" 14 #include "content/common/gpu/gpu_messages.h"
15 #include "gpu/command_buffer/service/gpu_scheduler.h" 15 #include "gpu/command_buffer/service/gpu_scheduler.h"
16 16
17 ImageTransportSurface::ImageTransportSurface() { 17 ImageTransportSurface::ImageTransportSurface() {
18 } 18 }
19 19
20 ImageTransportSurface::~ImageTransportSurface() { 20 ImageTransportSurface::~ImageTransportSurface() {
21 } 21 }
22 22
23 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, 23 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface,
24 GpuChannelManager* manager, 24 GpuChannelManager* manager,
25 int32 render_view_id, 25 GpuCommandBufferStub* stub,
26 int32 client_id,
27 int32 command_buffer_id,
28 gfx::PluginWindowHandle handle) 26 gfx::PluginWindowHandle handle)
29 : surface_(surface), 27 : surface_(surface),
30 manager_(manager), 28 manager_(manager),
31 render_view_id_(render_view_id), 29 stub_(stub->AsWeakPtr()),
32 client_id_(client_id),
33 command_buffer_id_(command_buffer_id),
34 handle_(handle) { 30 handle_(handle) {
35 route_id_ = manager_->GenerateRouteID(); 31 route_id_ = manager_->GenerateRouteID();
36 manager_->AddRoute(route_id_, this); 32 manager_->AddRoute(route_id_, this);
37 } 33 }
38 34
39 ImageTransportHelper::~ImageTransportHelper() { 35 ImageTransportHelper::~ImageTransportHelper() {
40 manager_->RemoveRoute(route_id_); 36 manager_->RemoveRoute(route_id_);
41 } 37 }
42 38
43 bool ImageTransportHelper::Initialize() { 39 bool ImageTransportHelper::Initialize() {
(...skipping 21 matching lines...) Expand all
65 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, 61 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK,
66 OnNewSurfaceACK) 62 OnNewSurfaceACK)
67 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); 63 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK);
68 IPC_MESSAGE_UNHANDLED(handled = false) 64 IPC_MESSAGE_UNHANDLED(handled = false)
69 IPC_END_MESSAGE_MAP() 65 IPC_END_MESSAGE_MAP()
70 return handled; 66 return handled;
71 } 67 }
72 68
73 void ImageTransportHelper::SendAcceleratedSurfaceRelease( 69 void ImageTransportHelper::SendAcceleratedSurfaceRelease(
74 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { 70 GpuHostMsg_AcceleratedSurfaceRelease_Params params) {
75 params.client_id = client_id_; 71 params.surface_id = stub_->surface_id();
76 params.render_view_id = render_view_id_;
77 params.route_id = route_id_; 72 params.route_id = route_id_;
78 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); 73 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params));
79 } 74 }
80 75
81 void ImageTransportHelper::SendAcceleratedSurfaceNew( 76 void ImageTransportHelper::SendAcceleratedSurfaceNew(
82 GpuHostMsg_AcceleratedSurfaceNew_Params params) { 77 GpuHostMsg_AcceleratedSurfaceNew_Params params) {
83 params.client_id = client_id_; 78 params.surface_id = stub_->surface_id();
84 params.render_view_id = render_view_id_;
85 params.route_id = route_id_; 79 params.route_id = route_id_;
86 #if defined(OS_MACOSX) 80 #if defined(OS_MACOSX)
87 params.window = handle_; 81 params.window = handle_;
88 #endif 82 #endif
89 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params)); 83 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params));
90 } 84 }
91 85
92 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped( 86 void ImageTransportHelper::SendAcceleratedSurfaceBuffersSwapped(
93 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { 87 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) {
94 params.client_id = client_id_; 88 params.surface_id = stub_->surface_id();
95 params.render_view_id = render_view_id_;
96 params.route_id = route_id_; 89 params.route_id = route_id_;
97 #if defined(OS_MACOSX) 90 #if defined(OS_MACOSX)
98 params.window = handle_; 91 params.window = handle_;
99 #endif 92 #endif
100 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); 93 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params));
101 } 94 }
102 95
103 void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer( 96 void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer(
104 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) { 97 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) {
105 params.client_id = client_id_; 98 params.surface_id = stub_->surface_id();
106 params.render_view_id = render_view_id_;
107 params.route_id = route_id_; 99 params.route_id = route_id_;
108 #if defined(OS_MACOSX) 100 #if defined(OS_MACOSX)
109 params.window = handle_; 101 params.window = handle_;
110 #endif 102 #endif
111 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params)); 103 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params));
112 } 104 }
113 105
114 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { 106 void ImageTransportHelper::SendResizeView(const gfx::Size& size) {
115 manager_->Send(new GpuHostMsg_ResizeView(client_id_, 107 manager_->Send(new GpuHostMsg_ResizeView(stub_->surface_id(),
116 render_view_id_,
117 route_id_, 108 route_id_,
118 size)); 109 size));
119 } 110 }
120 111
121 void ImageTransportHelper::SetScheduled(bool is_scheduled) { 112 void ImageTransportHelper::SetScheduled(bool is_scheduled) {
122 gpu::GpuScheduler* scheduler = Scheduler(); 113 gpu::GpuScheduler* scheduler = Scheduler();
123 if (!scheduler) 114 if (!scheduler)
124 return; 115 return;
125 116
126 scheduler->SetScheduled(is_scheduled); 117 scheduler->SetScheduled(is_scheduled);
127 } 118 }
128 119
129 void ImageTransportHelper::DeferToFence(base::Closure task) { 120 void ImageTransportHelper::DeferToFence(base::Closure task) {
130 gpu::GpuScheduler* scheduler = Scheduler(); 121 gpu::GpuScheduler* scheduler = Scheduler();
131 DCHECK(scheduler); 122 DCHECK(scheduler);
132 123
133 scheduler->DeferToFence(task); 124 scheduler->DeferToFence(task);
134 } 125 }
135 126
136 void ImageTransportHelper::OnBuffersSwappedACK() { 127 void ImageTransportHelper::OnBuffersSwappedACK() {
137 surface_->OnBuffersSwappedACK(); 128 surface_->OnBuffersSwappedACK();
138 } 129 }
139 130
140 void ImageTransportHelper::OnPostSubBufferACK() { 131 void ImageTransportHelper::OnPostSubBufferACK() {
141 surface_->OnPostSubBufferACK(); 132 surface_->OnPostSubBufferACK();
142 } 133 }
143 134
144 void ImageTransportHelper::OnNewSurfaceACK( 135 void ImageTransportHelper::OnNewSurfaceACK(
145 uint64 surface_id, 136 uint64 surface_handle,
146 TransportDIB::Handle shm_handle) { 137 TransportDIB::Handle shm_handle) {
147 surface_->OnNewSurfaceACK(surface_id, shm_handle); 138 surface_->OnNewSurfaceACK(surface_handle, shm_handle);
148 } 139 }
149 140
150 void ImageTransportHelper::OnResizeViewACK() { 141 void ImageTransportHelper::OnResizeViewACK() {
151 surface_->OnResizeViewACK(); 142 surface_->OnResizeViewACK();
152 } 143 }
153 144
154 void ImageTransportHelper::Resize(gfx::Size size) { 145 void ImageTransportHelper::Resize(gfx::Size size) {
155 // On windows, the surface is recreated and, in case the newly allocated 146 // On windows, the surface is recreated and, in case the newly allocated
156 // surface happens to have the same address, it should be invalidated on the 147 // surface happens to have the same address, it should be invalidated on the
157 // decoder so that future calls to MakeCurrent do not early out on the 148 // decoder so that future calls to MakeCurrent do not early out on the
158 // assumption that neither the context or surface have actually changed. 149 // assumption that neither the context or surface have actually changed.
159 #if defined(OS_WIN) 150 #if defined(OS_WIN)
160 Decoder()->ReleaseCurrent(); 151 Decoder()->ReleaseCurrent();
161 #endif 152 #endif
162 153
163 surface_->OnResize(size); 154 surface_->OnResize(size);
164 155
165 #if defined(OS_WIN) 156 #if defined(OS_WIN)
166 Decoder()->MakeCurrent(); 157 Decoder()->MakeCurrent();
167 SetSwapInterval(); 158 SetSwapInterval();
168 #endif 159 #endif
169 } 160 }
170 161
171 void ImageTransportHelper::SetSwapInterval() { 162 void ImageTransportHelper::SetSwapInterval() {
172 GpuChannel* channel = manager_->LookupChannel(client_id_); 163 if (!stub_.get())
173 if (!channel)
174 return; 164 return;
175 165 stub_->SetSwapInterval();
176 GpuCommandBufferStub* stub =
177 channel->LookupCommandBuffer(command_buffer_id_);
178 if (!stub)
179 return;
180
181 stub->SetSwapInterval();
182 } 166 }
183 167
184 bool ImageTransportHelper::MakeCurrent() { 168 bool ImageTransportHelper::MakeCurrent() {
185 gpu::gles2::GLES2Decoder* decoder = Decoder(); 169 gpu::gles2::GLES2Decoder* decoder = Decoder();
186 if (!decoder) 170 if (!decoder)
187 return false; 171 return false;
188 return decoder->MakeCurrent(); 172 return decoder->MakeCurrent();
189 } 173 }
190 174
191 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { 175 gpu::GpuScheduler* ImageTransportHelper::Scheduler() {
192 GpuChannel* channel = manager_->LookupChannel(client_id_); 176 if (!stub_.get())
193 if (!channel)
194 return NULL; 177 return NULL;
195 178 return stub_->scheduler();
196 GpuCommandBufferStub* stub =
197 channel->LookupCommandBuffer(command_buffer_id_);
198 if (!stub)
199 return NULL;
200
201 return stub->scheduler();
202 } 179 }
203 180
204 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() { 181 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() {
205 GpuChannel* channel = manager_->LookupChannel(client_id_); 182 if (!stub_.get())
206 if (!channel)
207 return NULL; 183 return NULL;
208 184 return stub_->decoder();
209 GpuCommandBufferStub* stub =
210 channel->LookupCommandBuffer(command_buffer_id_);
211 if (!stub)
212 return NULL;
213
214 return stub->decoder();
215 } 185 }
216 186
217 PassThroughImageTransportSurface::PassThroughImageTransportSurface( 187 PassThroughImageTransportSurface::PassThroughImageTransportSurface(
218 GpuChannelManager* manager, 188 GpuChannelManager* manager,
219 int32 render_view_id, 189 GpuCommandBufferStub* stub,
220 int32 client_id,
221 int32 command_buffer_id,
222 gfx::GLSurface* surface) : GLSurfaceAdapter(surface) { 190 gfx::GLSurface* surface) : GLSurfaceAdapter(surface) {
223 helper_.reset(new ImageTransportHelper(this, 191 helper_.reset(new ImageTransportHelper(this,
224 manager, 192 manager,
225 render_view_id, 193 stub,
226 client_id,
227 command_buffer_id,
228 gfx::kNullPluginWindow)); 194 gfx::kNullPluginWindow));
229 } 195 }
230 196
231 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() { 197 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {
232 } 198 }
233 199
234 bool PassThroughImageTransportSurface::Initialize() { 200 bool PassThroughImageTransportSurface::Initialize() {
235 // The surface is assumed to have already been initialized. 201 // The surface is assumed to have already been initialized.
236 return helper_->Initialize(); 202 return helper_->Initialize();
237 } 203 }
238 204
239 void PassThroughImageTransportSurface::Destroy() { 205 void PassThroughImageTransportSurface::Destroy() {
240 helper_->Destroy(); 206 helper_->Destroy();
241 GLSurfaceAdapter::Destroy(); 207 GLSurfaceAdapter::Destroy();
242 } 208 }
243 209
244 void PassThroughImageTransportSurface::OnNewSurfaceACK( 210 void PassThroughImageTransportSurface::OnNewSurfaceACK(
245 uint64 surface_id, TransportDIB::Handle surface_handle) { 211 uint64 surface_handle, TransportDIB::Handle shm_handle) {
246 } 212 }
247 213
248 bool PassThroughImageTransportSurface::SwapBuffers() { 214 bool PassThroughImageTransportSurface::SwapBuffers() {
249 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); 215 bool result = gfx::GLSurfaceAdapter::SwapBuffers();
250 216
251 // Round trip to the browser UI thread, for throttling, by sending a dummy 217 // Round trip to the browser UI thread, for throttling, by sending a dummy
252 // SwapBuffers message. 218 // SwapBuffers message.
253 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 219 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
254 params.surface_id = 0; 220 params.surface_handle = 0;
255 #if defined(OS_WIN) 221 #if defined(OS_WIN)
256 params.size = GetSize(); 222 params.size = GetSize();
257 #endif 223 #endif
258 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 224 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
259 225
260 helper_->SetScheduled(false); 226 helper_->SetScheduled(false);
261 return result; 227 return result;
262 } 228 }
263 229
264 bool PassThroughImageTransportSurface::PostSubBuffer( 230 bool PassThroughImageTransportSurface::PostSubBuffer(
265 int x, int y, int width, int height) { 231 int x, int y, int width, int height) {
266 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); 232 bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height);
267 233
268 // Round trip to the browser UI thread, for throttling, by sending a dummy 234 // Round trip to the browser UI thread, for throttling, by sending a dummy
269 // PostSubBuffer message. 235 // PostSubBuffer message.
270 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; 236 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
271 params.surface_id = 0; 237 params.surface_handle = 0;
272 params.x = x; 238 params.x = x;
273 params.y = y; 239 params.y = y;
274 params.width = width; 240 params.width = width;
275 params.height = height; 241 params.height = height;
276 helper_->SendAcceleratedSurfacePostSubBuffer(params); 242 helper_->SendAcceleratedSurfacePostSubBuffer(params);
277 243
278 helper_->SetScheduled(false); 244 helper_->SetScheduled(false);
279 return result; 245 return result;
280 } 246 }
281 247
282 void PassThroughImageTransportSurface::OnBuffersSwappedACK() { 248 void PassThroughImageTransportSurface::OnBuffersSwappedACK() {
283 helper_->SetScheduled(true); 249 helper_->SetScheduled(true);
284 } 250 }
285 251
286 void PassThroughImageTransportSurface::OnPostSubBufferACK() { 252 void PassThroughImageTransportSurface::OnPostSubBufferACK() {
287 helper_->SetScheduled(true); 253 helper_->SetScheduled(true);
288 } 254 }
289 255
290 void PassThroughImageTransportSurface::OnResizeViewACK() { 256 void PassThroughImageTransportSurface::OnResizeViewACK() {
291 helper_->SetScheduled(true); 257 helper_->SetScheduled(true);
292 } 258 }
293 259
294 void PassThroughImageTransportSurface::OnResize(gfx::Size size) { 260 void PassThroughImageTransportSurface::OnResize(gfx::Size size) {
295 helper_->SendResizeView(size); 261 helper_->SendResizeView(size);
296 helper_->SetScheduled(false); 262 helper_->SetScheduled(false);
297 } 263 }
298 264
299 #endif // defined(ENABLE_GPU) 265 #endif // defined(ENABLE_GPU)
OLDNEW
« no previous file with comments | « content/common/gpu/image_transport_surface.h ('k') | content/common/gpu/image_transport_surface_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698