Fix/improve framebuffer object reference counting.

Use _mesa_reference_framebuffer() and _mesa_unreference_framebuffer() functions
to be sure reference counting is done correctly.  Additional assertions are
done too.  Note _mesa_dereference_framebuffer() renamed to "unreference" as
that's more accurate.
This commit is contained in:
Brian
2007-03-06 10:07:59 -07:00
parent 593802c0b0
commit a510bc3ee1
30 changed files with 102 additions and 98 deletions

View File

@@ -338,7 +338,7 @@ void AMesaDestroyBuffer(AMesaBuffer buffer)
{ {
if (buffer->Screen) destroy_bitmap(buffer->Screen); if (buffer->Screen) destroy_bitmap(buffer->Screen);
if (buffer->Background) destroy_bitmap(buffer->Background); if (buffer->Background) destroy_bitmap(buffer->Background);
_mesa_destroy_framebuffer(buffer->GLBuffer); _mesa_unreference_framebuffer(&buffer->GLBuffer);
free(buffer); free(buffer);
} }

View File

@@ -480,11 +480,7 @@ fbCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
fbDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) fbDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
struct gl_framebuffer *mesa_framebuffer = (struct gl_framebuffer *)driDrawPriv->driverPrivate; _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
_mesa_free(mesa_framebuffer->Attachment[BUFFER_BACK_LEFT].Renderbuffer->Data);
_mesa_destroy_framebuffer(mesa_framebuffer);
driDrawPriv->driverPrivate = NULL;
} }

View File

@@ -392,7 +392,7 @@ ffbCreateBuffer(__DRIscreenPrivate *driScrnPriv,
static void static void
ffbDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) ffbDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -97,7 +97,7 @@ gammaCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
gammaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) gammaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
static void static void

View File

@@ -398,8 +398,7 @@ i810CreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
i810DestroyBuffer(__DRIdrawablePrivate *driDrawPriv) i810DestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
/* _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); */ _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
_mesa_dereference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -449,8 +449,7 @@ static GLboolean intelCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void intelDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) static void intelDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
/* _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); */ _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
_mesa_dereference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -609,8 +609,7 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
static void static void
intelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv) intelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv)
{ {
/* _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); */ _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
_mesa_dereference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -457,8 +457,7 @@ static GLboolean intelCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void intelDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) static void intelDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
/* _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); */ _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
_mesa_dereference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -435,7 +435,7 @@ mach64CreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
mach64DestroyBuffer(__DRIdrawablePrivate *driDrawPriv) mach64DestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -831,7 +831,7 @@ mgaCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
mgaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) mgaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
static void static void

View File

@@ -202,7 +202,7 @@ nouveauCreateBuffer(__DRIscreenPrivate *driScrnPriv,
static void static void
nouveauDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) nouveauDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
static int static int

View File

@@ -357,7 +357,7 @@ r128CreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
r128DestroyBuffer(__DRIdrawablePrivate *driDrawPriv) r128DestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -901,7 +901,7 @@ radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
radeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) radeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300) #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)

View File

@@ -131,7 +131,7 @@ s3vCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
s3vDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) s3vDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
static void static void

View File

@@ -710,7 +710,7 @@ savageCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
savageDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) savageDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
#if 0 #if 0

View File

@@ -233,7 +233,7 @@ sisCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
sisDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) sisDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
static void sisCopyBuffer( __DRIdrawablePrivate *dPriv ) static void sisCopyBuffer( __DRIdrawablePrivate *dPriv )

View File

@@ -233,7 +233,7 @@ tdfxCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
tdfxDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) tdfxDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -279,7 +279,7 @@ tridentCreateBuffer( __DRIscreenPrivate *driScrnPriv,
static void static void
tridentDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) tridentDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }
static void static void

View File

@@ -320,7 +320,7 @@ viaCreateBuffer(__DRIscreenPrivate *driScrnPriv,
static void static void
viaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) viaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{ {
_mesa_destroy_framebuffer((GLframebuffer *)(driDrawPriv->driverPrivate)); _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
} }

View File

