OLD | NEW |
(Empty) | |
| 1 From c552f273f559968dfd770367e25329baccbcd0c4 Mon Sep 17 00:00:00 2001 |
| 2 From: Brian Paul <brianp@vmware.com> |
| 3 Date: Thu, 11 Nov 2010 21:47:30 +0000 |
| 4 Subject: mesa: make glIsBuffer() return false for never bound buffers |
| 5 |
| 6 Use a dummy buffer object as we do for frame/renderbuffer objects. |
| 7 Fixes http://bugs.freedesktop.org/show_bug.cgi?id=31514 |
| 8 |
| 9 Note: this is a candidate for the 7.9 branch. |
| 10 --- |
| 11 diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c |
| 12 index 76f8259..df44fbe 100644 |
| 13 --- a/src/mesa/main/bufferobj.c |
| 14 +++ b/src/mesa/main/bufferobj.c |
| 15 @@ -55,6 +55,13 @@ |
| 16 |
| 17 |
| 18 /** |
| 19 + * Used as a placeholder for buffer objects between glGenBuffers() and |
| 20 + * glBindBuffer() so that glIsBuffer() can work correctly. |
| 21 + */ |
| 22 +static struct gl_buffer_object DummyBufferObject; |
| 23 + |
| 24 + |
| 25 +/** |
| 26 * Return pointer to address of a buffer object target. |
| 27 * \param ctx the GL context |
| 28 * \param target the buffer object target to be retrieved. |
| 29 @@ -548,6 +555,9 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx, |
| 30 void |
| 31 _mesa_init_buffer_objects( struct gl_context *ctx ) |
| 32 { |
| 33 + memset(&DummyBufferObject, 0, sizeof(DummyBufferObject)); |
| 34 + DummyBufferObject.RefCount = 1000*1000*1000; /* never delete */ |
| 35 + |
| 36 _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, |
| 37 ctx->Shared->NullBufferObj); |
| 38 _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, |
| 39 @@ -605,8 +615,10 @@ bind_buffer_object(struct gl_context *ctx, GLenum target, G
Luint buffer) |
| 40 else { |
| 41 /* non-default buffer object */ |
| 42 newBufObj = _mesa_lookup_bufferobj(ctx, buffer); |
| 43 - if (!newBufObj) { |
| 44 - /* if this is a new buffer object id, allocate a buffer object now */ |
| 45 + if (!newBufObj || newBufObj == &DummyBufferObject) { |
| 46 + /* If this is a new buffer object id, or one which was generated but |
| 47 + * never used before, allocate a buffer object now. |
| 48 + */ |
| 49 ASSERT(ctx->Driver.NewBufferObject); |
| 50 newBufObj = ctx->Driver.NewBufferObject(ctx, buffer, target); |
| 51 if (!newBufObj) { |
| 52 @@ -1066,18 +1078,10 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer) |
| 53 |
| 54 first = _mesa_HashFindFreeKeyBlock(ctx->Shared->BufferObjects, n); |
| 55 |
| 56 - /* Allocate new, empty buffer objects and return identifiers */ |
| 57 + /* Insert the ID and pointer to dummy buffer object into hash table */ |
| 58 for (i = 0; i < n; i++) { |
| 59 - struct gl_buffer_object *bufObj; |
| 60 - GLuint name = first + i; |
| 61 - GLenum target = 0; |
| 62 - bufObj = ctx->Driver.NewBufferObject( ctx, name, target ); |
| 63 - if (!bufObj) { |
| 64 - _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); |
| 65 - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenBuffersARB"); |
| 66 - return; |
| 67 - } |
| 68 - _mesa_HashInsert(ctx->Shared->BufferObjects, first + i, bufObj); |
| 69 + _mesa_HashInsert(ctx->Shared->BufferObjects, first + i, |
| 70 + &DummyBufferObject); |
| 71 buffer[i] = first + i; |
| 72 } |
| 73 |
| 74 @@ -1103,7 +1107,7 @@ _mesa_IsBufferARB(GLuint id) |
| 75 bufObj = _mesa_lookup_bufferobj(ctx, id); |
| 76 _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); |
| 77 |
| 78 - return bufObj ? GL_TRUE : GL_FALSE; |
| 79 + return bufObj && bufObj != &DummyBufferObject; |
| 80 } |
| 81 |
| 82 |
| 83 -- |
| 84 cgit v0.8.3-6-g21f6 |
OLD | NEW |