diff options
author | piman@google.com <piman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-05 01:18:59 +0000 |
---|---|---|
committer | piman@google.com <piman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-05 01:18:59 +0000 |
commit | cad37d275799e1d4761c5f192b134249c34a1c77 (patch) | |
tree | 9d441b1d79ea503563f8607f03d0692da566860a /webkit | |
parent | 783ffc7355af267f7dd6881f9f2436fbcd95b2a1 (diff) | |
download | chromium_src-cad37d275799e1d4761c5f192b134249c34a1c77.zip chromium_src-cad37d275799e1d4761c5f192b134249c34a1c77.tar.gz chromium_src-cad37d275799e1d4761c5f192b134249c34a1c77.tar.bz2 |
Make Graphics3D::SwapBuffers take a completion callback
BUG=none
TEST=with demo_simple_vertex_shader, rate control works
Review URL: http://codereview.chromium.org/5944001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@70474 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/plugins/ppapi/ppapi_plugin_instance.cc | 4 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_surface_3d_impl.cc | 35 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_surface_3d_impl.h | 9 |
3 files changed, 44 insertions, 4 deletions
diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc index 33e05fa..5147b32 100644 --- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc +++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc @@ -631,11 +631,15 @@ void PluginInstance::SetContentAreaFocus(bool has_focus) { void PluginInstance::ViewInitiatedPaint() { if (bound_graphics_2d()) bound_graphics_2d()->ViewInitiatedPaint(); + if (bound_graphics_3d()) + bound_graphics_3d()->ViewInitiatedPaint(); } void PluginInstance::ViewFlushedPaint() { if (bound_graphics_2d()) bound_graphics_2d()->ViewFlushedPaint(); + if (bound_graphics_3d()) + bound_graphics_3d()->ViewFlushedPaint(); } bool PluginInstance::GetBitmapForOptimizedPluginPaint( diff --git a/webkit/plugins/ppapi/ppb_surface_3d_impl.cc b/webkit/plugins/ppapi/ppb_surface_3d_impl.cc index 0283d3b..5b42cf9 100644 --- a/webkit/plugins/ppapi/ppb_surface_3d_impl.cc +++ b/webkit/plugins/ppapi/ppb_surface_3d_impl.cc @@ -51,7 +51,7 @@ int32_t SwapBuffers(PP_Resource surface_id, PP_CompletionCallback callback) { scoped_refptr<PPB_Surface3D_Impl> surface( Resource::GetAs<PPB_Surface3D_Impl>(surface_id)); - return surface->SwapBuffers(); + return surface->SwapBuffers(callback); } const PPB_Surface3D_Dev ppb_surface3d = { @@ -68,6 +68,8 @@ PPB_Surface3D_Impl::PPB_Surface3D_Impl(PluginInstance* instance) : Resource(instance->module()), instance_(instance), bound_to_instance_(false), + swap_initiated_(false), + swap_callback_(PP_BlockUntilComplete()), context_(NULL) { } @@ -121,8 +123,35 @@ bool PPB_Surface3D_Impl::BindToContext( return true; } -bool PPB_Surface3D_Impl::SwapBuffers() { - return context_ && context_->SwapBuffers(); +bool PPB_Surface3D_Impl::SwapBuffers(PP_CompletionCallback callback) { + if (!context_) + return false; + + if (swap_callback_.func) { + // Already a pending SwapBuffers that hasn't returned yet. + return false; + } + + swap_callback_ = callback; + return context_->SwapBuffers(); +} + +void PPB_Surface3D_Impl::ViewInitiatedPaint() { + if (swap_callback_.func) { + swap_initiated_ = true; + } +} + +void PPB_Surface3D_Impl::ViewFlushedPaint() { + if (swap_initiated_ && swap_callback_.func) { + // We must clear swap_callback_ before issuing the callback. It will be + // common for the plugin to issue another SwapBuffers in response to the + // callback, and we don't want to think that a callback is already pending. + PP_CompletionCallback callback = PP_BlockUntilComplete(); + std::swap(callback, swap_callback_); + swap_initiated_ = false; + PP_RunCompletionCallback(&callback, PP_OK); + } } unsigned int PPB_Surface3D_Impl::GetBackingTextureId() { diff --git a/webkit/plugins/ppapi/ppb_surface_3d_impl.h b/webkit/plugins/ppapi/ppb_surface_3d_impl.h index d09689e..0cd0643 100644 --- a/webkit/plugins/ppapi/ppb_surface_3d_impl.h +++ b/webkit/plugins/ppapi/ppb_surface_3d_impl.h @@ -49,7 +49,10 @@ class PPB_Surface3D_Impl : public Resource { unsigned int GetBackingTextureId(); - bool SwapBuffers(); + bool SwapBuffers(PP_CompletionCallback callback); + + void ViewInitiatedPaint(); + void ViewFlushedPaint(); private: // Called when SwapBuffers is complete. @@ -59,6 +62,10 @@ class PPB_Surface3D_Impl : public Resource { PluginInstance* instance_; bool bound_to_instance_; + // True when the page's SwapBuffers has been issued but not returned yet. + bool swap_initiated_; + PP_CompletionCallback swap_callback_; + // The context this surface is currently bound to. PluginDelegate::PlatformContext3D* context_; |