yet another take on VBO deleting and reference counting
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 4 Mar 2004 14:46:00 +0000 (14:46 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 4 Mar 2004 14:46:00 +0000 (14:46 +0000)
src/mesa/main/bufferobj.c
src/mesa/main/mtypes.h

index 0e417a261549f19727e222240fd74b87521cab4c..882f24526c79170d772b183934ec60e982f7b61d 100644 (file)
@@ -452,8 +452,60 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
             _mesa_HashLookup(ctx->Shared->BufferObjects, ids[i]);
          if (bufObj) {
             /* unbind any vertex pointers bound to this buffer */
+            GLuint j;
+
             ASSERT(bufObj->Name == ids[i]);
+
+            if (ctx->Array.Vertex.BufferObj == bufObj) {
+               bufObj->RefCount--;
+               ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj;
+            }
+            if (ctx->Array.Normal.BufferObj == bufObj) {
+               bufObj->RefCount--;
+               ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj;
+            }
+            if (ctx->Array.Color.BufferObj == bufObj) {
+               bufObj->RefCount--;
+               ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj;
+            }
+            if (ctx->Array.SecondaryColor.BufferObj == bufObj) {
+               bufObj->RefCount--;
+               ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
+            }
+            if (ctx->Array.FogCoord.BufferObj == bufObj) {
+               bufObj->RefCount--;
+               ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj;
+            }
+            if (ctx->Array.Index.BufferObj == bufObj) {
+               bufObj->RefCount--;
+               ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj;
+            }
+            if (ctx->Array.EdgeFlag.BufferObj == bufObj) {
+               bufObj->RefCount--;
+               ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
+            }
+            for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
+               if (ctx->Array.TexCoord[j].BufferObj == bufObj) {
+                  bufObj->RefCount--;
+                  ctx->Array.TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
+               }
+            }
+            for (j = 0; j < VERT_ATTRIB_MAX; j++) {
+               if (ctx->Array.VertexAttrib[j].BufferObj == bufObj) {
+                  bufObj->RefCount--;
+                  ctx->Array.VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
+               }
+            }
+
+            if (ctx->Array.ArrayBufferObj == bufObj) {
+               _mesa_BindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
+            }
+            if (ctx->Array.ElementArrayBufferObj == bufObj) {
+               _mesa_BindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );
+            }
+
             /* decrement refcount and delete if <= 0 */
+            bufObj->DeletePending = GL_TRUE;
             bufObj->RefCount--;
             if (bufObj->RefCount <= 0) {
                /* buffer should not be bound anymore! */
@@ -541,7 +593,7 @@ _mesa_IsBufferARB(GLuint id)
    bufObj = (struct gl_buffer_object *) _mesa_HashLookup(ctx->Shared->BufferObjects, id);
    _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
-   return (bufObj != NULL);
+   return bufObj && !bufObj->DeletePending;
 }
 
 
index e090a3d683462623d9d93e4be89caa55d0925fc4..3ef508b3f83bcd1b92f2e3488f32b7754506dc50 100644 (file)
@@ -1329,6 +1329,7 @@ struct gl_buffer_object {
    GLvoid *Pointer;   /**< Only valid while buffer is mapped */
    GLuint Size;       /**< Size of data array in bytes */
    GLubyte *Data;     /**< The storage */
+   GLboolean DeletePending;  /**< Deleted by user? */
 };