diff options
-rw-r--r-- | src/mesa/main/fbobject.c | 26 | ||||
-rw-r--r-- | src/mesa/main/texobj.c | 42 |
2 files changed, 48 insertions, 20 deletions
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index f634cde961e..1034c7a712c 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -1223,10 +1223,8 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer) /** - * If the given renderbuffer is anywhere attached to the framebuffer, detach - * the renderbuffer. - * This is used when a renderbuffer object is deleted. - * The spec calls for unbinding. + * Remove the specified renderbuffer or texture from any attachment point in + * the framebuffer. * * \returns * \c true if the renderbuffer was detached from an attachment point. \c @@ -1241,7 +1239,8 @@ _mesa_detach_renderbuffer(struct gl_context *ctx, bool progress = false; for (i = 0; i < BUFFER_COUNT; i++) { - if (fb->Attachment[i].Renderbuffer == att) { + if (fb->Attachment[i].Texture == att + || fb->Attachment[i].Renderbuffer == att) { _mesa_remove_attachment(ctx, &fb->Attachment[i]); progress = true; } @@ -1286,6 +1285,23 @@ _mesa_DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers) _mesa_BindRenderbuffer(GL_RENDERBUFFER_EXT, 0); } + /* Section 4.4.2 (Attaching Images to Framebuffer Objects), + * subsection "Attaching Renderbuffer Images to a Framebuffer," of + * the OpenGL 3.1 spec says: + * + * "If a renderbuffer object is deleted while its image is + * attached to one or more attachment points in the currently + * bound framebuffer, then it is as if FramebufferRenderbuffer + * had been called, with a renderbuffer of 0, for each + * attachment point to which this image was attached in the + * currently bound framebuffer. In other words, this + * renderbuffer image is first detached from all attachment + * points in the currently bound framebuffer. Note that the + * renderbuffer image is specifically not detached from any + * non-bound framebuffers. Detaching the image from any + * non-bound framebuffers is the responsibility of the + * application. + */ if (_mesa_is_user_fbo(ctx->DrawBuffer)) { _mesa_detach_renderbuffer(ctx, ctx->DrawBuffer, rb); } diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 1666a66c127..7c8f04db966 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -1041,23 +1041,35 @@ static void unbind_texobj_from_fbo(struct gl_context *ctx, struct gl_texture_object *texObj) { - const GLuint n = (ctx->DrawBuffer == ctx->ReadBuffer) ? 1 : 2; - GLuint i; + bool progress = false; - for (i = 0; i < n; i++) { - struct gl_framebuffer *fb = (i == 0) ? ctx->DrawBuffer : ctx->ReadBuffer; - if (_mesa_is_user_fbo(fb)) { - GLuint j; - for (j = 0; j < BUFFER_COUNT; j++) { - if (fb->Attachment[j].Type == GL_TEXTURE && - fb->Attachment[j].Texture == texObj) { - /* Vertices are already flushed by _mesa_DeleteTextures */ - ctx->NewState |= _NEW_BUFFERS; - _mesa_remove_attachment(ctx, fb->Attachment + j); - } - } - } + /* Section 4.4.2 (Attaching Images to Framebuffer Objects), subsection + * "Attaching Texture Images to a Framebuffer," of the OpenGL 3.1 spec + * says: + * + * "If a texture object is deleted while its image is attached to one + * or more attachment points in the currently bound framebuffer, then + * it is as if FramebufferTexture* had been called, with a texture of + * zero, for each attachment point to which this image was attached in + * the currently bound framebuffer. In other words, this texture image + * is first detached from all attachment points in the currently bound + * framebuffer. Note that the texture image is specifically not + * detached from any other framebuffer objects. Detaching the texture + * image from any other framebuffer objects is the responsibility of + * the application." + */ + if (_mesa_is_user_fbo(ctx->DrawBuffer)) { + progress = _mesa_detach_renderbuffer(ctx, ctx->DrawBuffer, texObj); } + if (_mesa_is_user_fbo(ctx->ReadBuffer) + && ctx->ReadBuffer != ctx->DrawBuffer) { + progress = _mesa_detach_renderbuffer(ctx, ctx->ReadBuffer, texObj) + || progress; + } + + if (progress) + /* Vertices are already flushed by _mesa_DeleteTextures */ + ctx->NewState |= _NEW_BUFFERS; } |