diff options
author | Brian Paul <[email protected]> | 2006-05-20 15:07:32 +0000 |
---|---|---|
committer | Brian Paul <[email protected]> | 2006-05-20 15:07:32 +0000 |
commit | b52f02121bdfc68fbbba732f3d107c296f03d885 (patch) | |
tree | 0f0055dca4e77f14b47dccb8ae4ad1424c035dac | |
parent | 2eb88c1752f3c2f2f858415a89fdfc96e6669fc8 (diff) |
Added _mesa_remove_renderbuffer() as a counterpart to _mesa_add_renderbuffer().
Added _mesa_dereference_renderbuffer() to encapsulate renderbuffer
reference count decrement, delete, locking.
-rw-r--r-- | src/mesa/main/renderbuffer.c | 51 | ||||
-rw-r--r-- | src/mesa/main/renderbuffer.h | 5 |
2 files changed, 55 insertions, 1 deletions
diff --git a/src/mesa/main/renderbuffer.c b/src/mesa/main/renderbuffer.c index 0999ed59544..6b18d60baff 100644 --- a/src/mesa/main/renderbuffer.c +++ b/src/mesa/main/renderbuffer.c @@ -1511,7 +1511,7 @@ _mesa_new_renderbuffer(GLcontext *ctx, GLuint name) /** * Delete a gl_framebuffer. - * This is the default function for framebuffer->Delete(). + * This is the default function for renderbuffer->Delete(). */ void _mesa_delete_renderbuffer(struct gl_renderbuffer *rb) @@ -2070,10 +2070,59 @@ _mesa_add_renderbuffer(struct gl_framebuffer *fb, fb->Attachment[bufferName].Type = GL_RENDERBUFFER_EXT; fb->Attachment[bufferName].Complete = GL_TRUE; fb->Attachment[bufferName].Renderbuffer = rb; + + rb->RefCount++; +} + + +/** + * Remove the named renderbuffer from the given framebuffer. + */ +void +_mesa_remove_renderbuffer(struct gl_framebuffer *fb, GLuint bufferName) +{ + struct gl_renderbuffer *rb; + + assert(bufferName < BUFFER_COUNT); + + rb = fb->Attachment[bufferName].Renderbuffer; + if (!rb) + return; + + _mesa_dereference_renderbuffer(&rb); + + fb->Attachment[bufferName].Renderbuffer = NULL; } /** + * Decrement the reference count on a renderbuffer and delete it when + * the refcount hits zero. + * Note: we pass the address of a pointer and set it to NULL if we delete it. + */ +void +_mesa_dereference_renderbuffer(struct gl_renderbuffer **rb) +{ + GLboolean deleteFlag = GL_FALSE; + + _glthread_LOCK_MUTEX((*rb)->Mutex); + { + ASSERT((*rb)->RefCount > 0); + (*rb)->RefCount--; + deleteFlag = ((*rb)->RefCount == 0); + } + _glthread_UNLOCK_MUTEX((*rb)->Mutex); + + if (deleteFlag) { + (*rb)->Delete(*rb); + *rb = NULL; + } +} + + + + +/** * Create a new combined depth/stencil renderbuffer for implementing * the GL_EXT_packed_depth_stencil extension. * \return new depth/stencil renderbuffer diff --git a/src/mesa/main/renderbuffer.h b/src/mesa/main/renderbuffer.h index d8358e213cb..74ca43c57ab 100644 --- a/src/mesa/main/renderbuffer.h +++ b/src/mesa/main/renderbuffer.h @@ -95,6 +95,11 @@ extern void _mesa_add_renderbuffer(struct gl_framebuffer *fb, GLuint bufferName, struct gl_renderbuffer *rb); +extern void +_mesa_remove_renderbuffer(struct gl_framebuffer *fb, GLuint bufferName); + +extern void +_mesa_dereference_renderbuffer(struct gl_renderbuffer **rb); extern struct gl_renderbuffer * _mesa_new_depthstencil_renderbuffer(GLcontext *ctx, GLuint name); |