Remove screenConfigs from __DRIscreen.
[mesa.git] / src / mesa / main / bufferobj.c
index 134f2b510620647c3cbf478ce72997adf9a9c3f4..9ad2dccc1243683d76f2e58a7322f2e54429a911 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5
+ * Version:  6.5.1
  *
  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  *
  * \param ctx     GL context
  * \param target  Buffer object target to be retrieved.  Currently this must
  *                be either \c GL_ARRAY_BUFFER or \c GL_ELEMENT_ARRAY_BUFFER.
- * \param caller  Name of calling function for recording errors.
  * \return   A pointer to the buffer object bound to \c target in the
- *           specified context or \c NULL if \c target is invalid or no
- *           buffer object is bound.
+ *           specified context or \c NULL if \c target is invalid.
  */
 static INLINE struct gl_buffer_object *
-buffer_object_get_target(GLcontext *ctx, GLenum target, const char *caller)
+get_buffer(GLcontext *ctx, GLenum target)
 {
    struct gl_buffer_object * bufObj = NULL;
 
@@ -68,12 +66,12 @@ buffer_object_get_target(GLcontext *ctx, GLenum target, const char *caller)
          bufObj = ctx->Unpack.BufferObj;
          break;
       default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(target)", caller);
+         /* error must be recorded by caller */
          return NULL;
    }
 
-   if (bufObj->Name == 0)
-      return NULL;
+   /* bufObj should point to NullBufferObj or a user-created buffer object */
+   ASSERT(bufObj);
 
    return bufObj;
 }
@@ -112,17 +110,20 @@ buffer_object_subdata_range_good( GLcontext * ctx, GLenum target,
       return NULL;
    }
 
-   bufObj = buffer_object_get_target(ctx, target, caller);
-   if (!bufObj || bufObj->Name == 0) {
+   bufObj = get_buffer(ctx, target);
+   if (!bufObj) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", caller);
       return NULL;
    }
-
-   if ((GLuint) (offset + size) > bufObj->Size) {
+   if (bufObj->Name == 0) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "%s", caller);
+      return NULL;
+   }
+   if (offset + size > bufObj->Size) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                  "%s(size + offset > buffer size)", caller);
       return NULL;
    }
-
    if (bufObj->Pointer) {
       /* Buffer is currently mapped */
       _mesa_error(ctx, GL_INVALID_OPERATION, "%s", caller);
@@ -169,6 +170,22 @@ _mesa_delete_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
 }
 
 
+void
+_mesa_unbind_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
+{
+   if (bufObj != ctx->Array.NullBufferObj) {
+      bufObj->RefCount--;
+      if (bufObj->RefCount <= 0) {
+        ASSERT(ctx->Array.ArrayBufferObj != bufObj);
+        ASSERT(ctx->Array.ElementArrayBufferObj != bufObj);
+        ASSERT(ctx->Array.ArrayObj->Vertex.BufferObj != bufObj);
+        ASSERT(ctx->Driver.DeleteBuffer);
+        ctx->Driver.DeleteBuffer(ctx, bufObj);
+      }
+   }
+}
+
+
 /**
  * Initialize a buffer object to default values.
  */
@@ -279,7 +296,10 @@ _mesa_buffer_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
 {
    (void) ctx; (void) target;
 
-   if (bufObj->Data && ((GLuint) (size + offset) <= bufObj->Size)) {
+   /* this should have been caught in _mesa_BufferSubData() */
+   ASSERT(size + offset <= bufObj->Size);
+
+   if (bufObj->Data) {
       _mesa_memcpy( (GLubyte *) bufObj->Data + offset, data, size );
    }
 }
@@ -319,9 +339,9 @@ _mesa_buffer_get_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
 /**
  * Fallback function called via ctx->Driver.MapBuffer().
  * Hardware drivers that really implement buffer objects should never use
- * function.
+ * this function.
  *
- * The input parameters will have been already tested for errors.
+ * The function parameters will have been already tested for errors.
  *
  * \param ctx     GL context.
  * \param target  Buffer object target on which to operate.
@@ -378,8 +398,6 @@ _mesa_buffer_unmap( GLcontext *ctx, GLenum target,
 void
 _mesa_init_buffer_objects( GLcontext *ctx )
 {
-   GLuint i;
-
    /* Allocate the default buffer object and set refcount so high that
     * it never gets deleted.
     */
@@ -389,24 +407,104 @@ _mesa_init_buffer_objects( GLcontext *ctx )
 
    ctx->Array.ArrayBufferObj = ctx->Array.NullBufferObj;
    ctx->Array.ElementArrayBufferObj = ctx->Array.NullBufferObj;
+}
 
