Bug 1326376 - Using BlitTextureToFramebuffer() when the sizes are different; r?jgilbert
MozReview-Commit-ID: Lh3IyXm91Ur
--- 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;