Fix pow <small> and a very stypid bug with dummy srcs(0 equals to tmp0.x)</small...
[mesa.git] / src / mesa / main / bufferobj.c
index c795d2f16a08658f5a1ae3a26a5058fccb0f0bac..03aec367c438942073a4a8b62ea595061c507f0d 100644 (file)
@@ -113,17 +113,17 @@ buffer_object_subdata_range_good( GLcontext * ctx, GLenum target,
    }
 
    bufObj = buffer_object_get_target( ctx, target, str );
-   if ( bufObj == NULL ) {
+   if (!bufObj || bufObj->Name == 0) {
       return NULL;
    }
 
-   if ( (GLuint)(offset + size) > bufObj->Size ) {
+   if ((GLuint) (offset + size) > bufObj->Size) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                  "%s(size + offset > buffer size)", str);
       return NULL;
    }
 
-   if ( bufObj->Pointer ) {
+   if (bufObj->Pointer) {
       /* Buffer is currently mapped */
       _mesa_error(ctx, GL_INVALID_OPERATION, "%s", str);
       return NULL;
@@ -242,12 +242,12 @@ _mesa_buffer_data( GLcontext *ctx, GLenum target, GLsizeiptrARB size,
    (void) ctx; (void) target;
 
    new_data = _mesa_realloc( bufObj->Data, bufObj->Size, size );
-   if ( new_data != NULL ) {
+   if (new_data) {
       bufObj->Data = (GLubyte *) new_data;
       bufObj->Size = size;
       bufObj->Usage = usage;
 
-      if ( data != NULL ) {
+      if (data) {
         _mesa_memcpy( bufObj->Data, data, size );
       }
    }
@@ -279,8 +279,7 @@ _mesa_buffer_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
 {
    (void) ctx; (void) target;
 
-   if ( (bufObj->Data != NULL)
-       && ((GLuint)(size + offset) <= bufObj->Size) ) {
+   if (bufObj->Data && ((GLuint) (size + offset) <= bufObj->Size)) {
       _mesa_memcpy( (GLubyte *) bufObj->Data + offset, data, size );
    }
 }
@@ -311,8 +310,7 @@ _mesa_buffer_get_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
 {
    (void) ctx; (void) target;
 
-   if ( (bufObj->Data != NULL)
-       && ((GLuint)(size + offset) <= bufObj->Size) ) {
+   if (bufObj->Data && ((GLsizeiptrARB) (size + offset) <= bufObj->Size)) {
       _mesa_memcpy( data, (GLubyte *) bufObj->Data + offset, size );
    }
 }
@@ -429,11 +427,13 @@ _mesa_init_buffer_objects( GLcontext *ctx )
  *         go out of bounds.
  */
 GLboolean
-_mesa_validate_pbo_access(const struct gl_pixelstore_attrib *pack,
+_mesa_validate_pbo_access(GLuint dimensions,
+                          const struct gl_pixelstore_attrib *pack,
                           GLsizei width, GLsizei height, GLsizei depth,
                           GLenum format, GLenum type, const GLvoid *ptr)
 {
    GLvoid *start, *end;
+   const GLubyte *sizeAddr; /* buffer size, cast to a pointer */
 
    ASSERT(pack->BufferObj->Name != 0);
 
@@ -442,19 +442,21 @@ _mesa_validate_pbo_access(const struct gl_pixelstore_attrib *pack,
       return GL_FALSE;
 
    /* get address of first pixel we'll read */
-   start = _mesa_image_address(pack, ptr, width, height,
+   start = _mesa_image_address(dimensions, pack, ptr, width, height,
                                format, type, 0, 0, 0);
 
    /* get address just past the last pixel we'll read */
-   end =  _mesa_image_address(pack, ptr, width, height,
+   end =  _mesa_image_address(dimensions, pack, ptr, width, height,
                               format, type, depth-1, height-1, width);
 
 
-   if ((const GLubyte *) start > (const GLubyte *) pack->BufferObj->Size) {
+   sizeAddr = ((const GLubyte *) 0) + pack->BufferObj->Size;
+
+   if ((const GLubyte *) start > sizeAddr) {
       /* This will catch negative values / wrap-around */
       return GL_FALSE;
    }
-   if ((const GLubyte *) end > (const GLubyte *) pack->BufferObj->Size) {
+   if ((const GLubyte *) end > sizeAddr) {
       /* Image read goes beyond end of buffer */
       return GL_FALSE;
    }
@@ -475,17 +477,17 @@ _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" );
-   if ( (oldBufObj != NULL) && (oldBufObj->Name == buffer) )
+   if (oldBufObj && oldBufObj->Name == buffer)
       return;   /* rebinding the same buffer object- no change */
 
    /*
     * Get pointer to new buffer object (newBufObj)
     */
-   if ( buffer == 0 ) {
+   if (buffer == 0) {
       /* The spec says there's not a buffer object named 0, but we use
        * one internally because it simplifies things.
        */
@@ -526,17 +528,16 @@ _mesa_BindBufferARB(GLenum target, GLuint buffer)
    }
 
    /* Pass BindBuffer call to device driver */
-   if ( (ctx->Driver.BindBuffer != NULL) && (newBufObj != NULL) )
+   if (ctx->Driver.BindBuffer && newBufObj)
       (*ctx->Driver.BindBuffer)( ctx, target, newBufObj );
 
-   if ( oldBufObj != NULL ) {
+   if (oldBufObj) {
       oldBufObj->RefCount--;
       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 );
       }
    }
 }
@@ -636,20 +637,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);
             }
          }
       }
@@ -678,7 +674,7 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer)
       return;
    }
 
-   if ( buffer == NULL ) {
+   if (!buffer) {
       return;
    }
 
@@ -696,6 +692,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;
       }
@@ -728,7 +725,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;
 }
 
 
@@ -763,7 +760,7 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size,
    }
 
    bufObj = buffer_object_get_target( ctx, target, "BufferDataARB" );
-   if ( bufObj == NULL ) {
+   if (!bufObj || bufObj->Name ==0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferDataARB" );
       return;
    }
@@ -839,19 +836,19 @@ _mesa_MapBufferARB(GLenum target, GLenum access)
    }
 
    bufObj = buffer_object_get_target( ctx, target, "MapBufferARB" );
-   if ( bufObj == NULL ) {
+   if (!bufObj || bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB" );
       return NULL;
    }
 
-   if ( bufObj->Pointer != NULL ) {
+   if (bufObj->Pointer) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB(already mapped)");
       return NULL;
    }
 
    ASSERT(ctx->Driver.MapBuffer);
    bufObj->Pointer = (*ctx->Driver.MapBuffer)( ctx, target, access, bufObj );
-   if ( bufObj->Pointer == NULL ) {
+   if (!bufObj->Pointer) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glMapBufferARB(access)");
    }
 
@@ -870,17 +867,17 @@ _mesa_UnmapBufferARB(GLenum target)
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
    bufObj = buffer_object_get_target( ctx, target, "UnmapBufferARB" );
-   if ( bufObj == NULL ) {
+   if (!bufObj || bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB" );
       return GL_FALSE;
    }
 
-   if ( bufObj->Pointer == NULL ) {
+   if (!bufObj->Pointer) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB");
       return GL_FALSE;
    }
 
-   if ( ctx->Driver.UnmapBuffer != NULL ) {
+   if (ctx->Driver.UnmapBuffer) {
       status = (*ctx->Driver.UnmapBuffer)( ctx, target, bufObj );
    }
 
@@ -899,14 +896,14 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params)
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    bufObj = buffer_object_get_target( ctx, target, "GetBufferParameterivARB" );
-   if (!bufObj) {
+   if (!bufObj || bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "GetBufferParameterivARB" );
       return;
    }
 
    switch (pname) {
       case GL_BUFFER_SIZE_ARB:
-         *params = bufObj->Size;
+         *params = (GLint) bufObj->Size;
          break;
       case GL_BUFFER_USAGE_ARB:
          *params = bufObj->Usage;
@@ -937,7 +934,7 @@ _mesa_GetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params)
    }
 
    bufObj = buffer_object_get_target( ctx, target, "GetBufferPointervARB" );
-   if ( bufObj == NULL ) {
+   if (!bufObj || bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferPointervARB" );
       return;
    }