-   /* Vertex array buffers */
-   ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj;
-   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
-      ctx->Array.TexCoord[i].BufferObj = ctx->Array.NullBufferObj;
+/**
+ * Bind the specified target to buffer for the specified context.
+ */
+static void
+bind_buffer_object(GLcontext *ctx, GLenum target, GLuint buffer)
+{
+   struct gl_buffer_object *oldBufObj;
+   struct gl_buffer_object *newBufObj = NULL;
+   struct gl_buffer_object **bindTarget = NULL;
+
+   switch (target) {
+   case GL_ARRAY_BUFFER_ARB:
+      bindTarget = &ctx->Array.ArrayBufferObj;
+      break;
+   case GL_ELEMENT_ARRAY_BUFFER_ARB:
+      bindTarget = &ctx->Array.ElementArrayBufferObj;
+      break;
+   case GL_PIXEL_PACK_BUFFER_EXT:
+      bindTarget = &ctx->Pack.BufferObj;
+      break;
+   case GL_PIXEL_UNPACK_BUFFER_EXT:
+      bindTarget = &ctx->Unpack.BufferObj;
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferARB(target)");
+      return;
+   }
+
+   /* Get pointer to old buffer object (to be unbound) */
+   oldBufObj = get_buffer(ctx, target);
+   if (oldBufObj && oldBufObj->Name == buffer)
+      return;   /* rebinding the same buffer object- no change */
+
+   /*
+    * Get pointer to new buffer object (newBufObj)
+    */
+   if (buffer == 0) {
+      /* The spec says there's not a buffer object named 0, but we use
+       * one internally because it simplifies things.
+       */
+      newBufObj = ctx->Array.NullBufferObj;
+   }
+   else {
+      /* non-default buffer object */
+      newBufObj = _mesa_lookup_bufferobj(ctx, buffer);
+      if (!newBufObj) {
+         /* if this is a new buffer object id, allocate a buffer object now */
+         ASSERT(ctx->Driver.NewBufferObject);
+         newBufObj = ctx->Driver.NewBufferObject(ctx, buffer, target);
+         if (!newBufObj) {
+            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindBufferARB");
+            return;
+         }
+         _mesa_save_buffer_object(ctx, newBufObj);
+      }
    }
-   ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
-   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
-      ctx->Array.VertexAttrib[i].BufferObj = ctx->Array.NullBufferObj;
+   
+   /* Make new binding */
+   *bindTarget = newBufObj;
+   newBufObj->RefCount++;
+
+   /* Pass BindBuffer call to device driver */
+   if (ctx->Driver.BindBuffer && newBufObj)
+      ctx->Driver.BindBuffer( ctx, target, newBufObj );
+
+   /* decr ref count on old buffer obj, delete if needed */
+   if (oldBufObj) {
+      oldBufObj->RefCount--;
+      assert(oldBufObj->RefCount >= 0);
+      if (oldBufObj->RefCount == 0) {
+         assert(oldBufObj->Name != 0);
+         ASSERT(ctx->Driver.DeleteBuffer);
+         ctx->Driver.DeleteBuffer( ctx, oldBufObj );
+      }
    }
 }
 
 
