[Mesa-dev] [PATCH 01/10] mesa: split vertex_array_vertex_buffer() in two
Timothy Arceri
tarceri at itsqueeze.com
Mon May 22 05:46:53 UTC 2017
This will allow us to skip the error checkes when adding
KHR_no_error support.
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
---
src/mesa/main/varray.c | 95 ++++++++++++++++++++++++++++----------------------
1 file changed, 53 insertions(+), 42 deletions(-)
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index 0eb8e62..f33f302 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -1942,31 +1942,73 @@ _mesa_VertexAttribDivisor(GLuint index, GLuint divisor)
* is equivalent to (assuming no errors are generated):
*
* VertexAttribBinding(index, index);
* VertexBindingDivisor(index, divisor);"
*/
vertex_attrib_binding(ctx, vao, genericIndex, genericIndex);
vertex_binding_divisor(ctx, vao, genericIndex, divisor);
}
-/**
- * GL_ARB_vertex_attrib_binding
- */
-static void
+static ALWAYS_INLINE void
vertex_array_vertex_buffer(struct gl_context *ctx,
struct gl_vertex_array_object *vao,
GLuint bindingIndex, GLuint buffer, GLintptr offset,
GLsizei stride, const char *func)
{
struct gl_buffer_object *vbo;
+ if (buffer ==
+ vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj->Name) {
+ vbo = vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj;
+ } else if (buffer != 0) {
+ vbo = _mesa_lookup_bufferobj(ctx, buffer);
+
+ if (!vbo && _mesa_is_gles31(ctx)) {
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", func);
+ return;
+ }
+ /* 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 (!_mesa_handle_bind_buffer_gen(ctx, buffer, &vbo, func))
+ return;
+ } else {
+ /* The ARB_vertex_attrib_binding spec says:
+ *
+ * "If <buffer> is zero, any buffer object attached to this
+ * bindpoint is detached."
+ */
+ vbo = ctx->Shared->NullBufferObj;
+ }
+
+ _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex),
+ vbo, offset, stride);
+}
+
+/**
+ * GL_ARB_vertex_attrib_binding
+ */
+static void
+vertex_array_vertex_buffer_err(struct gl_context *ctx,
+ struct gl_vertex_array_object *vao,
+ GLuint bindingIndex, GLuint buffer,
+ GLintptr offset, GLsizei stride,
+ const char *func)
+{
ASSERT_OUTSIDE_BEGIN_END(ctx);
/* The ARB_vertex_attrib_binding spec says:
*
* "An INVALID_VALUE error is generated if <bindingindex> is greater than
* the value of MAX_VERTEX_ATTRIB_BINDINGS."
*/
if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) {
_mesa_error(ctx, GL_INVALID_VALUE,
"%s(bindingindex=%u > "
@@ -1993,53 +2035,22 @@ vertex_array_vertex_buffer(struct gl_context *ctx,
return;
}
if (((ctx->API == API_OPENGL_CORE && ctx->Version >= 44) || _mesa_is_gles31(ctx)) &&
stride > ctx->Const.MaxVertexAttribStride) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(stride=%d > "
"GL_MAX_VERTEX_ATTRIB_STRIDE)", func, stride);
return;
}
- if (buffer ==
- vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj->Name) {
- vbo = vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj;
- } else if (buffer != 0) {
- vbo = _mesa_lookup_bufferobj(ctx, buffer);
-
- if (!vbo && _mesa_is_gles31(ctx)) {
- _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", func);
- return;
- }
- /* 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 (!_mesa_handle_bind_buffer_gen(ctx, buffer, &vbo, func))
- return;
- } else {
- /* The ARB_vertex_attrib_binding spec says:
- *
- * "If <buffer> is zero, any buffer object attached to this
- * bindpoint is detached."
- */
- vbo = ctx->Shared->NullBufferObj;
- }
-
- _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex),
- vbo, offset, stride);
+ vertex_array_vertex_buffer(ctx, vao, bindingIndex, buffer, offset,
+ stride, func);
}
void GLAPIENTRY
_mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
GLsizei stride)
{
GET_CURRENT_CONTEXT(ctx);
/* The ARB_vertex_attrib_binding spec says:
@@ -2047,45 +2058,45 @@ _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
* "An INVALID_OPERATION error is generated if no vertex array object
* is bound."
*/
if ((ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) &&
ctx->Array.VAO == ctx->Array.DefaultVAO) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glBindVertexBuffer(No array object bound)");
return;
}
- vertex_array_vertex_buffer(ctx, ctx->Array.VAO, bindingIndex,
- buffer, offset, stride, "glBindVertexBuffer");
+ vertex_array_vertex_buffer_err(ctx, ctx->Array.VAO, bindingIndex,
+ buffer, offset, stride,
+ "glBindVertexBuffer");
}
void GLAPIENTRY
_mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer,
GLintptr offset, GLsizei stride)
{
GET_CURRENT_CONTEXT(ctx);
struct gl_vertex_array_object *vao;
/* The ARB_direct_state_access specification says:
*
* "An INVALID_OPERATION error is generated by VertexArrayVertexBuffer
* if <vaobj> is not [compatibility profile: zero or] the name of an
* existing vertex array object."
*/
vao = _mesa_lookup_vao_err(ctx, vaobj, "glVertexArrayVertexBuffer");
if (!vao)
return;
- vertex_array_vertex_buffer(ctx, vao, bindingIndex,
- buffer, offset, stride,
- "glVertexArrayVertexBuffer");
+ vertex_array_vertex_buffer_err(ctx, vao, bindingIndex, buffer, offset,
+ stride, "glVertexArrayVertexBuffer");
}
static void
vertex_array_vertex_buffers(struct gl_context *ctx,
struct gl_vertex_array_object *vao,
GLuint first, GLsizei count, const GLuint *buffers,
const GLintptr *offsets, const GLsizei *strides,
const char *func)
{
--
2.9.4
More information about the mesa-dev
mailing list