[Mesa-dev] [PATCH 03/22] mesa: Keep track of the last looked-up VAO

Brian Paul brianp at vmware.com
Wed Mar 18 16:34:02 PDT 2015


On 03/18/2015 05:18 PM, Fredrik Höglund wrote:
> This saves the cost of repeated hash table lookups when the same
> vertex array object is referenced in a sequence of calls such as:
>
>      glVertexArrayAttribFormat(vao, ...);
>      glVertexArrayAttribBinding(vao, ...);
>      glEnableVertexArrayAttrib(vao, ...);
>      ...
>
> Note that VAO's are container objects that are not shared between
> contexts.

I wonder if this optimization could be put into the hash table functions 
themselves so it would benefit all object types.

-Brian

> ---
>   src/mesa/main/arrayobj.c | 44 ++++++++++++++++++++++++++++----------------
>   src/mesa/main/mtypes.h   |  3 +++
>   2 files changed, 31 insertions(+), 16 deletions(-)
>
> diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
> index ac081b0..862bbb7 100644
> --- a/src/mesa/main/arrayobj.c
> +++ b/src/mesa/main/arrayobj.c
> @@ -100,23 +100,32 @@ _mesa_lookup_vao_err(struct gl_context *ctx, GLuint id, const char *caller)
>
>         return ctx->Array.DefaultVAO;
>      } else {
> -      struct gl_vertex_array_object *vao =
> -         (struct gl_vertex_array_object *)
> -         _mesa_HashLookup(ctx->Array.Objects, id);
> +      struct gl_vertex_array_object *vao;
>
> -      /* The ARB_direct_state_access specification says:
> -       *
> -       *    "An INVALID_OPERATION error is generated if <vaobj> is not
> -       *     [compatibility profile: zero or] the name of an existing
> -       *     vertex array object."
> -       */
> -      if (!vao || !vao->EverBound) {
> -         const char *format = ctx->API == API_OPENGL_CORE ?
> -            "%s(vaobj=%d is not the name of an existing vertex array object)" :
> -            "%s(vaobj=%d is not zero or the name of an existing vertex "
> -            "array object)";
> -         _mesa_error(ctx, GL_INVALID_OPERATION, format, caller, id);
> -         return NULL;
> +      if (ctx->Array.LastLookedUpVAO &&
> +          ctx->Array.LastLookedUpVAO->Name == id) {
> +         vao = ctx->Array.LastLookedUpVAO;
> +      } else {
> +         vao = (struct gl_vertex_array_object *)
> +            _mesa_HashLookup(ctx->Array.Objects, id);
> +
> +         /* The ARB_direct_state_access specification says:
> +          *
> +          *    "An INVALID_OPERATION error is generated if <vaobj> is not
> +          *     [compatibility profile: zero or] the name of an existing
> +          *     vertex array object."
> +          */
> +         if (!vao || !vao->EverBound) {
> +            const char *format = ctx->API == API_OPENGL_CORE ?
> +               "%s(vaobj=%d is not the name of an existing vertex "
> +               "array object)" :
> +               "%s(vaobj=%d is not zero or the name of an existing vertex "
> +               "array object)";
> +            _mesa_error(ctx, GL_INVALID_OPERATION, format, caller, id);
> +            return NULL;
> +         }
> +
> +         _mesa_reference_vao(ctx, &ctx->Array.LastLookedUpVAO, vao);
>         }
>
>         return vao;
> @@ -519,6 +528,9 @@ _mesa_DeleteVertexArrays(GLsizei n, const GLuint *ids)
>   	 /* The ID is immediately freed for re-use */
>   	 remove_array_object(ctx, obj);
>
> +         if (ctx->Array.LastLookedUpVAO == obj)
> +            _mesa_reference_vao(ctx, &ctx->Array.LastLookedUpVAO, NULL);
> +
>            /* Unreference the array object.
>             * If refcount hits zero, the object will be deleted.
>             */
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index c43c6ac..f46f2b2 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1687,6 +1687,9 @@ struct gl_array_attrib
>      /** The default vertex array object */
>      struct gl_vertex_array_object *DefaultVAO;
>
> +   /** The last VAO accessed by a DSA function */
> +   struct gl_vertex_array_object *LastLookedUpVAO;
> +
>      /** Array objects (GL_ARB/APPLE_vertex_array_object) */
>      struct _mesa_HashTable *Objects;
>
>



More information about the mesa-dev mailing list