| Index: webkit/plugins/ppapi/ppb_surface_3d_impl.cc
|
| diff --git a/webkit/plugins/ppapi/ppb_surface_3d_impl.cc b/webkit/plugins/ppapi/ppb_surface_3d_impl.cc
|
| index 0283d3b47c59bc270ea6530e835b595e4e3a9b96..5b42cf926c030e6d286dae06ba569d4555870ce4 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() {
|
|
|