diff --git a/gfx/layers/opengl/TextureHostOGL.cpp b/gfx/layers/opengl/TextureHostOGL.cpp index 56b4168cfaf2..07b0dda42b9d 100644 --- a/gfx/layers/opengl/TextureHostOGL.cpp +++ b/gfx/layers/opengl/TextureHostOGL.cpp @@ -172,10 +172,7 @@ CompositableQuirksGonkOGL::CompositableQuirksGonkOGL() } CompositableQuirksGonkOGL::~CompositableQuirksGonkOGL() { - if (mTexture) { - gl()->MakeCurrent(); - gl()->fDeleteTextures(1, &mTexture); - } + DeleteTextureIfPresent(); } gl::GLContext* @@ -198,6 +195,15 @@ GLuint CompositableQuirksGonkOGL::GetTexture() return mTexture; } +void +CompositableQuirksGonkOGL::DeleteTextureIfPresent() +{ + if (mTexture) { + gl()->MakeCurrent(); + gl()->fDeleteTextures(1, &mTexture); + } +} + bool TextureImageTextureSourceOGL::Update(gfx::DataSourceSurface* aSurface, TextureFlags aFlags, @@ -500,6 +506,19 @@ TextureImageDeprecatedTextureHostOGL::UpdateImpl(const SurfaceDescriptor& aImage return; } +#ifdef MOZ_WIDGET_GONK + if (mQuirks) { + // on gonk, this class is used as a fallback from gralloc buffer. + // There is a case this class is used with GrallocDeprecatedTextureHostOGL + // under same CompositableHost. if it happens, a gralloc buffer of + // GrallocDeprecatedTextureHostOGL needs to be unbounded from a texture, + // when the gralloc buffer is not rendered. + // Establish the unbound by deleting the texture. + // See Bug 916264. + static_cast(mQuirks.get())->DeleteTextureIfPresent(); + } +#endif + AutoOpenSurface surf(OPEN_READ_ONLY, aImage); nsIntSize size = surf.Size(); TextureImage::ImageFormat format = surf.ImageFormat(); diff --git a/gfx/layers/opengl/TextureHostOGL.h b/gfx/layers/opengl/TextureHostOGL.h index 49925310bc28..18beaaa50dc3 100644 --- a/gfx/layers/opengl/TextureHostOGL.h +++ b/gfx/layers/opengl/TextureHostOGL.h @@ -71,6 +71,7 @@ public: virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE; GLuint GetTexture(); + void DeleteTextureIfPresent(); gl::GLContext* gl() const; protected: RefPtr mCompositor;