From 2eb88c1752f3c2f2f858415a89fdfc96e6669fc8 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sat, 20 May 2006 15:06:35 +0000 Subject: Added _mesa_dereference_framebuffer() to encapsulate reference count decrement, delete and locking. --- src/mesa/main/framebuffer.c | 47 ++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) (limited to 'src/mesa/main/framebuffer.c') diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index ead7d46ea7..4d6871bb7d 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -78,10 +78,7 @@ set_depth_renderbuffer(struct gl_framebuffer *fb, struct gl_renderbuffer *rb) { if (fb->_DepthBuffer) { - fb->_DepthBuffer->RefCount--; - if (fb->_DepthBuffer->RefCount <= 0) { - fb->_DepthBuffer->Delete(fb->_DepthBuffer); - } + _mesa_dereference_renderbuffer(&fb->_DepthBuffer); } fb->_DepthBuffer = rb; if (rb) { @@ -99,10 +96,7 @@ set_stencil_renderbuffer(struct gl_framebuffer *fb, struct gl_renderbuffer *rb) { if (fb->_StencilBuffer) { - fb->_StencilBuffer->RefCount--; - if (fb->_StencilBuffer->RefCount <= 0) { - fb->_StencilBuffer->Delete(fb->_StencilBuffer); - } + _mesa_dereference_renderbuffer(&fb->_StencilBuffer); } fb->_StencilBuffer = rb; if (rb) { @@ -226,11 +220,11 @@ _mesa_free_framebuffer_data(struct gl_framebuffer *fb) struct gl_renderbuffer_attachment *att = &fb->Attachment[i]; if (att->Renderbuffer) { struct gl_renderbuffer *rb = att->Renderbuffer; - _glthread_LOCK_MUTEX(rb->Mutex); - rb->RefCount--; - _glthread_UNLOCK_MUTEX(rb->Mutex); - if (rb->RefCount == 0) { - rb->Delete(rb); + /* remove framebuffer's reference to renderbuffer */ + _mesa_dereference_renderbuffer(&rb); + if (rb && rb->Name == 0) { + /* delete window system renderbuffer */ + _mesa_dereference_renderbuffer(&rb); } } att->Type = GL_NONE; @@ -243,6 +237,33 @@ _mesa_free_framebuffer_data(struct gl_framebuffer *fb) } +/** + * Decrement the reference count on a framebuffer 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_framebuffer(struct gl_framebuffer **fb) +{ + GLboolean deleteFlag = GL_FALSE; + + _glthread_LOCK_MUTEX((*fb)->Mutex); + { + ASSERT((*fb)->RefCount > 0); + (*fb)->RefCount--; + deleteFlag = ((*fb)->RefCount == 0); + } + _glthread_UNLOCK_MUTEX((*fb)->Mutex); + + if (deleteFlag) { + (*fb)->Delete(*fb); + *fb = NULL; + } +} + + + + /** * Resize the given framebuffer's renderbuffers to the new width and height. * This should only be used for window-system framebuffers, not -- cgit v1.2.3