diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2006-05-20 15:07:32 +0000 | 
|---|---|---|
| committer | Brian Paul <brian.paul@tungstengraphics.com> | 2006-05-20 15:07:32 +0000 | 
| commit | b52f02121bdfc68fbbba732f3d107c296f03d885 (patch) | |
| tree | 0f0055dca4e77f14b47dccb8ae4ad1424c035dac /src | |
| 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.
Diffstat (limited to 'src')
| -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 0999ed5954..6b18d60baf 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 d8358e213c..74ca43c57a 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); | 
