Index: chrome/browser/gpu_process_host_ui_shim.cc |
diff --git a/chrome/browser/gpu_process_host_ui_shim.cc b/chrome/browser/gpu_process_host_ui_shim.cc |
index 04b535c6eb4be328ff595f8ae971aa0ec397f6a7..57ffcc7c4bd6b5169006b722ac51ac575ac3d4aa 100644 |
--- a/chrome/browser/gpu_process_host_ui_shim.cc |
+++ b/chrome/browser/gpu_process_host_ui_shim.cc |
@@ -211,44 +211,14 @@ void GpuProcessHostUIShim::CreateViewCommandBuffer( |
CreateCommandBufferCallback* callback) { |
DCHECK(CalledOnValidThread()); |
linked_ptr<CreateCommandBufferCallback> wrapped_callback(callback); |
+ ViewID view_id(renderer_id, render_view_id); |
+ scoped_refptr<ViewSurface> view_surface(new ViewSurface(view_id)); |
apatrick_chromium
2011/02/10 19:11:19
I can't see where reference counting is needed. Ca
jonathan.backer
2011/02/11 19:42:03
Done. I ref count to add to the map.
|
- gfx::PluginWindowHandle window = gfx::kNullPluginWindow; |
- RenderProcessHost* process = RenderProcessHost::FromID(renderer_id); |
- RenderWidgetHost* host = NULL; |
- if (process) { |
- host = static_cast<RenderWidgetHost*>( |
- process->GetListenerByID(render_view_id)); |
- } |
- |
- RenderWidgetHostView* view = NULL; |
- if (host) |
- view = host->view(); |
- |
- if (view) { |
-#if defined(OS_LINUX) |
- gfx::NativeViewId view_id = NULL; |
- view_id = gfx::IdFromNativeView(view->GetNativeView()); |
- |
- // Lock the window that we will draw into. |
- GtkNativeViewManager* manager = GtkNativeViewManager::GetInstance(); |
- if (!manager->GetPermanentXIDForId(&window, view_id)) { |
- DLOG(ERROR) << "Can't find XID for view id " << view_id; |
- } |
-#elif defined(OS_MACOSX) |
- // On Mac OS X we currently pass a (fake) PluginWindowHandle for the |
- // window that we draw to. |
- window = view->AllocateFakePluginWindowHandle( |
- /*opaque=*/true, /*root=*/true); |
-#elif defined(OS_WIN) |
- // Create a window that we will overlay. |
- window = view->GetCompositorHostWindow(); |
-#endif |
- } |
- |
- if (window != gfx::kNullPluginWindow && |
+ if (view_surface->surface() != gfx::kNullPluginWindow && |
Send(new GpuMsg_CreateViewCommandBuffer( |
- window, render_view_id, renderer_id, init_params))) { |
+ view_surface->surface(), render_view_id, renderer_id, init_params))) { |
create_command_buffer_requests_.push(wrapped_callback); |
+ acquired_surfaces_[view_id] = view_surface; |
apatrick_chromium
2011/02/10 19:11:19
Is it safe to assume that there will be only one r
jonathan.backer
2011/02/11 19:42:03
To my knowledge, only the compositor creates a Vie
|
} else { |
CreateCommandBufferError(wrapped_callback.release(), MSG_ROUTING_NONE); |
} |
@@ -369,31 +339,8 @@ void GpuProcessHostUIShim::OnCommandBufferCreated(const int32 route_id) { |
void GpuProcessHostUIShim::OnDestroyCommandBuffer( |
gfx::PluginWindowHandle window, int32 renderer_id, |
int32 render_view_id) { |
- if (!window) |
- return; |
- |
-#if defined(OS_LINUX) |
- GtkNativeViewManager* manager = GtkNativeViewManager::GetInstance(); |
- manager->ReleasePermanentXID(window); |
-#elif defined(OS_MACOSX) || defined(OS_WIN) |
- RenderProcessHost* process = RenderProcessHost::FromID(renderer_id); |
- RenderWidgetHost* host = NULL; |
- if (process) { |
- host = static_cast<RenderWidgetHost*>( |
- process->GetListenerByID(render_view_id)); |
- } |
- RenderWidgetHostView* view = NULL; |
- if (host) |
- view = host->view(); |
- |
- if (view) { |
-#if defined(OS_MACOSX) |
- view->DestroyFakePluginWindowHandle(window); |
-#elif defined(OS_WIN) |
- view->ShowCompositorHostWindow(false); |
-#endif |
- } |
-#endif // defined(OS_MACOSX) || defined(OS_WIN) |
+ ViewID view_id(renderer_id, render_view_id); |
+ acquired_surfaces_.erase(view_id); |
} |
void GpuProcessHostUIShim::OnGraphicsInfoCollected(const GPUInfo& gpu_info) { |
@@ -495,3 +442,39 @@ bool GpuProcessHostUIShim::LoadGpuBlacklist() { |
gpu_blacklist_.reset(NULL); |
return false; |
} |
+ |
+GpuProcessHostUIShim::ViewSurface::ViewSurface(ViewID view_id) |
+ : view_id_(view_id), surface_(gfx::kNullPluginWindow) { |
+ RenderWidgetHostView* view = GetRenderWidgetHostView(); |
+ if (view) |
+ surface_ = view->AcquireCompositingSurface(); |
+} |
+ |
+GpuProcessHostUIShim::ViewSurface::~ViewSurface() { |
+ if (!surface_) |
+ return; |
+ |
+ RenderWidgetHostView* view = GetRenderWidgetHostView(); |
+ if (view) |
+ view->ReleaseCompositingSurface(surface_); |
+} |
+ |
+// We do separate lookups for the RenderWidgetHostView when acquiring |
+// and releasing surfaces (rather than caching) because the |
+// RenderWidgetHostView could die without warning. In such a case, |
+// it's the RenderWidgetHostView's responsibility to cleanup. |
+RenderWidgetHostView* GpuProcessHostUIShim::ViewSurface:: |
+ GetRenderWidgetHostView() { |
+ RenderProcessHost* process = RenderProcessHost::FromID(view_id_.first); |
+ RenderWidgetHost* host = NULL; |
+ if (process) { |
+ host = static_cast<RenderWidgetHost*>( |
apatrick_chromium
2011/02/10 19:11:19
If the browser process does not trust the renderer
jonathan.backer
2011/02/11 19:42:03
I'm not disagreeing with you, but this is done els
|
+ process->GetListenerByID(view_id_.second)); |
+ } |
+ |
+ RenderWidgetHostView* view = NULL; |
+ if (host) |
+ view = host->view(); |
+ |
+ return view; |
+} |