+/**
+ * Update the default buffer objects in the given context to reference those
+ * specified in the shared state and release those referencing the old 
+ * shared state.
+ */
+void
+_mesa_update_default_objects_buffer_objects(GLcontext *ctx)
+{
+   /* Bind the NullBufferObj to remove references to those
+    * in the shared context hash table.
+    */
+   bind_buffer_object( ctx, GL_ARRAY_BUFFER_ARB, 0);
+   bind_buffer_object( ctx, GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+   bind_buffer_object( ctx, GL_PIXEL_PACK_BUFFER_ARB, 0);
+   bind_buffer_object( ctx, GL_PIXEL_UNPACK_BUFFER_ARB, 0);
+}
+
+
 /**
  * When we're about to read pixel data out of a PBO (via glDrawPixels,
  * glTexImage, etc) or write data into a PBO (via glReadPixels,
@@ -466,6 +564,20 @@ _mesa_validate_pbo_access(GLuint dimensions,
 }
 
 
+/**
+ * Return the gl_buffer_object for the given ID.
+ * Always return NULL for ID 0.
+ */
+struct gl_buffer_object *
+_mesa_lookup_bufferobj(GLcontext *ctx, GLuint buffer)
+{
+   if (buffer == 0)
+      return NULL;
+   else
+      return (struct gl_buffer_object *)
+         _mesa_HashLookup(ctx->Shared->BufferObjects, buffer);
+}
+
 
 
 /**********************************************************************/
@@ -476,71 +588,9 @@ void GLAPIENTRY
 _mesa_BindBufferARB(GLenum target, GLuint buffer)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct gl_buffer_object *oldBufObj;
-   struct gl_buffer_object *newBufObj = NULL;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   oldBufObj = buffer_object_get_target( ctx, target, "BindBufferARB" );
-   if (oldBufObj && oldBufObj->Name == buffer)
-      return;   /* rebinding the same buffer object- no change */
-
-   /*
-    * Get pointer to new buffer object (newBufObj)
-    */
-   if (buffer == 0) {
-      /* The spec says there's not a buffer object named 0, but we use
-       * one internally because it simplifies things.
-       */
-      newBufObj = ctx->Array.NullBufferObj;
-   }
-   else {
-      /* non-default buffer object */
-      const struct _mesa_HashTable *hash = ctx->Shared->BufferObjects;
-      newBufObj = (struct gl_buffer_object *) _mesa_HashLookup(hash, buffer);
-      if (!newBufObj) {
-         /* if this is a new buffer object id, allocate a buffer object now */
-         ASSERT(ctx->Driver.NewBufferObject);
-        newBufObj = ctx->Driver.NewBufferObject(ctx, buffer, target);
-         if (!newBufObj) {
-            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindBufferARB");
-            return;
-         }
-         _mesa_save_buffer_object(ctx, newBufObj);
-      }
-      newBufObj->RefCount++;
-   }
-   
-   switch (target) {
-      case GL_ARRAY_BUFFER_ARB:
-         ctx->Array.ArrayBufferObj = newBufObj;
-         break;
-      case GL_ELEMENT_ARRAY_BUFFER_ARB:
-         ctx->Array.ElementArrayBufferObj = newBufObj;
-         break;
-      case GL_PIXEL_PACK_BUFFER_EXT:
-         ctx->Pack.BufferObj = newBufObj;
-         break;
-      case GL_PIXEL_UNPACK_BUFFER_EXT:
-         ctx->Unpack.BufferObj = newBufObj;
-         break;
-      default:
-         _mesa_problem(ctx, "Bad target in _mesa_BindBufferARB");
-         return;
-   }
-
-   /* Pass BindBuffer call to device driver */
-   if (ctx->Driver.BindBuffer && newBufObj)
-      ctx->Driver.BindBuffer( ctx, target, newBufObj );
-
-   if (oldBufObj) {
-      oldBufObj->RefCount--;
-      assert(oldBufObj->RefCount >= 0);
-      if (oldBufObj->RefCount == 0) {
-        assert(oldBufObj->Name != 0);
-        ASSERT(ctx->Driver.DeleteBuffer);
-        ctx->Driver.DeleteBuffer( ctx, oldBufObj );
-      }
-   }
+   bind_buffer_object(ctx, target, buffer);
 }
 
 