@@ -728,7 +728,7 @@ errorhandler:
FREE(fxMesa->fogTable); FREE(fxMesa->fogTable);
} }
if (fxMesa->glBuffer) { if (fxMesa->glBuffer) {
_mesa_destroy_framebuffer(fxMesa->glBuffer); _mesa_unreference_framebuffer(&fxMesa->glBuffer);
} }
if (fxMesa->glVis) { if (fxMesa->glVis) {
_mesa_destroy_visual(fxMesa->glVis); _mesa_destroy_visual(fxMesa->glVis);
@@ -828,7 +828,7 @@ fxMesaDestroyContext(fxMesaContext fxMesa)
fxDDDestroyFxMesaContext(fxMesa); /* must be before _mesa_destroy_context */ fxDDDestroyFxMesaContext(fxMesa); /* must be before _mesa_destroy_context */
_mesa_destroy_visual(fxMesa->glVis); _mesa_destroy_visual(fxMesa->glVis);
_mesa_destroy_context(fxMesa->glCtx); _mesa_destroy_context(fxMesa->glCtx);
_mesa_destroy_framebuffer(fxMesa->glBuffer); _mesa_unreference_framebuffer(&fxMesa->glBuffer);
fxTMClose(fxMesa); /* must be after _mesa_destroy_context */ fxTMClose(fxMesa); /* must be after _mesa_destroy_context */
FREE(fxMesa); FREE(fxMesa);

View File

@@ -1303,7 +1303,8 @@ OSMesaDestroyContext( OSMesaContext osmesa )
_swrast_DestroyContext( &osmesa->mesa ); _swrast_DestroyContext( &osmesa->mesa );
_mesa_destroy_visual( osmesa->gl_visual ); _mesa_destroy_visual( osmesa->gl_visual );
_mesa_destroy_framebuffer( osmesa->gl_buffer ); _mesa_unreference_framebuffer( &osmesa->gl_buffer );
_mesa_free_context_data( &osmesa->mesa ); _mesa_free_context_data( &osmesa->mesa );
_mesa_free( osmesa ); _mesa_free( osmesa );
} }

View File

@@ -433,7 +433,6 @@ void SVGAMesaDestroyContext( SVGAMesaContext ctx )
if (ctx) { if (ctx) {
_mesa_destroy_visual( ctx->gl_vis ); _mesa_destroy_visual( ctx->gl_vis );
_mesa_destroy_context( ctx->gl_ctx ); _mesa_destroy_context( ctx->gl_ctx );
_mesa_destroy_framebuffer( ctx->gl_buffer );
free( ctx ); free( ctx );
if (ctx==SVGAMesa) { if (ctx==SVGAMesa) {
SVGAMesa = NULL; SVGAMesa = NULL;

View File

@@ -485,8 +485,8 @@ xmesa_free_buffer(XMesaBuffer buffer)
/* mark as delete pending */ /* mark as delete pending */
fb->DeletePending = GL_TRUE; fb->DeletePending = GL_TRUE;
/* Dereference. If count = zero we'll really delete the buffer */ /* Unreference. If count = zero we'll really delete the buffer */
_mesa_dereference_framebuffer(&fb); _mesa_unreference_framebuffer(&fb);
return; return;
} }

View File

@@ -1408,6 +1408,13 @@ _mesa_free_context_data( GLcontext *ctx )
if (ctx == _mesa_get_current_context()) { if (ctx == _mesa_get_current_context()) {
_mesa_make_current(NULL, NULL, NULL); _mesa_make_current(NULL, NULL, NULL);
} }
else {
/* unreference WinSysDraw/Read buffers */
_mesa_unreference_framebuffer(&ctx->WinSysDrawBuffer);
_mesa_unreference_framebuffer(&ctx->WinSysReadBuffer);
_mesa_unreference_framebuffer(&ctx->DrawBuffer);
_mesa_unreference_framebuffer(&ctx->ReadBuffer);
}
_mesa_free_lighting_data( ctx ); _mesa_free_lighting_data( ctx );
_mesa_free_eval_data( ctx ); _mesa_free_eval_data( ctx );
@@ -1694,12 +1701,8 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
ASSERT(_mesa_get_current_context() == newCtx); ASSERT(_mesa_get_current_context() == newCtx);
if (oldCtx) { if (oldCtx) {
if (oldCtx->WinSysDrawBuffer) { _mesa_unreference_framebuffer(&oldCtx->WinSysDrawBuffer);
_mesa_dereference_framebuffer(&oldCtx->WinSysDrawBuffer); _mesa_unreference_framebuffer(&oldCtx->WinSysReadBuffer);
}
if (oldCtx->WinSysReadBuffer) {
_mesa_dereference_framebuffer(&oldCtx->WinSysReadBuffer);
}
} }
if (!newCtx) { if (!newCtx) {
@@ -1713,20 +1716,18 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
ASSERT(drawBuffer->Name == 0); ASSERT(drawBuffer->Name == 0);
ASSERT(readBuffer->Name == 0); ASSERT(readBuffer->Name == 0);
newCtx->WinSysDrawBuffer = drawBuffer; _mesa_reference_framebuffer(&newCtx->WinSysDrawBuffer, drawBuffer);
newCtx->WinSysReadBuffer = readBuffer; _mesa_reference_framebuffer(&newCtx->WinSysReadBuffer, readBuffer);
drawBuffer->RefCount++;
readBuffer->RefCount++;
/* /*
* Only set the context's Draw/ReadBuffer fields if they're NULL * Only set the context's Draw/ReadBuffer fields if they're NULL
* or not bound to a user-created FBO. * or not bound to a user-created FBO.
*/ */
if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) { if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
newCtx->DrawBuffer = drawBuffer; _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
} }
if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) { if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
newCtx->ReadBuffer = readBuffer; _mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
} }
newCtx->NewState |= _NEW_BUFFERS; newCtx->NewState |= _NEW_BUFFERS;

