Bug 1326376 - Using BlitTextureToFramebuffer() when the sizes are different; r?jgilbert draft
authorDaosheng Mu <daoshengmu@gmail.com>
Thu, 23 Mar 2017 17:00:04 +0800
changeset 503597 4b364a529fb2ec031ae1202a4acfeddcb56f5769
parent 503306 7513b3f42058e9bcf9950d4acf4647d4ad2240f0
child 550487 d9332206c7729e6d107100647ab15abbddefbbde
push id50639
push userbmo:dmu@mozilla.com
push dateThu, 23 Mar 2017 11:52:47 +0000
reviewersjgilbert
bugs1326376
milestone55.0a1
Bug 1326376 - Using BlitTextureToFramebuffer() when the sizes are different; r?jgilbert MozReview-Commit-ID: Lh3IyXm91Ur
gfx/gl/GLBlitHelper.cpp
gfx/layers/client/CanvasClient.cpp
--- a/gfx/gl/GLBlitHelper.cpp
+++ b/gfx/gl/GLBlitHelper.cpp
@@ -913,17 +913,18 @@ GLBlitHelper::BlitTextureToFramebuffer(G
                                        const gfx::IntSize& srcSize,
                                        const gfx::IntSize& destSize,
                                        GLenum srcTarget,
                                        bool internalFBs)
 {
     MOZ_ASSERT(mGL->fIsTexture(srcTex));
     MOZ_ASSERT(!destFB || mGL->fIsFramebuffer(destFB));
 
-    if (mGL->IsSupported(GLFeature::framebuffer_blit)) {
+    if (mGL->IsSupported(GLFeature::framebuffer_blit)
+        && (srcSize == destSize)) {
         ScopedFramebufferForTexture srcWrapper(mGL, srcTex, srcTarget);
         MOZ_DIAGNOSTIC_ASSERT(srcWrapper.IsComplete());
 
         BlitFramebufferToFramebuffer(srcWrapper.FB(), destFB,
                                      srcSize, destSize,
                                      internalFBs);
         return;
     }
--- a/gfx/layers/client/CanvasClient.cpp
+++ b/gfx/layers/client/CanvasClient.cpp
@@ -355,19 +355,19 @@ TexClientFromReadback(SharedSurface* src
   }
 
   return texClient.forget();
 }
 
 ////////////////////////////////////////
 
 static already_AddRefed<SharedSurfaceTextureClient>
-CloneSurface(gl::SharedSurface* src, gl::SurfaceFactory* factory)
+CloneSurface(gl::SharedSurface* src, const gfx::IntSize& aSize, gl::SurfaceFactory* factory)
 {
-    RefPtr<SharedSurfaceTextureClient> dest = factory->NewTexClient(src->mSize);
+    RefPtr<SharedSurfaceTextureClient> dest = factory->NewTexClient(aSize);
     if (!dest) {
       return nullptr;
     }
 
     gl::SharedSurface* destSurf = dest->Surf();
 
     destSurf->ProducerAcquire();
     SharedSurface::ProdCopy(src, dest->Surf(), factory);
@@ -405,31 +405,31 @@ CanvasClientSharedSurface::UpdateRendere
     asyncRenderer = aRenderer.ref<AsyncCanvasRenderer*>();
     gl = asyncRenderer->mGLContext;
   }
   gl->MakeCurrent();
 
   RefPtr<TextureClient> newFront;
 
   if (layer && layer->mGLFrontbuffer) {
-    mShSurfClient = CloneSurface(layer->mGLFrontbuffer.get(), layer->mFactory.get());
+    mShSurfClient = CloneSurface(layer->mGLFrontbuffer.get(), aSize, layer->mFactory.get());
     if (!mShSurfClient) {
       gfxCriticalError() << "Invalid canvas front buffer";
       return;
     }
   } else if (layer && layer->mIsMirror) {
-    mShSurfClient = CloneSurface(gl->Screen()->Front()->Surf(), layer->mFactory.get());
+    mShSurfClient = CloneSurface(gl->Screen()->Front()->Surf(), aSize, layer->mFactory.get());
     if (!mShSurfClient) {
       return;
     }
   } else {
     mShSurfClient = gl->Screen()->Front();
     if (mShSurfClient && mShSurfClient->GetAllocator() &&
         mShSurfClient->GetAllocator() != GetForwarder()->GetTextureForwarder()) {
-      mShSurfClient = CloneSurface(mShSurfClient->Surf(), gl->Screen()->Factory());
+      mShSurfClient = CloneSurface(mShSurfClient->Surf(), aSize, gl->Screen()->Factory());
     }
     if (!mShSurfClient) {
       return;
     }
   }
   MOZ_ASSERT(mShSurfClient);
 
   newFront = mShSurfClient;