Index: media-libs/mesa/files/7.9-glisbuffer.patch |
diff --git a/media-libs/mesa/files/7.9-glisbuffer.patch b/media-libs/mesa/files/7.9-glisbuffer.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3004edbb0253705b8980d0d6ecf361a618c8ceac |
--- /dev/null |
+++ b/media-libs/mesa/files/7.9-glisbuffer.patch |
@@ -0,0 +1,84 @@ |
+From c552f273f559968dfd770367e25329baccbcd0c4 Mon Sep 17 00:00:00 2001 |
+From: Brian Paul <brianp@vmware.com> |
+Date: Thu, 11 Nov 2010 21:47:30 +0000 |
+Subject: mesa: make glIsBuffer() return false for never bound buffers |
+ |
+Use a dummy buffer object as we do for frame/renderbuffer objects. |
+Fixes http://bugs.freedesktop.org/show_bug.cgi?id=31514 |
+ |
+Note: this is a candidate for the 7.9 branch. |
+--- |
+diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c |
+index 76f8259..df44fbe 100644 |
+--- a/src/mesa/main/bufferobj.c |
++++ b/src/mesa/main/bufferobj.c |
+@@ -55,6 +55,13 @@ |
+ |
+ |
+ /** |
++ * Used as a placeholder for buffer objects between glGenBuffers() and |
++ * glBindBuffer() so that glIsBuffer() can work correctly. |
++ */ |
++static struct gl_buffer_object DummyBufferObject; |
++ |
++ |
++/** |
+ * Return pointer to address of a buffer object target. |
+ * \param ctx the GL context |
+ * \param target the buffer object target to be retrieved. |
+@@ -548,6 +555,9 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx, |
+ void |
+ _mesa_init_buffer_objects( struct gl_context *ctx ) |
+ { |
++ memset(&DummyBufferObject, 0, sizeof(DummyBufferObject)); |
++ DummyBufferObject.RefCount = 1000*1000*1000; /* never delete */ |
++ |
+ _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, |
+ ctx->Shared->NullBufferObj); |
+ _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, |
+@@ -605,8 +615,10 @@ bind_buffer_object(struct gl_context *ctx, GLenum target, GLuint buffer) |
+ 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 */ |
++ if (!newBufObj || newBufObj == &DummyBufferObject) { |
++ /* If this is a new buffer object id, or one which was generated but |
++ * never used before, allocate a buffer object now. |
++ */ |
+ ASSERT(ctx->Driver.NewBufferObject); |
+ newBufObj = ctx->Driver.NewBufferObject(ctx, buffer, target); |
+ if (!newBufObj) { |
+@@ -1066,18 +1078,10 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer) |
+ |
+ first = _mesa_HashFindFreeKeyBlock(ctx->Shared->BufferObjects, n); |
+ |
+- /* Allocate new, empty buffer objects and return identifiers */ |
++ /* Insert the ID and pointer to dummy buffer object into hash table */ |
+ for (i = 0; i < n; i++) { |
+- struct gl_buffer_object *bufObj; |
+- GLuint name = first + i; |
+- 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; |
+- } |
+- _mesa_HashInsert(ctx->Shared->BufferObjects, first + i, bufObj); |
++ _mesa_HashInsert(ctx->Shared->BufferObjects, first + i, |
++ &DummyBufferObject); |
+ buffer[i] = first + i; |
+ } |
+ |
+@@ -1103,7 +1107,7 @@ _mesa_IsBufferARB(GLuint id) |
+ bufObj = _mesa_lookup_bufferobj(ctx, id); |
+ _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); |
+ |
+- return bufObj ? GL_TRUE : GL_FALSE; |
++ return bufObj && bufObj != &DummyBufferObject; |
+ } |
+ |
+ |
+-- |
+cgit v0.8.3-6-g21f6 |