Chromium Code Reviews| Index: content/browser/gpu/gpu_process_host.cc |
| diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc |
| index 6e3b4390d7725d9f150e8ee7c55d9330b6a3c24f..679caf69bc648b2ad61057ca448b7fe4d7a55026 100644 |
| --- a/content/browser/gpu/gpu_process_host.cc |
| +++ b/content/browser/gpu/gpu_process_host.cc |
| @@ -852,39 +852,43 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( |
| gfx::AcceleratedWidget native_widget = |
| GpuSurfaceTracker::Get()->AcquireNativeWidget(params.surface_id); |
| - if (native_widget) { |
| - RenderWidgetHelper::OnNativeSurfaceBuffersSwappedOnIOThread(this, params); |
| - return; |
| - } |
| - gfx::GLSurfaceHandle surface_handle = |
| - GpuSurfaceTracker::Get()->GetSurfaceHandle(params.surface_id); |
| - // Compositor window is always gfx::kNullPluginWindow. |
| - // TODO(jbates) http://crbug.com/105344 This will be removed when there are no |
| - // plugin windows. |
| - if (surface_handle.handle != gfx::kNullPluginWindow || |
| - surface_handle.transport_type == gfx::TEXTURE_TRANSPORT) { |
| - RouteOnUIThread(GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); |
| - return; |
| + // Retrieve the render widget helper to forward this message to on the UI |
| + // thread. |
| + RenderWidgetHelper* helper = NULL; |
| + int render_widget_id = 0; |
| + if (native_widget) { |
| + int render_process_id = 0; |
| + if (RenderWidgetHelper::GetRenderWidgetIDForWidget( |
| + native_widget, &render_process_id, &render_widget_id)) { |
|
piman
2014/07/07 18:27:43
Why do we need this? What's different with the ren
ccameron
2014/07/07 18:45:23
The surface was created for the browser, so it doe
piman
2014/07/07 19:40:56
I'm worried about races (lookup is done on the IO
|
| + helper = RenderWidgetHelper::FromProcessHostID(render_process_id); |
| + } |
| + } else { |
| + int render_process_id = 0; |
| + if (GpuSurfaceTracker::Get()->GetRenderWidgetIDForSurface( |
| + params.surface_id, &render_process_id, &render_widget_id)) { |
| + helper = RenderWidgetHelper::FromProcessHostID(render_process_id); |
| + } |
| } |
| - AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
| - ack_params.sync_point = 0; |
| - |
| - int render_process_id = 0; |
| - int render_widget_id = 0; |
| - if (!GpuSurfaceTracker::Get()->GetRenderWidgetIDForSurface( |
| - params.surface_id, &render_process_id, &render_widget_id)) { |
| + // If this is not targetting a native widget and we don't find a helper, then |
| + // ack immediately and ignore the message. |
| + if (!helper && !native_widget) { |
| + AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
| + ack_params.sync_point = 0; |
| Send(new AcceleratedSurfaceMsg_BufferPresented(params.route_id, |
| ack_params)); |
| return; |
| } |
| - RenderWidgetHelper* helper = |
| - RenderWidgetHelper::FromProcessHostID(render_process_id); |
| - if (!helper) { |
| + |
| + // If this is targetting a native widget, then ack the swap immediately to |
| + // avoid introducing a deadlock between the browser and GPU processes (rate |
| + // limiting is done through the compositor). |
| + if (native_widget) { |
| + AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
| + ack_params.sync_point = 0; |
| Send(new AcceleratedSurfaceMsg_BufferPresented(params.route_id, |
| ack_params)); |
| - return; |
| } |
| // Pass the SwapBuffers on to the RenderWidgetHelper to wake up the UI thread |
| @@ -892,6 +896,7 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( |
| // will forward to the RenderWidgetHostView via RenderProcessHostImpl and |
| // RenderWidgetHostImpl. |
| ViewHostMsg_CompositorSurfaceBuffersSwapped_Params view_params; |
| + view_params.use_native_widget = native_widget; |
| view_params.surface_id = params.surface_id; |
| view_params.surface_handle = params.surface_handle; |
| view_params.route_id = params.route_id; |
| @@ -899,9 +904,18 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( |
| view_params.scale_factor = params.scale_factor; |
| view_params.gpu_process_host_id = host_id_; |
| view_params.latency_info = params.latency_info; |
| - helper->DidReceiveBackingStoreMsg(ViewHostMsg_CompositorSurfaceBuffersSwapped( |
| - render_widget_id, |
| - view_params)); |
| + if (helper) { |
| + helper->DidReceiveBackingStoreMsg( |
| + ViewHostMsg_CompositorSurfaceBuffersSwapped( |
| + render_widget_id, |
| + view_params)); |
| + } else if (native_widget) { |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&RenderWidgetHelper::OnNativeSurfaceBuffersSwappedOnUIThread, |
| + view_params)); |
| + } |
| } |
| #endif // OS_MACOSX |