View File

@@ -602,7 +602,7 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
oldRb = ctx->CurrentRenderbuffer; oldRb = ctx->CurrentRenderbuffer;
if (oldRb) { if (oldRb) {
_mesa_dereference_renderbuffer(&oldRb); _mesa_unreference_renderbuffer(&oldRb);
} }
ASSERT(newRb != &DummyRenderbuffer); ASSERT(newRb != &DummyRenderbuffer);
@@ -639,7 +639,7 @@ _mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
/* But the object will not be freed until it's no longer /* But the object will not be freed until it's no longer
* bound in any context. * bound in any context.
*/ */
_mesa_dereference_renderbuffer(&rb); _mesa_unreference_renderbuffer(&rb);
} }
} }
} }
@@ -998,12 +998,6 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
} }
_mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newFb); _mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newFb);
} }
_glthread_LOCK_MUTEX(newFb->Mutex);
if (bindReadBuf)
newFb->RefCount++;
if (bindDrawBuf)
newFb->RefCount++;
_glthread_UNLOCK_MUTEX(newFb->Mutex);
} }
else { else {
/* Binding the window system framebuffer (which was originally set /* Binding the window system framebuffer (which was originally set
@@ -1020,22 +1014,16 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
*/ */
if (bindReadBuf) { if (bindReadBuf) {
struct gl_framebuffer *oldFb = ctx->ReadBuffer; _mesa_unreference_framebuffer(&ctx->ReadBuffer);
if (oldFb && oldFb->Name != 0) { _mesa_reference_framebuffer(&ctx->ReadBuffer, newFb);
_mesa_dereference_framebuffer(&oldFb);
}
ctx->ReadBuffer = newFb;
} }
if (bindDrawBuf) { if (bindDrawBuf) {
struct gl_framebuffer *oldFb = ctx->DrawBuffer;
if (oldFb && oldFb->Name != 0) {
/* check if old FB had any texture attachments */ /* check if old FB had any texture attachments */
check_end_texture_render(ctx, oldFb); check_end_texture_render(ctx, ctx->DrawBuffer);
/* check if time to delete this framebuffer */ /* check if time to delete this framebuffer */
_mesa_dereference_framebuffer(&oldFb); _mesa_unreference_framebuffer(&ctx->DrawBuffer);
} _mesa_reference_framebuffer(&ctx->DrawBuffer, newFb);
ctx->DrawBuffer = newFb;
if (newFb->Name != 0) { if (newFb->Name != 0) {
/* check if newly bound framebuffer has any texture attachments */ /* check if newly bound framebuffer has any texture attachments */
check_begin_texture_render(ctx, newFb); check_begin_texture_render(ctx, newFb);
@@ -1083,7 +1071,7 @@ _mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
/* But the object will not be freed until it's no longer /* But the object will not be freed until it's no longer
* bound in any context. * bound in any context.
*/ */
_mesa_dereference_framebuffer(&fb); _mesa_unreference_framebuffer(&fb);
} }
} }
} }

