diff --git a/libkwineffects/kwingltexture.h b/libkwineffects/kwingltexture.h --- a/libkwineffects/kwingltexture.h +++ b/libkwineffects/kwingltexture.h @@ -108,7 +108,6 @@ /** @short * Make the texture fully transparent - * Warning: this clobbers the current framebuffer binding except on fglrx */ void clear(); bool isDirty() const; diff --git a/libkwineffects/kwingltexture.cpp b/libkwineffects/kwingltexture.cpp --- a/libkwineffects/kwingltexture.cpp +++ b/libkwineffects/kwingltexture.cpp @@ -514,11 +514,15 @@ if (GLTexturePrivate::s_fbo) { // Clear the texture - glBindFramebuffer(GL_FRAMEBUFFER, GLTexturePrivate::s_fbo); + GLuint previousFramebuffer = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, reinterpret_cast(&previousFramebuffer)); + if (GLTexturePrivate::s_fbo != previousFramebuffer) + glBindFramebuffer(GL_FRAMEBUFFER, GLTexturePrivate::s_fbo); glClearColor(0, 0, 0, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, d->m_texture, 0); glClear(GL_COLOR_BUFFER_BIT); - glBindFramebuffer(GL_FRAMEBUFFER, 0); + if (GLTexturePrivate::s_fbo != previousFramebuffer) + glBindFramebuffer(GL_FRAMEBUFFER, previousFramebuffer); } else { if (const int size = width()*height()) { uint32_t *buffer = new uint32_t[size];