Signed-off-by: Timothy Arceri <[email protected]> --- 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 _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
