more changes to VBO reference counting and deletion
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 3 Mar 2004 15:35:08 +0000 (15:35 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 3 Mar 2004 15:35:08 +0000 (15:35 +0000)
src/mesa/main/bufferobj.c
src/mesa/main/varray.c

index 8b6ede6..0e417a2 100644 (file)
@@ -145,7 +145,7 @@ _mesa_new_buffer_object( GLcontext *ctx, GLuint name, GLenum target )
  * Delete a buffer object.
  * 
  * This function is intended to be called via
- * \c dd_function_table::DeleteBufferObject.
+ * \c dd_function_table::DeleteBuffer.
  */
 void
 _mesa_delete_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
@@ -452,43 +452,14 @@ _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 != 0);
-
-            if (ctx->Array.Vertex.BufferObj == bufObj)
-               ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj;
-            if (ctx->Array.Normal.BufferObj == bufObj)
-               ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj;
-            if (ctx->Array.Color.BufferObj == bufObj)
-               ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj;
-            if (ctx->Array.SecondaryColor.BufferObj == bufObj)
-               ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
-            if (ctx->Array.FogCoord.BufferObj == bufObj)
-               ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj;
-            if (ctx->Array.Index.BufferObj == bufObj)
-               ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj;
-            if (ctx->Array.EdgeFlag.BufferObj == bufObj)
-               ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
-            for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
-               if (ctx->Array.TexCoord[j].BufferObj == bufObj)
-                  ctx->Array.TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
-            }
-            for (j = 0; j < VERT_ATTRIB_MAX; j++) {
-               if (ctx->Array.VertexAttrib[j].BufferObj == bufObj)
-                  ctx->Array.VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
-            }
-
-            /* if deleting bound buffers, rebind to zero */
-            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 );
-            }
-
+            ASSERT(bufObj->Name == ids[i]);
+            /* decrement refcount and delete if <= 0 */
             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);
index c0b7bcf..52f8c8c 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "glheader.h"
 #include "imports.h"
+#include "bufferobj.h"
 #include "context.h"
 #include "enable.h"
 #include "enums.h"
@@ -59,6 +60,7 @@ update_array(GLcontext *ctx, struct gl_client_array *array,
 #if FEATURE_ARB_vertex_buffer_object
    array->BufferObj->RefCount--;
    if (array->BufferObj->RefCount <= 0) {
+      _mesa_remove_buffer_object( ctx, array->BufferObj );
       (*ctx->Driver.DeleteBuffer)( ctx, array->BufferObj );
    }
    array->BufferObj = ctx->Array.ArrayBufferObj;