[Mesa-dev] [PATCH 4/4] mesa: tidy up left over APPLE_vertex_array_object semantics

Nicolai Hähnle nhaehnle at gmail.com
Mon Apr 24 10:13:00 UTC 2017


On 24.04.2017 07:28, Timothy Arceri wrote:
> ---
>  src/mesa/main/arrayobj.c | 11 +----------
>  src/mesa/main/attrib.c   | 23 +++++++----------------
>  src/mesa/main/mtypes.h   | 16 ----------------
>  src/mesa/main/varray.c   |  2 +-
>  4 files changed, 9 insertions(+), 43 deletions(-)
>
> diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
> index c52a07b..82c00fb 100644
> --- a/src/mesa/main/arrayobj.c
> +++ b/src/mesa/main/arrayobj.c
> @@ -443,30 +443,21 @@ _mesa_BindVertexArray( GLuint id )
>     }
>     else {
>        /* non-default array object */
>        newObj = _mesa_lookup_vao(ctx, id);
>        if (!newObj) {
>           _mesa_error(ctx, GL_INVALID_OPERATION,
>                       "glBindVertexArray(non-gen name)");
>           return;
>        }
>
> -      if (!newObj->EverBound) {
> -         /* The "Interactions with APPLE_vertex_array_object" section of the
> -          * GL_ARB_vertex_array_object spec says:
> -          *
> -          *     "The first bind call, either BindVertexArray or
> -          *     BindVertexArrayAPPLE, determines the semantic of the object."
> -          */
> -         newObj->ARBsemantics = GL_TRUE;
> -         newObj->EverBound = GL_TRUE;
> -      }
> +      newObj->EverBound = GL_TRUE;
>     }
>
>     if (ctx->Array.DrawMethod == DRAW_ARRAYS) {
>        /* The _DrawArrays pointer is pointing at the VAO being unbound and
>         * that VAO may be in the process of being deleted. If it's not going
>         * to be deleted, this will have no effect, because the pointer needs
>         * to be updated by the VBO module anyway.
>         *
>         * Before the VBO module can update the pointer, we have to set it
>         * to NULL for drivers not to set up arrays which are not bound,
> diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
> index 87d3276..dbcfb4e 100644
> --- a/src/mesa/main/attrib.c
> +++ b/src/mesa/main/attrib.c
> @@ -1472,23 +1472,20 @@ copy_pixelstore(struct gl_context *ctx,
>  static void
>  copy_array_object(struct gl_context *ctx,
>                    struct gl_vertex_array_object *dest,
>                    struct gl_vertex_array_object *src)
>  {
>     GLuint i;
>
>     /* skip Name */
>     /* skip RefCount */
>
> -   /* In theory must be the same anyway, but on recreate make sure it matches */
> -   dest->ARBsemantics = src->ARBsemantics;
> -
>     for (i = 0; i < ARRAY_SIZE(src->VertexAttrib); i++) {
>        _mesa_copy_client_array(ctx, &dest->_VertexAttrib[i], &src->_VertexAttrib[i]);
>        _mesa_copy_vertex_attrib_array(ctx, &dest->VertexAttrib[i], &src->VertexAttrib[i]);
>        _mesa_copy_vertex_buffer_binding(ctx, &dest->BufferBinding[i], &src->BufferBinding[i]);
>     }
>
>     /* _Enabled must be the same than on push */
>     dest->_Enabled = src->_Enabled;
>     /* The bitmask of bound VBOs needs to match the VertexBinding array */
>     dest->VertexAttribBufferMask = src->VertexAttribBufferMask;
> @@ -1550,56 +1547,50 @@ save_array_attrib(struct gl_context *ctx,
>  }
>
>  /**
>   * Restore the content of src to dest.
>   */
>  static void
>  restore_array_attrib(struct gl_context *ctx,
>                       struct gl_array_attrib *dest,
>                       struct gl_array_attrib *src)
>  {
> +   bool is_vao_name_zero = src->VAO->Name == 0;
> +
>     /* The ARB_vertex_array_object spec says:
>      *
>      *     "BindVertexArray fails and an INVALID_OPERATION error is generated
>      *     if array is not a name returned from a previous call to
>      *     GenVertexArrays, or if such a name has since been deleted with
>      *     DeleteVertexArrays."
>      *
>      * Therefore popping a deleted VAO cannot magically recreate it.
> -    *
> -    * The semantics of objects created using APPLE_vertex_array_objects behave
> -    * differently.  These objects expect to be recreated by pop.  Alas.
>      */
> -   const bool arb_vao = (src->VAO->Name != 0
> -			 && src->VAO->ARBsemantics);
> -
> -   if (arb_vao && !_mesa_IsVertexArray(src->VAO->Name))
> +   if (!is_vao_name_zero && !_mesa_IsVertexArray(src->VAO->Name))
>        return;
>
>     _mesa_BindVertexArray(src->VAO->Name);
>
>     /* Restore or recreate the buffer objects by the names ... */
> -   if (!arb_vao
> -       || src->ArrayBufferObj->Name == 0
> -       || _mesa_IsBuffer(src->ArrayBufferObj->Name)) {
> +   if (is_vao_name_zero || src->ArrayBufferObj->Name == 0 ||
> +       _mesa_IsBuffer(src->ArrayBufferObj->Name)) {
>        /* ... and restore its content */
>        copy_array_attrib(ctx, dest, src, false);
>
>        _mesa_BindBuffer(GL_ARRAY_BUFFER_ARB,
>  			  src->ArrayBufferObj->Name);
>     } else {
>        copy_array_attrib(ctx, dest, src, true);
>     }
>
> -   if (!arb_vao
> -       || src->VAO->IndexBufferObj->Name == 0
> -       || _mesa_IsBuffer(src->VAO->IndexBufferObj->Name))
> +   if (is_vao_name_zero || src->VAO->IndexBufferObj->Name == 0 ||
> +       _mesa_IsBuffer(src->VAO->IndexBufferObj->Name))
>        _mesa_BindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB,
>  			  src->VAO->IndexBufferObj->Name);
>  }
>
>  /**
>   * init/alloc the fields of 'attrib'.
>   * Needs to the init part matching free_array_attrib_data below.
>   */
>  static bool
>  init_array_attrib_data(struct gl_context *ctx,
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 2e3a423..002e692 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1502,36 +1502,20 @@ struct gl_vertex_buffer_binding
>  struct gl_vertex_array_object
>  {
>     /** Name of the VAO as received from glGenVertexArray. */
>     GLuint Name;
>
>     GLint RefCount;
>
>     GLchar *Label;       /**< GL_KHR_debug */
>
>     /**
> -    * Does the VAO use ARB semantics or Apple semantics?
> -    *
> -    * There are several ways in which ARB_vertex_array_object and
> -    * APPLE_vertex_array_object VAOs have differing semantics.  At the very
> -    * least,
> -    *
> -    *     - ARB VAOs require that all array data be sourced from vertex buffer
> -    *       objects, but Apple VAOs do not.
> -    *
> -    *     - ARB VAOs require that names come from GenVertexArrays.
> -    *
> -    * This flag notes which behavior governs this VAO.
> -    */
> -   GLboolean ARBsemantics;
> -
> -   /**
>      * Has this array object been bound?
>      */
>     GLboolean EverBound;
>
>     /**
>      * Derived vertex attribute arrays
>      *
>      * This is a legacy data structure created from gl_vertex_attrib_array and
>      * gl_vertex_buffer_binding, for compatibility with existing driver code.
>      */
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index 78dc004..2fb3c18 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -502,21 +502,21 @@ validate_array(struct gl_context *ctx, const char *func,
>      *     "An INVALID_OPERATION error is generated under any of the following
>      *     conditions:
>      *
>      *     ...
>      *
>      *     * any of the *Pointer commands specifying the location and
>      *       organization of vertex array data are called while zero is bound
>      *       to the ARRAY_BUFFER buffer object binding point (see section
>      *       2.9.6), and the pointer argument is not NULL."
>      */
> -   if (ptr != NULL && vao->ARBsemantics &&
> +   if (ptr != NULL && vao->EverBound &&

The EverBound is an extraneous change and should be unnecessary. With 
that fixed, patches 2-4 are

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


>         !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) {
>        _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
>        return;
>     }
>  }
>
>
>  static bool
>  validate_array_and_format(struct gl_context *ctx, const char *func,
>                            GLuint attrib, GLbitfield legalTypes,
>


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list