@@ -565,90 +615,80 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
    _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
 
    for (i = 0; i < n; i++) {
-      if (ids[i] != 0) {
-         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;
+      struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, ids[i]);
+      if (bufObj) {
+         /* unbind any vertex pointers bound to this buffer */
+         GLuint j;
 
-            ASSERT(bufObj->Name == ids[i]);
+         ASSERT(bufObj->Name == ids[i]);
 
-            if (ctx->Array.Vertex.BufferObj == bufObj) {
-               bufObj->RefCount--;
-               ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj;
-               ctx->Array.NullBufferObj->RefCount++;
-            }
-            if (ctx->Array.Normal.BufferObj == bufObj) {
-               bufObj->RefCount--;
-               ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj;
-               ctx->Array.NullBufferObj->RefCount++;
-            }
-            if (ctx->Array.Color.BufferObj == bufObj) {
-               bufObj->RefCount--;
-               ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj;
-               ctx->Array.NullBufferObj->RefCount++;
-            }
-            if (ctx->Array.SecondaryColor.BufferObj == bufObj) {
-               bufObj->RefCount--;
-               ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
-               ctx->Array.NullBufferObj->RefCount++;
-            }
-            if (ctx->Array.FogCoord.BufferObj == bufObj) {
-               bufObj->RefCount--;
-               ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj;
-               ctx->Array.NullBufferObj->RefCount++;
-            }
-            if (ctx->Array.Index.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->Vertex.BufferObj == bufObj) {
+            bufObj->RefCount--;
+            ctx->Array.ArrayObj->Vertex.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.NullBufferObj->RefCount++;
+         }
+         if (ctx->Array.ArrayObj->Normal.BufferObj == bufObj) {
+            bufObj->RefCount--;
+            ctx->Array.ArrayObj->Normal.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.NullBufferObj->RefCount++;
+         }
+         if (ctx->Array.ArrayObj->Color.BufferObj == bufObj) {
+            bufObj->RefCount--;
+            ctx->Array.ArrayObj->Color.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.NullBufferObj->RefCount++;
+         }
+         if (ctx->Array.ArrayObj->SecondaryColor.BufferObj == bufObj) {
+            bufObj->RefCount--;
+            ctx->Array.ArrayObj->SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.NullBufferObj->RefCount++;
+         }
+         if (ctx->Array.ArrayObj->FogCoord.BufferObj == bufObj) {
+            bufObj->RefCount--;
+            ctx->Array.ArrayObj->FogCoord.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.NullBufferObj->RefCount++;
+         }
+         if (ctx->Array.ArrayObj->Index.BufferObj == bufObj) {
+            bufObj->RefCount--;
+            ctx->Array.ArrayObj->Index.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.NullBufferObj->RefCount++;
+         }
+         if (ctx->Array.ArrayObj->EdgeFlag.BufferObj == bufObj) {
+            bufObj->RefCount--;
+            ctx->Array.ArrayObj->EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.NullBufferObj->RefCount++;
+         }
+         for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
+            if (ctx->Array.ArrayObj->TexCoord[j].BufferObj == bufObj) {
                bufObj->RefCount--;
-               ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj;
+               ctx->Array.ArrayObj->TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
                ctx->Array.NullBufferObj->RefCount++;
             }
-            if (ctx->Array.EdgeFlag.BufferObj == bufObj) {
+         }
+         for (j = 0; j < VERT_ATTRIB_MAX; j++) {
+            if (ctx->Array.ArrayObj->VertexAttrib[j].BufferObj == bufObj) {
                bufObj->RefCount--;
-               ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
+               ctx->Array.ArrayObj->VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
                ctx->Array.NullBufferObj->RefCount++;
             }
-            for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
-               if (ctx->Array.TexCoord[j].BufferObj == bufObj) {
-                  bufObj->RefCount--;
-                  ctx->Array.TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
-                  ctx->Array.NullBufferObj->RefCount++;
-               }
-            }
-            for (j = 0; j < VERT_ATTRIB_MAX; j++) {
-               if (ctx->Array.VertexAttrib[j].BufferObj == bufObj) {
-                  bufObj->RefCount--;
-                  ctx->Array.VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
-                  ctx->Array.NullBufferObj->RefCount++;
-               }
-            }
-
-            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 );
-            }
+         }
 
-            if (ctx->Pack.BufferObj == bufObj) {
-               _mesa_BindBufferARB( GL_PIXEL_PACK_BUFFER_EXT, 0 );
-            }
-            if (ctx->Unpack.BufferObj == bufObj) {
-               _mesa_BindBufferARB( GL_PIXEL_UNPACK_BUFFER_EXT, 0 );
-            }
+         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 );
+         }
 
-            /* The ID is immediately freed for re-use */
-            _mesa_remove_buffer_object(ctx, bufObj);
-            bufObj->RefCount--;
-            if (bufObj->RefCount <= 0) {
-               ASSERT(ctx->Array.ArrayBufferObj != bufObj);
-               ASSERT(ctx->Array.ElementArrayBufferObj != bufObj);
-               ASSERT(ctx->Array.Vertex.BufferObj != bufObj);
-               ASSERT(ctx->Driver.DeleteBuffer);
-               ctx->Driver.DeleteBuffer(ctx, bufObj);
-            }
+         if (ctx->Pack.BufferObj == bufObj) {
+            _mesa_BindBufferARB( GL_PIXEL_PACK_BUFFER_EXT, 0 );
+         }
+         if (ctx->Unpack.BufferObj == bufObj) {
+            _mesa_BindBufferARB( GL_PIXEL_UNPACK_BUFFER_EXT, 0 );
          }
