VBO RefCount fix (David Reveman)

This commit is contained in:
Brian Paul
2004-09-27 16:19:17 +00:00
parent e60c9311da
commit 293ad98510
2 changed files with 10 additions and 0 deletions

View File

@@ -539,41 +539,50 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
if (ctx->Array.Vertex.BufferObj == bufObj) { if (ctx->Array.Vertex.BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj; ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
if (ctx->Array.Normal.BufferObj == bufObj) { if (ctx->Array.Normal.BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj; ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
if (ctx->Array.Color.BufferObj == bufObj) { if (ctx->Array.Color.BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj; ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
if (ctx->Array.SecondaryColor.BufferObj == bufObj) { if (ctx->Array.SecondaryColor.BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj; ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
if (ctx->Array.FogCoord.BufferObj == bufObj) { if (ctx->Array.FogCoord.BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj; ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
if (ctx->Array.Index.BufferObj == bufObj) { if (ctx->Array.Index.BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj; ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
if (ctx->Array.EdgeFlag.BufferObj == bufObj) { if (ctx->Array.EdgeFlag.BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj; ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
for (j = 0; j < MAX_TEXTURE_UNITS; j++) { for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
if (ctx->Array.TexCoord[j].BufferObj == bufObj) { if (ctx->Array.TexCoord[j].BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.TexCoord[j].BufferObj = ctx->Array.NullBufferObj; ctx->Array.TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
} }
for (j = 0; j < VERT_ATTRIB_MAX; j++) { for (j = 0; j < VERT_ATTRIB_MAX; j++) {
if (ctx->Array.VertexAttrib[j].BufferObj == bufObj) { if (ctx->Array.VertexAttrib[j].BufferObj == bufObj) {
bufObj->RefCount--; bufObj->RefCount--;
ctx->Array.VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj; ctx->Array.VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
ctx->Array.NullBufferObj->RefCount++;
} }
} }

View File

@@ -60,6 +60,7 @@ update_array(GLcontext *ctx, struct gl_client_array *array,
#if FEATURE_ARB_vertex_buffer_object #if FEATURE_ARB_vertex_buffer_object
array->BufferObj->RefCount--; array->BufferObj->RefCount--;
if (array->BufferObj->RefCount <= 0) { if (array->BufferObj->RefCount <= 0) {
ASSERT(array->BufferObj->Name);
_mesa_remove_buffer_object( ctx, array->BufferObj ); _mesa_remove_buffer_object( ctx, array->BufferObj );
(*ctx->Driver.DeleteBuffer)( ctx, array->BufferObj ); (*ctx->Driver.DeleteBuffer)( ctx, array->BufferObj );
} }