[Mesa-dev] [PATCH 3/3] mesa: Reorder some tests in update_array_format()

Fredrik Höglund fredrik at kde.org
Thu Mar 5 10:56:41 PST 2015


GL_INVALID_OPERATION should take precedence over GL_INVALID_VALUE
when there is a size error with a packed type.
---
 src/mesa/main/varray.c | 59 +++++++++++++++++++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 17 deletions(-)

diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index 3571f7d..a062639 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -66,6 +66,9 @@
 #define UNSIGNED_INT_10F_11F_11F_REV_BIT  (1 << 14)
 #define ALL_TYPE_BITS                    ((1 << 15) - 1)
 
+#define PACKED_TYPES_MASK (UNSIGNED_INT_2_10_10_10_REV_BIT | \
+                           INT_2_10_10_10_REV_BIT | \
+                           UNSIGNED_INT_10F_11F_11F_REV_BIT)
 
 /** Convert GL datatype enum into a <type>_BIT value seen above */
 static GLbitfield
@@ -288,9 +291,16 @@ update_array_format(struct gl_context *ctx,
     * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
     * must be handled specially.
     */
-   if (ctx->Extensions.EXT_vertex_array_bgra &&
-       sizeMax == BGRA_OR_4 &&
-       size == GL_BGRA) {
+   if (size == GL_BGRA) {
+      if (sizeMax != BGRA_OR_4 || !ctx->Extensions.EXT_vertex_array_bgra) {
+         /* A size error with a packed type is an invalid operation */
+         const GLenum error = typeBit & PACKED_TYPES_MASK ?
+            GL_INVALID_OPERATION : GL_INVALID_VALUE;
+
+         _mesa_error(ctx, error, "%s(size = GL_BGRA)", func);
+         return false;
+      }
+
       /* Page 298 of the PDF of the OpenGL 4.3 (Core Profile) spec says:
        *
        * "An INVALID_OPERATION error is generated under any of the following
@@ -317,16 +327,36 @@ update_array_format(struct gl_context *ctx,
 
       format = GL_BGRA;
       size = 4;
-   }
-   else if (size < sizeMin || size > sizeMax || size > 4) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size);
-      return false;
-   }
+   } else {
+      /* Page 335 of the PDF of the OpenGL 4.5 (Core Profile) spec says:
+       *
+       * "An INVALID_OPERATION error is generated under any of the following
+       *  conditions:
+       *
+       *    • type is INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_REV,
+       *      and size is neither 4 nor BGRA;
+       *    • type is UNSIGNED_INT_10F_11F_11F_REV and size is not 3;"
+       */
+      if (typeBit & (UNSIGNED_INT_2_10_10_10_REV_BIT |
+                     INT_2_10_10_10_REV_BIT) && size != 4) {
+         _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
+         return false;
+      }
 
-   if (typeBit & (UNSIGNED_INT_2_10_10_10_REV_BIT |
-                  INT_2_10_10_10_REV_BIT) && size != 4) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
-      return false;
+      if (type == GL_UNSIGNED_INT_10F_11F_11F_REV && size != 3) {
+         _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
+         return false;
+      }
+
+      /* Page 335 of the PDF of the OpenGL 4.5 (Core Profile) spec says:
+       *
+       * "An INVALID_VALUE error is generated if size is not one of the values
+       *  shown in table 10.2 for the corresponding command."
+       */
+      if (size < sizeMin || size > sizeMax || size > 4) {
+         _mesa_error(ctx, GL_INVALID_VALUE, "%s(size = GL_BGRA)", func);
+         return false;
+      }
    }
 
    /* The ARB_vertex_attrib_binding_spec says:
@@ -342,11 +372,6 @@ update_array_format(struct gl_context *ctx,
       return false;
    }
 
-   if (type == GL_UNSIGNED_INT_10F_11F_11F_REV && size != 3) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
-      return false;
-   }
-
    assert(size <= 4);
 
    elementSize = _mesa_bytes_per_vertex_attrib(size, type);
-- 
1.8.5.3



More information about the mesa-dev mailing list