* 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 )
_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);