From ea2943efd95c0760a5423236ed37655d863b8a5e Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 20 Jan 2005 04:02:02 +0000 Subject: [PATCH] Update glDeletePrograms/Buffers() so that the ID is freed immediately, like texture objects. --- src/mesa/main/bufferobj.c | 18 ++++++------------ src/mesa/main/mtypes.h | 2 -- src/mesa/shader/atifragshader.c | 9 +++++++++ src/mesa/shader/program.c | 15 +++++---------- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index ca428a7..9d2fc95 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -533,9 +533,8 @@ _mesa_BindBufferARB(GLenum target, GLuint buffer) assert(oldBufObj->RefCount >= 0); if (oldBufObj->RefCount == 0) { assert(oldBufObj->Name != 0); - _mesa_remove_buffer_object(ctx, oldBufObj); ASSERT(ctx->Driver.DeleteBuffer); - (*ctx->Driver.DeleteBuffer)( ctx, oldBufObj ); + ctx->Driver.DeleteBuffer( ctx, oldBufObj ); } } } @@ -635,20 +634,15 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids) _mesa_BindBufferARB( GL_PIXEL_UNPACK_BUFFER_EXT, 0 ); } - /* decrement refcount and delete if <= 0 */ - if (!bufObj->DeletePending) { - bufObj->DeletePending = GL_TRUE; - bufObj->RefCount--; - } - + /* The ID is immediately freed for re-use */ + _mesa_remove_buffer_object(ctx, bufObj); + bufObj->RefCount--; if (bufObj->RefCount <= 0) { - /* buffer should not be bound anymore! */ ASSERT(ctx->Array.ArrayBufferObj != bufObj); ASSERT(ctx->Array.ElementArrayBufferObj != bufObj); ASSERT(ctx->Array.Vertex.BufferObj != bufObj); - _mesa_remove_buffer_object(ctx, bufObj); ASSERT(ctx->Driver.DeleteBuffer); - (*ctx->Driver.DeleteBuffer)(ctx, bufObj); + ctx->Driver.DeleteBuffer(ctx, bufObj); } } } @@ -727,7 +721,7 @@ _mesa_IsBufferARB(GLuint id) bufObj = (struct gl_buffer_object *) _mesa_HashLookup(ctx->Shared->BufferObjects, id); _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); - return bufObj && !bufObj->DeletePending; + return bufObj ? GL_TRUE : GL_FALSE; } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 026e6c6..ed6e6b0 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1475,7 +1475,6 @@ struct gl_buffer_object GLuint Size; /**< Size of storage in bytes */ GLubyte *Data; /**< Location of storage either in RAM or VRAM. */ GLboolean OnCard; /**< Is buffer in VRAM? (hardware drivers) */ - GLboolean DeletePending; /**< Deleted by user but RefCount > 0? */ }; @@ -1706,7 +1705,6 @@ struct program { GLuint Id; GLubyte *String; /**< Null-terminated program text */ - GLboolean DeletePending; /**< User called glDeletePrograms? */ GLint RefCount; GLenum Target; GLenum Format; /**< String encoding format */ diff --git a/src/mesa/shader/atifragshader.c b/src/mesa/shader/atifragshader.c index dbffa37..2a8cf90 100644 --- a/src/mesa/shader/atifragshader.c +++ b/src/mesa/shader/atifragshader.c @@ -185,6 +185,7 @@ _mesa_DeleteFragmentShaderATI(GLuint id) _mesa_BindFragmentShaderATI(0); } } +#if 0 if (!prog->DeletePending) { prog->DeletePending = GL_TRUE; prog->RefCount--; @@ -193,6 +194,14 @@ _mesa_DeleteFragmentShaderATI(GLuint id) _mesa_HashRemove(ctx->Shared->Programs, id); ctx->Driver.DeleteProgram(ctx, prog); } +#else + /* The ID is immediately available for re-use now */ + _mesa_HashRemove(ctx->Shared->Programs, id); + prog->RefCount--; + if (prog->RefCount <= 0) { + ctx->Driver.DeleteProgram(ctx, prog); + } +#endif } } diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index 28c18ed..a45bc50 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -940,9 +940,8 @@ _mesa_BindProgram(GLenum target, GLuint id) curProg->Base.RefCount--; /* and delete if refcount goes below one */ if (curProg->Base.RefCount <= 0) { - ASSERT(curProg->Base.DeletePending); + /* the program ID was already removed from the hash table */ ctx->Driver.DeleteProgram(ctx, &(curProg->Base)); - _mesa_HashRemove(ctx->Shared->Programs, id); } } } @@ -961,9 +960,8 @@ _mesa_BindProgram(GLenum target, GLuint id) curProg->Base.RefCount--; /* and delete if refcount goes below one */ if (curProg->Base.RefCount <= 0) { - ASSERT(curProg->Base.DeletePending); + /* the program ID was already removed from the hash table */ ctx->Driver.DeleteProgram(ctx, &(curProg->Base)); - _mesa_HashRemove(ctx->Shared->Programs, id); } } } @@ -1068,13 +1066,10 @@ _mesa_DeletePrograms(GLsizei n, const GLuint *ids) _mesa_problem(ctx, "bad target in glDeleteProgramsNV"); return; } - /* Decrement reference count if not already marked for delete */ - if (!prog->DeletePending) { - prog->DeletePending = GL_TRUE; - prog->RefCount--; - } + /* The ID is immediately available for re-use now */ + _mesa_HashRemove(ctx->Shared->Programs, ids[i]); + prog->RefCount--; if (prog->RefCount <= 0) { - _mesa_HashRemove(ctx->Shared->Programs, ids[i]); ctx->Driver.DeleteProgram(ctx, prog); } } -- 2.7.4