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

Side by Side Diff: content/browser/gpu/gpu_process_host_ui_shim.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 #include "content/browser/gpu/gpu_process_host_ui_shim.h" 5 #include "content/browser/gpu/gpu_process_host_ui_shim.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
11 #include "base/id_map.h" 11 #include "base/id_map.h"
12 #include "base/lazy_instance.h" 12 #include "base/lazy_instance.h"
13 #include "base/process_util.h" 13 #include "base/process_util.h"
14 #include "content/browser/gpu/gpu_data_manager.h" 14 #include "content/browser/gpu/gpu_data_manager.h"
15 #include "content/browser/gpu/gpu_process_host.h" 15 #include "content/browser/gpu/gpu_process_host.h"
16 #include "content/browser/gpu/gpu_surface_tracker.h"
16 #include "content/browser/renderer_host/render_process_host_impl.h" 17 #include "content/browser/renderer_host/render_process_host_impl.h"
17 #include "content/browser/renderer_host/render_view_host.h" 18 #include "content/browser/renderer_host/render_view_host.h"
18 #include "content/browser/renderer_host/render_widget_host_view.h" 19 #include "content/browser/renderer_host/render_widget_host_view.h"
19 #include "content/common/gpu/gpu_messages.h" 20 #include "content/common/gpu/gpu_messages.h"
20 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/browser_thread.h"
21 22
22 #if defined(TOOLKIT_USES_GTK) 23 #if defined(TOOLKIT_USES_GTK)
23 // These two #includes need to come after gpu_messages.h. 24 // These two #includes need to come after gpu_messages.h.
24 #include "ui/base/x/x11_util.h" 25 #include "ui/base/x/x11_util.h"
25 #include "ui/gfx/size.h" 26 #include "ui/gfx/size.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 } 67 }
67 68
68 void Cancel() { cancelled_ = true; } 69 void Cancel() { cancelled_ = true; }
69 70
70 private: 71 private:
71 int host_id_; 72 int host_id_;
72 scoped_ptr<IPC::Message> msg_; 73 scoped_ptr<IPC::Message> msg_;
73 bool cancelled_; 74 bool cancelled_;
74 }; 75 };
75 76
76 RenderWidgetHostView* GetRenderWidgetHostViewFromID(int render_process_id, 77 RenderWidgetHostView* GetRenderWidgetHostViewFromSurfaceID(int surface_id) {
77 int render_widget_id) { 78 int render_process_id = 0;
79 int render_widget_id = 0;
80 if (!GpuSurfaceTracker::Get()->GetRenderWidgetIDForSurface(
81 surface_id, &render_process_id, &render_widget_id))
82 return NULL;
83
78 content::RenderProcessHost* process = 84 content::RenderProcessHost* process =
79 content::RenderProcessHost::FromID(render_process_id); 85 content::RenderProcessHost::FromID(render_process_id);
80 if (!process) 86 if (!process)
81 return NULL; 87 return NULL;
82 88
83 RenderWidgetHost* host = static_cast<RenderWidgetHost*>( 89 RenderWidgetHost* host = static_cast<RenderWidgetHost*>(
84 process->GetListenerByID(render_widget_id)); 90 process->GetListenerByID(render_widget_id));
85 return host ? host->view() : NULL; 91 return host ? host->view() : NULL;
86 } 92 }
87 93
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 const content::GPUInfo& gpu_info) { 225 const content::GPUInfo& gpu_info) {
220 // OnGraphicsInfoCollected is sent back after the GPU process successfully 226 // OnGraphicsInfoCollected is sent back after the GPU process successfully
221 // initializes GL. 227 // initializes GL.
222 TRACE_EVENT0("test_gpu", "OnGraphicsInfoCollected"); 228 TRACE_EVENT0("test_gpu", "OnGraphicsInfoCollected");
223 229
224 GpuDataManager::GetInstance()->UpdateGpuInfo(gpu_info); 230 GpuDataManager::GetInstance()->UpdateGpuInfo(gpu_info);
225 } 231 }
226 232
227 #if defined(TOOLKIT_USES_GTK) || defined(OS_WIN) 233 #if defined(TOOLKIT_USES_GTK) || defined(OS_WIN)
228 234
229 void GpuProcessHostUIShim::OnResizeView(int32 client_id, 235 void GpuProcessHostUIShim::OnResizeView(int32 surface_id,
230 int32 render_view_id,
231 int32 route_id, 236 int32 route_id,
232 gfx::Size size) { 237 gfx::Size size) {
233 // Always respond even if the window no longer exists. The GPU process cannot 238 // Always respond even if the window no longer exists. The GPU process cannot
234 // make progress on the resizing command buffer until it receives the 239 // make progress on the resizing command buffer until it receives the
235 // response. 240 // response.
236 ScopedSendOnIOThread delayed_send( 241 ScopedSendOnIOThread delayed_send(
237 host_id_, 242 host_id_,
238 new AcceleratedSurfaceMsg_ResizeViewACK(route_id)); 243 new AcceleratedSurfaceMsg_ResizeViewACK(route_id));
239 244
240 RenderWidgetHostView* view = GetRenderWidgetHostViewFromID(client_id, 245 RenderWidgetHostView* view = GetRenderWidgetHostViewFromSurfaceID(surface_id);
241 render_view_id);
242 if (!view) 246 if (!view)
243 return; 247 return;
244 248
245 gfx::PluginWindowHandle handle = view->GetCompositingSurface(); 249 gfx::PluginWindowHandle handle = view->GetCompositingSurface();
246 250
247 // Resize the window synchronously. The GPU process must not issue GL 251 // Resize the window synchronously. The GPU process must not issue GL
248 // calls on the command buffer until the window is the size it expects it 252 // calls on the command buffer until the window is the size it expects it
249 // to be. 253 // to be.
250 #if defined(TOOLKIT_USES_GTK) 254 #if defined(TOOLKIT_USES_GTK)
251 GdkWindow* window = reinterpret_cast<GdkWindow*>( 255 GdkWindow* window = reinterpret_cast<GdkWindow*>(
(...skipping 19 matching lines...) Expand all
271 #endif 275 #endif
272 276
273 #if defined(OS_MACOSX) || defined(UI_COMPOSITOR_IMAGE_TRANSPORT) 277 #if defined(OS_MACOSX) || defined(UI_COMPOSITOR_IMAGE_TRANSPORT)
274 278
275 void GpuProcessHostUIShim::OnAcceleratedSurfaceNew( 279 void GpuProcessHostUIShim::OnAcceleratedSurfaceNew(
276 const GpuHostMsg_AcceleratedSurfaceNew_Params& params) { 280 const GpuHostMsg_AcceleratedSurfaceNew_Params& params) {
277 ScopedSendOnIOThread delayed_send( 281 ScopedSendOnIOThread delayed_send(
278 host_id_, 282 host_id_,
279 new AcceleratedSurfaceMsg_NewACK( 283 new AcceleratedSurfaceMsg_NewACK(
280 params.route_id, 284 params.route_id,
281 params.surface_id, 285 params.surface_handle,
282 TransportDIB::DefaultHandleValue())); 286 TransportDIB::DefaultHandleValue()));
283 287
284 RenderWidgetHostView* view = GetRenderWidgetHostViewFromID( 288 RenderWidgetHostView* view = GetRenderWidgetHostViewFromSurfaceID(
285 params.client_id, params.render_view_id); 289 params.surface_id);
286 if (!view) 290 if (!view)
287 return; 291 return;
288 292
289 uint64 surface_id = params.surface_id; 293 uint64 surface_handle = params.surface_handle;
290 TransportDIB::Handle surface_handle = TransportDIB::DefaultHandleValue(); 294 TransportDIB::Handle shm_handle = TransportDIB::DefaultHandleValue();
291 295
292 #if defined(OS_MACOSX) 296 #if defined(OS_MACOSX)
293 if (params.create_transport_dib) { 297 if (params.create_transport_dib) {
294 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); 298 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
295 if (shared_memory->CreateAnonymous(params.width * params.height * 4)) { 299 if (shared_memory->CreateAnonymous(params.width * params.height * 4)) {
296 // Create a local handle for RWHVMac to map the SHM. 300 // Create a local handle for RWHVMac to map the SHM.
297 TransportDIB::Handle local_handle; 301 TransportDIB::Handle local_handle;
298 if (!shared_memory->ShareToProcess(0 /* pid, not needed */, 302 if (!shared_memory->ShareToProcess(0 /* pid, not needed */,
299 &local_handle)) { 303 &local_handle)) {
300 return; 304 return;
301 } else { 305 } else {
302 view->AcceleratedSurfaceSetTransportDIB(params.window, 306 view->AcceleratedSurfaceSetTransportDIB(params.window,
303 params.width, 307 params.width,
304 params.height, 308 params.height,
305 local_handle); 309 local_handle);
306 // Create a remote handle for the GPU process to map the SHM. 310 // Create a remote handle for the GPU process to map the SHM.
307 if (!shared_memory->ShareToProcess(0 /* pid, not needed */, 311 if (!shared_memory->ShareToProcess(0 /* pid, not needed */,
308 &surface_handle)) { 312 &shm_handle)) {
309 return; 313 return;
310 } 314 }
311 } 315 }
312 } 316 }
313 } else { 317 } else {
314 view->AcceleratedSurfaceSetIOSurface(params.window, 318 view->AcceleratedSurfaceSetIOSurface(params.window,
315 params.width, 319 params.width,
316 params.height, 320 params.height,
317 surface_id); 321 surface_handle);
318 } 322 }
319 #else // defined(UI_COMPOSITOR_IMAGE_TRANSPORT) 323 #else // defined(UI_COMPOSITOR_IMAGE_TRANSPORT)
320 view->AcceleratedSurfaceNew( 324 view->AcceleratedSurfaceNew(
321 params.width, params.height, &surface_id, &surface_handle); 325 params.width, params.height, &surface_handle, &shm_handle);
322 #endif 326 #endif
323 delayed_send.Cancel(); 327 delayed_send.Cancel();
324 Send(new AcceleratedSurfaceMsg_NewACK( 328 Send(new AcceleratedSurfaceMsg_NewACK(
325 params.route_id, surface_id, surface_handle)); 329 params.route_id, surface_handle, shm_handle));
326 } 330 }
327 331
328 #endif 332 #endif
329 333
330 void GpuProcessHostUIShim::OnAcceleratedSurfaceBuffersSwapped( 334 void GpuProcessHostUIShim::OnAcceleratedSurfaceBuffersSwapped(
331 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { 335 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) {
332 TRACE_EVENT0("renderer", 336 TRACE_EVENT0("renderer",
333 "GpuProcessHostUIShim::OnAcceleratedSurfaceBuffersSwapped"); 337 "GpuProcessHostUIShim::OnAcceleratedSurfaceBuffersSwapped");
334 338
335 ScopedSendOnIOThread delayed_send( 339 ScopedSendOnIOThread delayed_send(
336 host_id_, 340 host_id_,
337 new AcceleratedSurfaceMsg_BuffersSwappedACK(params.route_id)); 341 new AcceleratedSurfaceMsg_BuffersSwappedACK(params.route_id));
338 342
339 RenderWidgetHostView* view = GetRenderWidgetHostViewFromID( 343 RenderWidgetHostView* view = GetRenderWidgetHostViewFromSurfaceID(
340 params.client_id, params.render_view_id); 344 params.surface_id);
341 if (!view) 345 if (!view)
342 return; 346 return;
343 347
344 delayed_send.Cancel(); 348 delayed_send.Cancel();
345 349
346 // View must send ACK message after next composite. 350 // View must send ACK message after next composite.
347 view->AcceleratedSurfaceBuffersSwapped(params, host_id_); 351 view->AcceleratedSurfaceBuffersSwapped(params, host_id_);
348 } 352 }
349 353
350 void GpuProcessHostUIShim::OnAcceleratedSurfacePostSubBuffer( 354 void GpuProcessHostUIShim::OnAcceleratedSurfacePostSubBuffer(
351 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params) { 355 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params) {
352 TRACE_EVENT0("renderer", 356 TRACE_EVENT0("renderer",
353 "GpuProcessHostUIShim::OnAcceleratedSurfacePostSubBuffer"); 357 "GpuProcessHostUIShim::OnAcceleratedSurfacePostSubBuffer");
354 358
355 ScopedSendOnIOThread delayed_send( 359 ScopedSendOnIOThread delayed_send(
356 host_id_, 360 host_id_,
357 new AcceleratedSurfaceMsg_PostSubBufferACK(params.route_id)); 361 new AcceleratedSurfaceMsg_PostSubBufferACK(params.route_id));
358 362
359 RenderWidgetHostView* view = GetRenderWidgetHostViewFromID( 363 RenderWidgetHostView* view = GetRenderWidgetHostViewFromSurfaceID(
360 params.client_id, params.render_view_id); 364 params.surface_id);
361 if (!view) 365 if (!view)
362 return; 366 return;
363 367
364 delayed_send.Cancel(); 368 delayed_send.Cancel();
365 369
366 // View must send ACK message after next composite. 370 // View must send ACK message after next composite.
367 view->AcceleratedSurfacePostSubBuffer(params, host_id_); 371 view->AcceleratedSurfacePostSubBuffer(params, host_id_);
368 } 372 }
369 373
370 #if defined(UI_COMPOSITOR_IMAGE_TRANSPORT) 374 #if defined(UI_COMPOSITOR_IMAGE_TRANSPORT)
371 375
372 void GpuProcessHostUIShim::OnAcceleratedSurfaceRelease( 376 void GpuProcessHostUIShim::OnAcceleratedSurfaceRelease(
373 const GpuHostMsg_AcceleratedSurfaceRelease_Params& params) { 377 const GpuHostMsg_AcceleratedSurfaceRelease_Params& params) {
374 RenderWidgetHostView* view = GetRenderWidgetHostViewFromID( 378 RenderWidgetHostView* view = GetRenderWidgetHostViewFromSurfaceID(
375 params.client_id, params.render_view_id); 379 params.surface_id);
376 if (!view) 380 if (!view)
377 return; 381 return;
378 view->AcceleratedSurfaceRelease(params.identifier); 382 view->AcceleratedSurfaceRelease(params.identifier);
379 } 383 }
380 384
381 #endif 385 #endif
OLDNEW
« no previous file with comments | « content/browser/gpu/gpu_process_host_ui_shim.h ('k') | content/browser/gpu/gpu_surface_tracker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698