[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