diff options
author | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-27 19:21:55 +0000 |
---|---|---|
committer | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-27 19:21:55 +0000 |
commit | 2d7c85529b0210e148d70eb3d0edf485d6521708 (patch) | |
tree | 59152cec5d13a4f91b88ffa8610ca9a82f4fdcce /content/browser/renderer_host/render_widget_helper.h | |
parent | be16cf2bcf61a6ac255c347a6ba8c65d213a5a11 (diff) | |
download | chromium_src-2d7c85529b0210e148d70eb3d0edf485d6521708.zip chromium_src-2d7c85529b0210e148d70eb3d0edf485d6521708.tar.gz chromium_src-2d7c85529b0210e148d70eb3d0edf485d6521708.tar.bz2 |
GPU compositing surface handle is no longer sent to renderer process.
Instead it is stored in a map in RenderWidgetHelper indexed by RenderWidgetHost route ID. This allows the UI thread to maintain the mapping as windows are created and destroyed and the IO thread to lookup the mapping in order to create GL contexts that render to the windows.
This avoids a race where JavaScript would open a popup window and immediately try to use an accelerated canvas to render to it (2D canvas or WebGL canvas). <-- This is no longer true of this patch. There was a potential deadlock.
WebGL canvas used to work in this case only because it would fall back to using ReadPixels.
This goes some way to fixing the bug referenced below but does not fix it completely.BUG=80703
Review URL: http://codereview.chromium.org/7136001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90617 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/render_widget_helper.h')
-rw-r--r-- | content/browser/renderer_host/render_widget_helper.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/content/browser/renderer_host/render_widget_helper.h b/content/browser/renderer_host/render_widget_helper.h index 0c7f695..cab0947 100644 --- a/content/browser/renderer_host/render_widget_helper.h +++ b/content/browser/renderer_host/render_widget_helper.h @@ -16,6 +16,7 @@ #include "base/synchronization/waitable_event.h" #include "content/common/window_container_type.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h" +#include "ui/gfx/native_widget_types.h" #include "ui/gfx/surface/transport_dib.h" namespace IPC { @@ -117,6 +118,10 @@ class RenderWidgetHelper TransportDIB* MapTransportDIB(TransportDIB::Id dib_id); #endif + // Set a mapping from a RenderWidgetHost to a compositing surface. Pass a null + // handle to remove the mapping. + void SetCompositingSurface(int render_widget_id, + gfx::PluginWindowHandle compositing_surface); // IO THREAD ONLY ----------------------------------------------------------- @@ -145,6 +150,9 @@ class RenderWidgetHelper void FreeTransportDIB(TransportDIB::Id dib_id); #endif + // Lookup the compositing surface corresponding to a widget ID. + gfx::PluginWindowHandle LookupCompositingSurface(int render_widget_id); + private: // A class used to proxy a paint message. PaintMsgProxy objects are created // on the IO thread and destroyed on the UI thread. @@ -200,6 +208,11 @@ class RenderWidgetHelper UpdateMsgProxyMap pending_paints_; base::Lock pending_paints_lock_; + // Maps from view ID to compositing surface. + typedef std::map<int, gfx::PluginWindowHandle> ViewCompositingSurfaceMap; + ViewCompositingSurfaceMap view_compositing_surface_map_; + base::Lock view_compositing_surface_map_lock_; + int render_process_id_; // Event used to implement WaitForUpdateMsg. |