[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