summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorpiman@google.com <piman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-05 01:18:59 +0000
committerpiman@google.com <piman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-05 01:18:59 +0000
commitcad37d275799e1d4761c5f192b134249c34a1c77 (patch)
tree9d441b1d79ea503563f8607f03d0692da566860a /webkit
parent783ffc7355af267f7dd6881f9f2436fbcd95b2a1 (diff)
downloadchromium_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.cc4
-rw-r--r--webkit/plugins/ppapi/ppb_surface_3d_impl.cc35
-rw-r--r--webkit/plugins/ppapi/ppb_surface_3d_impl.h9
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_;