change gl_buffer_object's Size field to GLsizeiptrARB type
[mesa.git] / src / mesa / main / bufferobj.c
index ca428a7fa0608ee7819344473831f2210121ce8d..185d841f81219d2a7731ee6ea0df83c0de7a5006 100644 (file)
@@ -310,7 +310,7 @@ _mesa_buffer_get_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
 {
    (void) ctx; (void) target;
 
-   if (bufObj->Data && ((GLuint) (size + offset) <= bufObj->Size)) {
+   if (bufObj->Data && ((GLsizeiptrARB) (size + offset) <= bufObj->Size)) {
       _mesa_memcpy( data, (GLubyte *) bufObj->Data + offset, size );
    }
 }
@@ -474,7 +474,7 @@ _mesa_BindBufferARB(GLenum target, GLuint buffer)
 {
    GET_CURRENT_CONTEXT(ctx);
    struct gl_buffer_object *oldBufObj;
-   struct gl_buffer_object *newBufObj = 0;
+   struct gl_buffer_object *newBufObj = NULL;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    oldBufObj = buffer_object_get_target( ctx, target, "BindBufferARB" );
@@ -533,9 +533,8 @@ _mesa_BindBufferARB(GLenum target, GLuint buffer)
       assert(oldBufObj->RefCount >= 0);
       if (oldBufObj->RefCount == 0) {
         assert(oldBufObj->Name != 0);
-        _mesa_remove_buffer_object(ctx, oldBufObj);
         ASSERT(ctx->Driver.DeleteBuffer);
-        (*ctx->Driver.DeleteBuffer)( ctx, oldBufObj );
+        ctx->Driver.DeleteBuffer( ctx, oldBufObj );
       }
    }
 }
@@ -635,20 +634,15 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
                _mesa_BindBufferARB( GL_PIXEL_UNPACK_BUFFER_EXT, 0 );
             }
 
-            /* decrement refcount and delete if <= 0 */
-            if (!bufObj->DeletePending) {
-               bufObj->DeletePending = GL_TRUE;
-               bufObj->RefCount--;
-            }
-
+            /* The ID is immediately freed for re-use */
+            _mesa_remove_buffer_object(ctx, bufObj);
+            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);
+               ctx->Driver.DeleteBuffer(ctx, bufObj);
             }
          }
       }
@@ -695,6 +689,7 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer)
       GLenum target = 0;
       bufObj = (*ctx->Driver.NewBufferObject)( ctx, name, target );
       if (!bufObj) {
+         _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenBuffersARB");
          return;
       }
@@ -727,7 +722,7 @@ _mesa_IsBufferARB(GLuint id)
    bufObj = (struct gl_buffer_object *) _mesa_HashLookup(ctx->Shared->BufferObjects, id);
    _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
-   return bufObj && !bufObj->DeletePending;
+   return bufObj ? GL_TRUE : GL_FALSE;
 }