Index: content/browser/renderer_host/render_widget_helper_mac.mm |
diff --git a/content/browser/renderer_host/render_widget_helper_mac.mm b/content/browser/renderer_host/render_widget_helper_mac.mm |
index 1a1725d70b123d32f51118e0fa74887565030a9a..f0d94f43f387ece29c2c2d621016f25bfcaf2bf7 100644 |
--- a/content/browser/renderer_host/render_widget_helper_mac.mm |
+++ b/content/browser/renderer_host/render_widget_helper_mac.mm |
@@ -8,17 +8,61 @@ |
#include <IOSurface/IOSurfaceAPI.h> |
#include "base/bind.h" |
+#include "base/lazy_instance.h" |
+#include "base/synchronization/lock.h" |
#include "content/browser/compositor/browser_compositor_view_mac.h" |
#include "content/browser/gpu/gpu_process_host.h" |
#include "content/browser/gpu/gpu_surface_tracker.h" |
#include "content/common/gpu/gpu_messages.h" |
#include "content/common/gpu/surface_handle_types_mac.h" |
+#include "content/common/view_messages.h" |
+namespace content { |
namespace { |
+typedef std::map<gfx::AcceleratedWidget,std::pair<int,int>> WidgetMap; |
+base::LazyInstance<WidgetMap> g_widget_map; |
+base::LazyInstance<base::Lock> g_lock; |
+} // namespace |
+ |
+// static |
+void RenderWidgetHelper::SetRenderWidgetIDForWidget( |
+ gfx::AcceleratedWidget native_widget, |
+ int render_process_id, |
+ int render_widget_id) { |
+ base::AutoLock lock(g_lock.Get()); |
+ g_widget_map.Get()[native_widget] = std::make_pair( |
+ render_process_id, render_widget_id); |
+} |
+ |
+// static |
+void RenderWidgetHelper::ResetRenderWidgetIDForWidget( |
+ gfx::AcceleratedWidget native_widget) { |
+ base::AutoLock lock(g_lock.Get()); |
+ g_widget_map.Get().erase(native_widget); |
+} |
+ |
+// static |
+bool RenderWidgetHelper::GetRenderWidgetIDForWidget( |
+ gfx::AcceleratedWidget native_widget, |
+ int* render_process_id, |
+ int* render_widget_id) { |
+ base::AutoLock lock(g_lock.Get()); |
+ |
+ auto found = g_widget_map.Get().find(native_widget); |
+ if (found != g_widget_map.Get().end()) { |
+ *render_process_id = found->second.first; |
+ *render_widget_id = found->second.second; |
+ return true; |
+ } |
+ |
+ *render_process_id = 0; |
+ *render_widget_id = 0; |
+ return false; |
+} |
-void OnNativeSurfaceBuffersSwappedOnUIThread( |
- base::ScopedCFTypeRef<IOSurfaceRef> io_surface, |
- const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { |
+// static |
+void RenderWidgetHelper::OnNativeSurfaceBuffersSwappedOnUIThread( |
+ const ViewHostMsg_CompositorSurfaceBuffersSwapped_Params& params) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
gfx::AcceleratedWidget native_widget = |
content::GpuSurfaceTracker::Get()->AcquireNativeWidget(params.surface_id); |
@@ -31,36 +75,4 @@ void OnNativeSurfaceBuffersSwappedOnUIThread( |
withScaleFactor:params.scale_factor]; |
} |
-} // namespace |
- |
-namespace content { |
- |
-void RenderWidgetHelper::OnNativeSurfaceBuffersSwappedOnIOThread( |
- GpuProcessHost* gpu_process_host, |
- const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- // Immediately acknowledge this frame on the IO thread instead of the UI |
- // thread. The UI thread will wait on the GPU process. If the UI thread |
- // were to be responsible for acking swaps, then there would be a cycle |
- // and a potential deadlock. |
- // TODO(ccameron): This immediate ack circumvents GPU back-pressure that |
- // is necessary to throttle renderers. Fix that. |
- AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
- ack_params.sync_point = 0; |
- ack_params.renderer_id = 0; |
- gpu_process_host->Send(new AcceleratedSurfaceMsg_BufferPresented( |
- params.route_id, ack_params)); |
- |
- // Open the IOSurface handle before returning, to ensure that it is not |
- // closed as soon as the frame is acknowledged. |
- base::ScopedCFTypeRef<IOSurfaceRef> io_surface(IOSurfaceLookup( |
- static_cast<uint32>(params.surface_handle))); |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&OnNativeSurfaceBuffersSwappedOnUIThread, io_surface, params)); |
-} |
- |
} // namespace content |