This will allow us to skip the error checkes when adding KHR_no_error support.
Reviewed-by: Nicolai Hähnle <[email protected]> --- 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 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
