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..a7c3aa703d3acd057cb54484394b309f3a7b6f72 100644 |
--- a/content/browser/gpu/gpu_process_host.cc |
+++ b/content/browser/gpu/gpu_process_host.cc |
@@ -852,39 +852,49 @@ 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; |
+ // TODO(ccameron): The render process and widget IDs have a race between |
+ // the UI and the IO threads, and may potentially be wrong. Move the |
+ // functionality in RenderProcessHost::WaitForBackingStoreMsg to a place |
+ // where it can accept IPCs from all renderers (rather than this hack where |
+ // we fake the render process and widget ID of a renderer for the browser). |
+ // http://crbug.com/392031 |
+ if (RenderWidgetHelper::GetRenderWidgetIDForWidget( |
+ native_widget, &render_process_id, &render_widget_id)) { |
+ 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 +902,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 +910,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 |