+
+         /* The ID is immediately freed for re-use */
+         _mesa_remove_buffer_object(ctx, bufObj);
+         _mesa_unbind_buffer_object(ctx, bufObj);
       }
    }
 
@@ -715,15 +755,12 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer)
 GLboolean GLAPIENTRY
 _mesa_IsBufferARB(GLuint id)
 {
-   struct gl_buffer_object * bufObj;
+   struct gl_buffer_object *bufObj;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
-   if (id == 0)
-      return GL_FALSE;
-
    _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
-   bufObj = (struct gl_buffer_object *) _mesa_HashLookup(ctx->Shared->BufferObjects, id);
+   bufObj = _mesa_lookup_bufferobj(ctx, id);
    _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
    return bufObj ? GL_TRUE : GL_FALSE;
@@ -760,8 +797,12 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size,
          return;
    }
 
-   bufObj = buffer_object_get_target( ctx, target, "BufferDataARB" );
-   if (!bufObj || bufObj->Name ==0) {
+   bufObj = get_buffer(ctx, target);
+   if (!bufObj) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glBufferDataARB(target)" );
+      return;
+   }
+   if (bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferDataARB" );
       return;
    }
@@ -787,7 +828,7 @@ _mesa_BufferSubDataARB(GLenum target, GLintptrARB offset,
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    bufObj = buffer_object_subdata_range_good( ctx, target, offset, size,
-                                              "BufferSubDataARB" );
+                                              "glBufferSubDataARB" );
    if (!bufObj) {
       /* error already recorded */
       return;
@@ -807,7 +848,7 @@ _mesa_GetBufferSubDataARB(GLenum target, GLintptrARB offset,
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    bufObj = buffer_object_subdata_range_good( ctx, target, offset, size,
-                                              "GetBufferSubDataARB" );
+                                              "glGetBufferSubDataARB" );
    if (!bufObj) {
       /* error already recorded */
       return;
@@ -836,12 +877,15 @@ _mesa_MapBufferARB(GLenum target, GLenum access)
          return NULL;
    }
 
-   bufObj = buffer_object_get_target( ctx, target, "MapBufferARB" );
-   if (!bufObj || bufObj->Name == 0) {
+   bufObj = get_buffer(ctx, target);
+   if (!bufObj) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glMapBufferARB(target)" );
+      return NULL;
+   }
+   if (bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB" );
       return NULL;
    }
-
    if (bufObj->Pointer) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB(already mapped)");
       return NULL;
@@ -867,12 +911,15 @@ _mesa_UnmapBufferARB(GLenum target)
    GLboolean status = GL_TRUE;
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
-   bufObj = buffer_object_get_target( ctx, target, "UnmapBufferARB" );
-   if (!bufObj || bufObj->Name == 0) {
+   bufObj = get_buffer(ctx, target);
+   if (!bufObj) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glUnmapBufferARB(target)" );
+      return GL_FALSE;
+   }
+   if (bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB" );
       return GL_FALSE;
    }
-
    if (!bufObj->Pointer) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB");
       return GL_FALSE;
@@ -896,8 +943,12 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params)
    struct gl_buffer_object *bufObj;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   bufObj = buffer_object_get_target( ctx, target, "GetBufferParameterivARB" );
-   if (!bufObj || bufObj->Name == 0) {
+   bufObj = get_buffer(ctx, target);
+   if (!bufObj) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "GetBufferParameterivARB(target)" );
+      return;
+   }
+   if (bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "GetBufferParameterivARB" );
       return;
    }
@@ -934,8 +985,12 @@ _mesa_GetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params)
       return;
    }
 
-   bufObj = buffer_object_get_target( ctx, target, "GetBufferPointervARB" );
-   if (!bufObj || bufObj->Name == 0) {
+   bufObj = get_buffer(ctx, target);
+   if (!bufObj) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferPointervARB(target)" );
+      return;
+   }
+   if (bufObj->Name == 0) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferPointervARB" );
       return;
    }