unbind vertex arrays from buffer in DeleteBuffersARB()
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 17 Sep 2003 18:58:09 +0000 (18:58 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 17 Sep 2003 18:58:09 +0000 (18:58 +0000)
src/mesa/main/bufferobj.c

index 45631c924b4b64d184d1ed0eaf34a222567bcfe4..9289b77d60784214b43293209f6a45fec9996d26 100644 (file)
@@ -453,8 +453,33 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
          struct gl_buffer_object *bufObj = (struct gl_buffer_object *)
             _mesa_HashLookup(ctx->Shared->BufferObjects, ids[i]);
          if (bufObj) {
+            /* unbind any vertex pointers bound to this buffer */
+            GLuint j;
+            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 ( (bufObj->Target == GL_ARRAY_BUFFER_ARB)
-                || (bufObj->Target == GL_ELEMENT_ARRAY_BUFFER_ARB) ) {
+               || (bufObj->Target == GL_ELEMENT_ARRAY_BUFFER_ARB) ) {
               _mesa_BindBufferARB( bufObj->Target, 0 );
             }
            else if (bufObj->Target == 0) {