Update glDeletePrograms/Buffers() so that the ID is freed immediately, like
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 20 Jan 2005 04:02:02 +0000 (04:02 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 20 Jan 2005 04:02:02 +0000 (04:02 +0000)
texture objects.

src/mesa/main/bufferobj.c
src/mesa/main/mtypes.h
src/mesa/shader/atifragshader.c
src/mesa/shader/program.c

index ca428a7fa0608ee7819344473831f2210121ce8d..9d2fc95be31dc24b5459d07c14834103d168ab6f 100644 (file)
@@ -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;
 }
 
 
index 026e6c60a09192fbfa1ccdd39383db34cd8e29c1..ed6e6b02b36e3f1e2d305a44ff90a8629c1ccc95 100644 (file)
@@ -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 */
index dbffa37f4f6a70d8947dffa6355a5b4d14ef4a75..2a8cf9016a4443700e12b620bec6c3e6946d3db7 100644 (file)
@@ -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
    }
 }
 
index 28c18ed51ad2caa9cc7fad46f988c701faf135a6..a45bc50371e92bcacc0b6f4d3d5eabfd56ac7f09 100644 (file)
@@ -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);
             }
          }