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

Unified Diff: content/browser/gpu/gpu_process_host.cc

Issue 370513002: Mac ÜC: Make resize smooth (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@enable_uc_for_reals
Patch Set: Add comments Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698