- 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 );
- }
- }