mesa: Add _mesa_lookup_vao_err
authorFredrik Höglund <fredrik@kde.org>
Mon, 2 Mar 2015 17:24:36 +0000 (18:24 +0100)
committerFredrik Höglund <fredrik@kde.org>
Fri, 8 May 2015 13:31:02 +0000 (15:31 +0200)
This is a convenience function that generates GL_INVALID_OPERATION
when the array object doesn't exist.

Reviewed-by: Laura Ekstrand <laura@jlekstrand.net>
src/mesa/main/arrayobj.c
src/mesa/main/arrayobj.h

index ea56154f1ca82f561ce1f0e4d9e1135d4d3471fe..33c6a45953993c7f886191fb130d9c1673ac1a4a 100644 (file)
@@ -74,6 +74,53 @@ _mesa_lookup_vao(struct gl_context *ctx, GLuint id)
 }
 
 
+/**
+ * Looks up the array object for the given ID.
+ *
+ * Unlike _mesa_lookup_vao, this function generates a GL_INVALID_OPERATION
+ * error if the array object does not exist. It also returns the default
+ * array object when ctx is a compatibility profile context and id is zero.
+ */
+struct gl_vertex_array_object *
+_mesa_lookup_vao_err(struct gl_context *ctx, GLuint id, const char *caller)
+{
+   /* The ARB_direct_state_access specification says:
+    *
+    *    "<vaobj> is [compatibility profile:
+    *     zero, indicating the default vertex array object, or]
+    *     the name of the vertex array object."
+    */
+   if (id == 0) {
+      if (ctx->API == API_OPENGL_CORE) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "%s(zero is not valid vaobj name in a core profile "
+                     "context)", caller);
+         return NULL;
+      }
+
+      return ctx->Array.DefaultVAO;
+   } else {
+      struct gl_vertex_array_object *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) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "%s(non-existent vaobj=%u)", caller, id);
+         return NULL;
+      }
+
+      return vao;
+   }
+}
+
+
 /**
  * For all the vertex binding points in the array object, unbind any pointers
  * to any buffer objects (VBOs).
index ae671e3afcf6bcf3910445b89d97393fb5069975..1e7436bfc55215dd9440511804339430614088e1 100644 (file)
@@ -48,6 +48,9 @@ struct gl_context;
 extern struct gl_vertex_array_object *
 _mesa_lookup_vao(struct gl_context *ctx, GLuint id);
 
+extern struct gl_vertex_array_object *
+_mesa_lookup_vao_err(struct gl_context *ctx, GLuint id, const char *caller);
+
 extern struct gl_vertex_array_object *
 _mesa_new_vao(struct gl_context *ctx, GLuint name);