[Mesa-dev] [PATCH 01/10] mesa: split vertex_array_vertex_buffer() in two
Dieter Nützel
Dieter at nuetzel-hh.de
Mon May 22 23:19:41 UTC 2017
For the series:
Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>
on radeonsi/RX580
Dieter
Am 22.05.2017 07:46, schrieb Timothy Arceri:
> 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)
> {
More information about the mesa-dev
mailing list