| 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
|
|
|
|
|