mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-02 19:40:26 +01:00
mesa: fix some renderbuffer/framebuffer delete semantics
Need to unbind buffers if referenced by the current read/draw pointers when being deleted.
This commit is contained in:
parent
3059007f0c
commit
d0f13fa7d7
1 changed files with 33 additions and 1 deletions
|
|
@ -683,6 +683,26 @@ _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.
|
||||
*/
|
||||
static void
|
||||
detach_renderbuffer(GLcontext *ctx,
|
||||
struct gl_framebuffer *fb,
|
||||
struct gl_renderbuffer *rb)
|
||||
{
|
||||
GLuint i;
|
||||
for (i = 0; i < BUFFER_COUNT; i++) {
|
||||
if (fb->Attachment[i].Renderbuffer == rb) {
|
||||
_mesa_remove_attachment(ctx, &fb->Attachment[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
|
||||
{
|
||||
|
|
@ -704,6 +724,13 @@ _mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
|
|||
_mesa_BindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
|
||||
}
|
||||
|
||||
if (ctx->DrawBuffer->Name) {
|
||||
detach_renderbuffer(ctx, ctx->DrawBuffer, rb);
|
||||
}
|
||||
if (ctx->ReadBuffer->Name && ctx->ReadBuffer != ctx->DrawBuffer) {
|
||||
detach_renderbuffer(ctx, ctx->ReadBuffer, rb);
|
||||
}
|
||||
|
||||
/* Remove from hash table immediately, to free the ID.
|
||||
* But the object will not be freed until it's no longer
|
||||
* referenced anywhere else.
|
||||
|
|
@ -1201,7 +1228,12 @@ _mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
|
|||
if (fb == ctx->DrawBuffer) {
|
||||
/* bind default */
|
||||
ASSERT(fb->RefCount >= 2);
|
||||
_mesa_BindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
_mesa_BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
|
||||
}
|
||||
if (fb == ctx->ReadBuffer) {
|
||||
/* bind default */
|
||||
ASSERT(fb->RefCount >= 2);
|
||||
_mesa_BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
|
||||
}
|
||||
|
||||
/* remove from hash table immediately, to free the ID */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue