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;



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to