[Mesa-dev] [PATCH 1/3] mesa: implement GL_MAX_VERTEX_ATTRIB_STRIDE

Timothy Arceri t_arceri at yahoo.com.au
Thu Aug 14 15:10:08 PDT 2014


Signed-off-by: Timothy Arceri <t_arceri at yahoo.com.au>
---
 Although 4.4 is a while away GL_MAX_VERTEX_ATTRIB_STRIDE is used in
 the ARB_direct_state_access spec so it seemed worth while adding this now.

 I added MAX_VERTEX_ATTRIB_STRIDE to ARB_vertex_attrib_binding.xml
 as it didn't seem like it was worth putting it somewhere on its own
 as its really just a bug fix. Let me know if this should be moved.

 Piglit tests:
 http://lists.freedesktop.org/archives/piglit/2014-August/012149.html

 src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml |  1 +
 src/mesa/main/config.h                           |  5 ++++
 src/mesa/main/get_hash_params.py                 |  1 +
 src/mesa/main/varray.c                           | 29 ++++++++++++++++++++++++
 4 files changed, 36 insertions(+)

diff --git a/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml b/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml
index 0ee6a3c..7e62688 100644
--- a/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml
+++ b/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml
@@ -53,6 +53,7 @@
     <enum name="VERTEX_BINDING_STRIDE" value="0x82D8"/>
     <enum name="MAX_VERTEX_ATTRIB_RELATIVE_OFFSET" value="0x82D9"/>
     <enum name="MAX_VERTEX_ATTRIB_BINDINGS" value="0x82DA"/>
+    <enum name="MAX_VERTEX_ATTRIB_STRIDE" value="0x82E5"/>
 
 </category>
 </OpenGLAPI>
diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h
index 4ec4b75..9513ed5 100644
--- a/src/mesa/main/config.h
+++ b/src/mesa/main/config.h
@@ -204,6 +204,11 @@
 #define MAX_PROGRAM_OUTPUTS            64
 /*@}*/
 
+/** For GL 4.4 */
+/*@{*/
+#define MAX_VERTEX_ATTRIB_STRIDE 2048
+/*@}*/
+
 /** For GL_ARB_vertex_program */
 /*@{*/
 #define MAX_VERTEX_PROGRAM_ADDRESS_REGS 1
diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
index ff85820..2de9ef0 100644
--- a/src/mesa/main/get_hash_params.py
+++ b/src/mesa/main/get_hash_params.py
@@ -763,6 +763,7 @@ descriptor=[
 # GL_ARB_vertex_attrib_binding
   [ "MAX_VERTEX_ATTRIB_RELATIVE_OFFSET", "CONTEXT_ENUM(Const.MaxVertexAttribRelativeOffset), NO_EXTRA" ],
   [ "MAX_VERTEX_ATTRIB_BINDINGS", "CONTEXT_ENUM(Const.MaxVertexAttribBindings), NO_EXTRA" ],
+  [ "MAX_VERTEX_ATTRIB_STRIDE", "CONST(MAX_VERTEX_ATTRIB_STRIDE), NO_EXTRA" ],
 
 # GL_ARB_shader_image_load_store
   [ "MAX_IMAGE_UNITS", "CONTEXT_INT(Const.MaxImageUnits), extra_ARB_shader_image_load_store"],
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index 230fb30..6b43260 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -655,6 +655,13 @@ _mesa_VertexAttribPointer(GLuint index, GLint size, GLenum type,
       return;
    }
 
+   if (ctx->API == API_OPENGL_CORE && ctx->Version >= 44 &&
+       stride > MAX_VERTEX_ATTRIB_STRIDE) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointer(stride=%d > "
+                  "GL_MAX_VERTEX_ATTRIB_STRIDE)", stride);
+      return;
+   }
+
    update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index),
                 legalTypes, 1, BGRA_OR_4,
                 size, type, stride, normalized, GL_FALSE, ptr);
@@ -683,6 +690,13 @@ _mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
       return;
    }
 
+   if (ctx->API == API_OPENGL_CORE && ctx->Version >= 44 &&
+       stride > MAX_VERTEX_ATTRIB_STRIDE) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(stride=%d > "
+                  "GL_MAX_VERTEX_ATTRIB_STRIDE)", stride);
+      return;
+   }
+
    update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index),
                 legalTypes, 1, 4,
                 size, type, stride, normalized, integer, ptr);
@@ -1437,6 +1451,13 @@ _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
       return;
    }
 
+   if (ctx->API == API_OPENGL_CORE && ctx->Version >= 44 &&
+       stride > MAX_VERTEX_ATTRIB_STRIDE) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glBindVertexBuffer(stride=%d > "
+                  "GL_MAX_VERTEX_ATTRIB_STRIDE)", stride);
+      return;
+   }
+
    if (buffer == vao->VertexBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj->Name) {
       vbo = vao->VertexBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj;
    } else if (buffer != 0) {
@@ -1565,6 +1586,14 @@ _mesa_BindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers,
          continue;
       }
 
+      if (ctx->API == API_OPENGL_CORE && ctx->Version >= 44 &&
+          strides[i] > MAX_VERTEX_ATTRIB_STRIDE) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glBindVertexBuffers(strides[%u]=%d > "
+                     "GL_MAX_VERTEX_ATTRIB_STRIDE)", i, strides[i]);
+         continue;
+      }
+
       if (buffers[i]) {
          struct gl_vertex_buffer_binding *binding =
             &vao->VertexBinding[VERT_ATTRIB_GENERIC(first + i)];
-- 
1.9.3



More information about the mesa-dev mailing list