[Mesa-dev] [PATCH 5/5] mesa: Fix bug about "what if we didn't find the VBO"?
Eric Anholt
eric at anholt.net
Thu Oct 31 19:50:24 CET 2013
There was some spec text, and what there isn't text for we have obvious
intended behavior from other buffer object bindings.
---
src/mesa/main/bufferobj.c | 16 ++++++++--------
src/mesa/main/bufferobj.h | 8 +++++++-
src/mesa/main/varray.c | 19 ++++++++++---------
3 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index 2d57cab..ef5fbce 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -655,11 +655,11 @@ _mesa_free_buffer_objects( struct gl_context *ctx )
}
}
-static bool
-handle_bind_buffer_gen(struct gl_context *ctx,
- GLenum target,
- GLuint buffer,
- struct gl_buffer_object **buf_handle)
+bool
+_mesa_handle_bind_buffer_gen(struct gl_context *ctx,
+ GLenum target,
+ GLuint buffer,
+ struct gl_buffer_object **buf_handle)
{
struct gl_buffer_object *buf = *buf_handle;
@@ -719,7 +719,7 @@ bind_buffer_object(struct gl_context *ctx, GLenum target, GLuint buffer)
else {
/* non-default buffer object */
newBufObj = _mesa_lookup_bufferobj(ctx, buffer);
- if (!handle_bind_buffer_gen(ctx, target, buffer, &newBufObj))
+ if (!_mesa_handle_bind_buffer_gen(ctx, target, buffer, &newBufObj))
return;
}
@@ -2181,7 +2181,7 @@ _mesa_BindBufferRange(GLenum target, GLuint index,
} else {
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
}
- if (!handle_bind_buffer_gen(ctx, target, buffer, &bufObj))
+ if (!_mesa_handle_bind_buffer_gen(ctx, target, buffer, &bufObj))
return;
if (!bufObj) {
@@ -2227,7 +2227,7 @@ _mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer)
} else {
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
}
- if (!handle_bind_buffer_gen(ctx, target, buffer, &bufObj))
+ if (!_mesa_handle_bind_buffer_gen(ctx, target, buffer, &bufObj))
return;
if (!bufObj) {
diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h
index 9b582f8c..503223d 100644
--- a/src/mesa/main/bufferobj.h
+++ b/src/mesa/main/bufferobj.h
@@ -28,7 +28,7 @@
#ifndef BUFFEROBJ_H
#define BUFFEROBJ_H
-
+#include <stdbool.h>
#include "mtypes.h"
@@ -88,6 +88,12 @@ _mesa_reference_buffer_object(struct gl_context *ctx,
_mesa_reference_buffer_object_(ctx, ptr, bufObj);
}
+bool
+_mesa_handle_bind_buffer_gen(struct gl_context *ctx,
+ GLenum target,
+ GLuint buffer,
+ struct gl_buffer_object **buf_handle);
+
extern GLuint
_mesa_total_buffer_object_memory(struct gl_context *ctx);
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index ed3d047..71d13a7 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -1400,17 +1400,18 @@ _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
} else if (buffer != 0) {
vbo = _mesa_lookup_bufferobj(ctx, buffer);
- /* The ARB_vertex_attrib_binding spec doesn't specify that an error
- * should be generated when <buffer> doesn't refer to a valid buffer
- * object, but we assume that this is an oversight.
+ /* From the GL_ARB_vertex_attrib_array spec:
+ *
+ * "[Core profile only:]
+ * An INVALID_OPERATION error is generated if buffer is not zero or a
+ * name returned from a previous call to GenBuffers, or if such a name
+ * has since been deleted with DeleteBuffers.
+ *
+ * Otherwise, we fall back to the same compat profile behavior as other
+ * object references (automatically gen it).
*/
- if (!vbo) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBindVertexBuffer(buffer=%u is not a valid "
- "buffer object)",
- buffer);
+ if (!_mesa_handle_bind_buffer_gen(ctx, GL_ARRAY_BUFFER, buffer, &vbo))
return;
- }
} else {
/* The ARB_vertex_attrib_binding spec says:
*
--
1.8.4.rc3
More information about the mesa-dev
mailing list