View File

@@ -78,7 +78,7 @@ set_depth_renderbuffer(struct gl_framebuffer *fb,
struct gl_renderbuffer *rb) struct gl_renderbuffer *rb)
{ {
if (fb->_DepthBuffer) { if (fb->_DepthBuffer) {
_mesa_dereference_renderbuffer(&fb->_DepthBuffer); _mesa_unreference_renderbuffer(&fb->_DepthBuffer);
} }
fb->_DepthBuffer = rb; fb->_DepthBuffer = rb;
if (rb) { if (rb) {
@@ -96,7 +96,7 @@ set_stencil_renderbuffer(struct gl_framebuffer *fb,
struct gl_renderbuffer *rb) struct gl_renderbuffer *rb)
{ {
if (fb->_StencilBuffer) { if (fb->_StencilBuffer) {
_mesa_dereference_renderbuffer(&fb->_StencilBuffer); _mesa_unreference_renderbuffer(&fb->_StencilBuffer);
} }
fb->_StencilBuffer = rb; fb->_StencilBuffer = rb;
if (rb) { if (rb) {
@@ -223,7 +223,7 @@ _mesa_free_framebuffer_data(struct gl_framebuffer *fb)
for (i = 0; i < BUFFER_COUNT; i++) { for (i = 0; i < BUFFER_COUNT; i++) {
struct gl_renderbuffer_attachment *att = &fb->Attachment[i]; struct gl_renderbuffer_attachment *att = &fb->Attachment[i];
if (att->Renderbuffer) { if (att->Renderbuffer) {
_mesa_dereference_renderbuffer(&att->Renderbuffer); _mesa_unreference_renderbuffer(&att->Renderbuffer);
} }
if (att->Texture) { if (att->Texture) {
/* render to texture */ /* render to texture */
@@ -236,7 +236,6 @@ _mesa_free_framebuffer_data(struct gl_framebuffer *fb)
} }
} }
att->Type = GL_NONE; att->Type = GL_NONE;
att->Renderbuffer = NULL;
att->Texture = NULL; att->Texture = NULL;
} }
@@ -247,25 +246,44 @@ _mesa_free_framebuffer_data(struct gl_framebuffer *fb)
/** /**
* Decrement the reference count on a framebuffer and delete it when * Set *ptr to point to fb, with refcounting and locking.
* the refcount hits zero.
* Note: we pass the address of a pointer and set it to NULL if we delete it.
*/ */
void void
_mesa_dereference_framebuffer(struct gl_framebuffer **fb) _mesa_reference_framebuffer(struct gl_framebuffer **ptr,
struct gl_framebuffer *fb)
{ {
assert(ptr);
assert(!*ptr);
assert(fb);
_glthread_LOCK_MUTEX(fb->Mutex);
fb->RefCount++;
_glthread_UNLOCK_MUTEX(fb->Mutex);
*ptr = fb;
}
/**
* Undo/remove a reference to a framebuffer object.
* Decrement the framebuffer object's reference count and delete it when
* the refcount hits zero.
* Note: we pass the address of a pointer and set it to NULL.
*/
void
_mesa_unreference_framebuffer(struct gl_framebuffer **fb)
{
assert(fb);
if (*fb) {
GLboolean deleteFlag = GL_FALSE; GLboolean deleteFlag = GL_FALSE;
_glthread_LOCK_MUTEX((*fb)->Mutex); _glthread_LOCK_MUTEX((*fb)->Mutex);
{
ASSERT((*fb)->RefCount > 0); ASSERT((*fb)->RefCount > 0);
(*fb)->RefCount--; (*fb)->RefCount--;
deleteFlag = ((*fb)->RefCount == 0); deleteFlag = ((*fb)->RefCount == 0);
}
_glthread_UNLOCK_MUTEX((*fb)->Mutex); _glthread_UNLOCK_MUTEX((*fb)->Mutex);
if (deleteFlag) { if (deleteFlag)
(*fb)->Delete(*fb); (*fb)->Delete(*fb);
*fb = NULL; *fb = NULL;
} }
} }

View File

@@ -43,7 +43,11 @@ extern void
_mesa_free_framebuffer_data(struct gl_framebuffer *buffer); _mesa_free_framebuffer_data(struct gl_framebuffer *buffer);
extern void extern void
_mesa_dereference_framebuffer(struct gl_framebuffer **fb); _mesa_reference_framebuffer(struct gl_framebuffer **ptr,
struct gl_framebuffer *fb);
extern void
_mesa_unreference_framebuffer(struct gl_framebuffer **fb);
extern void extern void
_mesa_resize_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb, _mesa_resize_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb,

View File

@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.1 * Version: 6.5.3
* *
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -45,7 +45,7 @@ Delete_wrapper(struct gl_renderbuffer *rb)
/* Decrement reference count on the buffer we're wrapping and delete /* Decrement reference count on the buffer we're wrapping and delete
* it if refcount hits zero. * it if refcount hits zero.
*/ */
_mesa_dereference_renderbuffer(&rb->Wrapped); _mesa_unreference_renderbuffer(&rb->Wrapped);
/* delete myself */ /* delete myself */
_mesa_delete_renderbuffer(rb); _mesa_delete_renderbuffer(rb);

View File

@@ -2089,32 +2089,33 @@ _mesa_remove_renderbuffer(struct gl_framebuffer *fb, GLuint bufferName)
if (!rb) if (!rb)
return; return;
_mesa_dereference_renderbuffer(&rb); _mesa_unreference_renderbuffer(&rb);
fb->Attachment[bufferName].Renderbuffer = NULL; fb->Attachment[bufferName].Renderbuffer = NULL;
} }
/** /**
* Decrement the reference count on a renderbuffer and delete it when * Decrement a renderbuffer object's reference count and delete it when
* the refcount hits zero. * the refcount hits zero.
* Note: we pass the address of a pointer and set it to NULL if we delete it. * Note: we pass the address of a pointer.
*/ */
void void
_mesa_dereference_renderbuffer(struct gl_renderbuffer **rb) _mesa_unreference_renderbuffer(struct gl_renderbuffer **rb)
{ {
assert(rb);
if (*rb) {
GLboolean deleteFlag = GL_FALSE; GLboolean deleteFlag = GL_FALSE;
_glthread_LOCK_MUTEX((*rb)->Mutex); _glthread_LOCK_MUTEX((*rb)->Mutex);
{
ASSERT((*rb)->RefCount > 0); ASSERT((*rb)->RefCount > 0);
(*rb)->RefCount--; (*rb)->RefCount--;
deleteFlag = ((*rb)->RefCount == 0); deleteFlag = ((*rb)->RefCount == 0);
}
_glthread_UNLOCK_MUTEX((*rb)->Mutex); _glthread_UNLOCK_MUTEX((*rb)->Mutex);
if (deleteFlag) { if (deleteFlag)
(*rb)->Delete(*rb); (*rb)->Delete(*rb);
*rb = NULL; *rb = NULL;
} }
} }

View File

@@ -99,7 +99,7 @@ extern void
_mesa_remove_renderbuffer(struct gl_framebuffer *fb, GLuint bufferName); _mesa_remove_renderbuffer(struct gl_framebuffer *fb, GLuint bufferName);
extern void extern void
_mesa_dereference_renderbuffer(struct gl_renderbuffer **rb); _mesa_unreference_renderbuffer(struct gl_renderbuffer **rb);
extern struct gl_renderbuffer * extern struct gl_renderbuffer *
_mesa_new_depthstencil_renderbuffer(GLcontext *ctx, GLuint name); _mesa_new_depthstencil_renderbuffer(GLcontext *ctx, GLuint name);