diff options
author | Pierre-Eric Pelloux-Prayer <[email protected]> | 2019-11-07 13:47:17 +0100 |
---|---|---|
committer | Pierre-Eric Pelloux-Prayer <[email protected]> | 2019-11-19 08:49:45 +0100 |
commit | 8b6d19413f05077f4d337273a12abb5cbb67c3b5 (patch) | |
tree | 2685c079261aa681dfad437d394704cf7420f750 /src | |
parent | 657396aa10c75e712efd32ed58601ad14b4dc0ef (diff) |
mesa: add ARB_vertex_attrib_binding glVertexArray* functions
We can't simply alias ARB_direct_state_access functions because
those fail if the vao has never been bound before.
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml | 45 | ||||
-rw-r--r-- | src/mapi/glapi/gen/static_data.py | 6 | ||||
-rw-r--r-- | src/mesa/main/tests/dispatch_sanity.cpp | 11 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 87 | ||||
-rw-r--r-- | src/mesa/main/varray.h | 27 |
5 files changed, 171 insertions, 5 deletions
diff --git a/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml b/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml index 9dc57f4612b..2270e6a29c9 100644 --- a/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml +++ b/src/mapi/glapi/gen/ARB_vertex_attrib_binding.xml @@ -46,6 +46,51 @@ <param name="divisor" type="GLuint"/> </function> + <function name="VertexArrayBindVertexBufferEXT"> + <param name="vaobj" type="GLuint"/> + <param name="bindingindex" type="GLuint"/> + <param name="buffer" type="GLuint"/> + <param name="offset" type="GLintptr"/> + <param name="stride" type="GLsizei"/> + </function> + + <function name="VertexArrayVertexAttribFormatEXT"> + <param name="vaobj" type="GLuint"/> + <param name="attribindex" type="GLuint"/> + <param name="size" type="GLint"/> + <param name="type" type="GLenum"/> + <param name="normalized" type="GLboolean"/> + <param name="relativeoffset" type="GLuint"/> + </function> + + <function name="VertexArrayVertexAttribIFormatEXT"> + <param name="vaobj" type="GLuint"/> + <param name="attribindex" type="GLuint"/> + <param name="size" type="GLint"/> + <param name="type" type="GLenum"/> + <param name="relativeoffset" type="GLuint"/> + </function> + + <function name="VertexArrayVertexAttribLFormatEXT"> + <param name="vaobj" type="GLuint"/> + <param name="attribindex" type="GLuint"/> + <param name="size" type="GLint"/> + <param name="type" type="GLenum"/> + <param name="relativeoffset" type="GLuint"/> + </function> + + <function name="VertexArrayVertexAttribBindingEXT"> + <param name="vaobj" type="GLuint"/> + <param name="attribindex" type="GLuint"/> + <param name="bindingindex" type="GLuint"/> + </function> + + <function name="VertexArrayVertexBindingDivisorEXT"> + <param name="vaobj" type="GLuint"/> + <param name="attribindex" type="GLuint"/> + <param name="divisor" type="GLuint"/> + </function> + <enum name="VERTEX_ATTRIB_BINDING" value="0x82D4"/> <enum name="VERTEX_ATTRIB_RELATIVE_OFFSET" value="0x82D5"/> <enum name="VERTEX_BINDING_DIVISOR" value="0x82D6"/> diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py index 7bc95ae383e..335fc87576d 100644 --- a/src/mapi/glapi/gen/static_data.py +++ b/src/mapi/glapi/gen/static_data.py @@ -1625,6 +1625,12 @@ offsets = { "TextureBufferRangeEXT": 1589, "TextureStorage2DMultisampleEXT": 1590, "TextureStorage3DMultisampleEXT": 1591, + "VertexArrayBindVertexBufferEXT": 1592, + "VertexArrayVertexAttribFormatEXT": 1593, + "VertexArrayVertexAttribIFormatEXT": 1594, + "VertexArrayVertexAttribLFormatEXT": 1595, + "VertexArrayVertexAttribBindingEXT": 1596, + "VertexArrayVertexBindingDivisorEXT": 1597, } functions = [ diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index fdd647a3d1e..66b77d09598 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -869,11 +869,12 @@ const struct function common_desktop_functions_possible[] = { { "glVertexAttribLFormat", 43, -1 }, { "glVertexAttribBinding", 43, -1 }, { "glVertexBindingDivisor", 43, -1 }, -// { "glVertexArrayBindVertexBufferEXT", 43, -1 }, // XXX: Add to xml -// { "glVertexArrayVertexAttribFormatEXT", 43, -1 }, // XXX: Add to xml -// { "glVertexArrayVertexAttribIFormatEXT", 43, -1 }, // XXX: Add to xml -// { "glVertexArrayVertexAttribBindingEXT", 43, -1 }, // XXX: Add to xml -// { "glVertexArrayVertexBindingDivisorEXT", 43, -1 }, // XXX: Add to xml + { "glVertexArrayBindVertexBufferEXT", 43, -1 }, + { "glVertexArrayVertexAttribFormatEXT", 43, -1 }, + { "glVertexArrayVertexAttribIFormatEXT", 43, -1 }, + { "glVertexArrayVertexAttribLFormatEXT", 43, -1 }, + { "glVertexArrayVertexAttribBindingEXT", 43, -1 }, + { "glVertexArrayVertexBindingDivisorEXT", 43, -1 }, { "glFramebufferParameteri", 43, -1 }, { "glGetFramebufferParameteriv", 43, -1 }, { "glNamedFramebufferParameteriEXT", 43, -1 }, diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 0d272ed9c30..f93ad810984 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -2775,6 +2775,21 @@ _mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer, } +void GLAPIENTRY +_mesa_VertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingIndex, GLuint buffer, + GLintptr offset, GLsizei stride) +{ + GET_CURRENT_CONTEXT(ctx); + struct gl_vertex_array_object *vao; + vao = _mesa_lookup_vao_err(ctx, vaobj, true, "glVertexArrayBindVertexBufferEXT"); + if (!vao) + return; + + vertex_array_vertex_buffer_err(ctx, vao, bindingIndex, buffer, offset, + stride, "glVertexArrayBindVertexBufferEXT"); +} + + static ALWAYS_INLINE void vertex_array_vertex_buffers(struct gl_context *ctx, struct gl_vertex_array_object *vao, @@ -3138,6 +3153,18 @@ _mesa_VertexArrayAttribFormat(GLuint vaobj, GLuint attribIndex, GLint size, void GLAPIENTRY +_mesa_VertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribIndex, GLint size, + GLenum type, GLboolean normalized, + GLuint relativeOffset) +{ + vertex_array_attrib_format(vaobj, true, attribIndex, size, type, normalized, + GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK, + BGRA_OR_4, relativeOffset, + "glVertexArrayVertexAttribFormatEXT"); +} + + +void GLAPIENTRY _mesa_VertexArrayAttribIFormat(GLuint vaobj, GLuint attribIndex, GLint size, GLenum type, GLuint relativeOffset) @@ -3150,6 +3177,18 @@ _mesa_VertexArrayAttribIFormat(GLuint vaobj, GLuint attribIndex, void GLAPIENTRY +_mesa_VertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribIndex, + GLint size, GLenum type, + GLuint relativeOffset) +{ + vertex_array_attrib_format(vaobj, true, attribIndex, size, type, GL_FALSE, + GL_TRUE, GL_FALSE, ATTRIB_IFORMAT_TYPES_MASK, + 4, relativeOffset, + "glVertexArrayVertexAttribIFormatEXT"); +} + + +void GLAPIENTRY _mesa_VertexArrayAttribLFormat(GLuint vaobj, GLuint attribIndex, GLint size, GLenum type, GLuint relativeOffset) @@ -3161,6 +3200,18 @@ _mesa_VertexArrayAttribLFormat(GLuint vaobj, GLuint attribIndex, } +void GLAPIENTRY +_mesa_VertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribIndex, + GLint size, GLenum type, + GLuint relativeOffset) +{ + vertex_array_attrib_format(vaobj, true, attribIndex, size, type, GL_FALSE, + GL_FALSE, GL_TRUE, ATTRIB_LFORMAT_TYPES_MASK, + 4, relativeOffset, + "glVertexArrayVertexAttribLFormatEXT"); +} + + static void vertex_array_attrib_binding(struct gl_context *ctx, struct gl_vertex_array_object *vao, @@ -3267,6 +3318,20 @@ _mesa_VertexArrayAttribBinding(GLuint vaobj, GLuint attribIndex, GLuint bindingI } +void GLAPIENTRY +_mesa_VertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribIndex, GLuint bindingIndex) +{ + GET_CURRENT_CONTEXT(ctx); + struct gl_vertex_array_object *vao; + vao = _mesa_lookup_vao_err(ctx, vaobj, true, "glVertexArrayVertexAttribBindingEXT"); + if (!vao) + return; + + vertex_array_attrib_binding(ctx, vao, attribIndex, bindingIndex, + "glVertexArrayVertexAttribBindingEXT"); +} + + static void vertex_array_binding_divisor(struct gl_context *ctx, struct gl_vertex_array_object *vao, @@ -3362,6 +3427,28 @@ _mesa_VertexArrayBindingDivisor(GLuint vaobj, GLuint bindingIndex, } +void GLAPIENTRY +_mesa_VertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingIndex, + GLuint divisor) +{ + struct gl_vertex_array_object *vao; + GET_CURRENT_CONTEXT(ctx); + + /* The ARB_direct_state_access specification says: + * + * "An INVALID_OPERATION error is generated by VertexArrayBindingDivisor + * if <vaobj> is not [compatibility profile: zero or] the name of an + * existing vertex array object." + */ + vao = _mesa_lookup_vao_err(ctx, vaobj, true, "glVertexArrayVertexBindingDivisorEXT"); + if (!vao) + return; + + vertex_array_binding_divisor(ctx, vao, bindingIndex, divisor, + "glVertexArrayVertexBindingDivisorEXT"); +} + + void _mesa_copy_vertex_attrib_array(struct gl_context *ctx, struct gl_array_attributes *dst, diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h index 9c1ed9efeac..247fcb1d7f7 100644 --- a/src/mesa/main/varray.h +++ b/src/mesa/main/varray.h @@ -355,6 +355,10 @@ extern void GLAPIENTRY _mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer, GLintptr offset, GLsizei stride); +extern void GLAPIENTRY +_mesa_VertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingIndex, GLuint buffer, + GLintptr offset, GLsizei stride); + void GLAPIENTRY _mesa_BindVertexBuffers_no_error(GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, @@ -385,6 +389,11 @@ _mesa_VertexArrayAttribFormat(GLuint vaobj, GLuint attribIndex, GLint size, GLuint relativeOffset); extern void GLAPIENTRY +_mesa_VertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribIndex, GLint size, + GLenum type, GLboolean normalized, + GLuint relativeOffset); + +extern void GLAPIENTRY _mesa_VertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type, GLuint relativeOffset); @@ -394,6 +403,11 @@ _mesa_VertexArrayAttribIFormat(GLuint vaobj, GLuint attribIndex, GLuint relativeOffset); extern void GLAPIENTRY +_mesa_VertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribIndex, + GLint size, GLenum type, + GLuint relativeOffset); + +extern void GLAPIENTRY _mesa_VertexAttribLFormat(GLuint attribIndex, GLint size, GLenum type, GLuint relativeOffset); @@ -402,6 +416,11 @@ _mesa_VertexArrayAttribLFormat(GLuint vaobj, GLuint attribIndex, GLint size, GLenum type, GLuint relativeOffset); +extern void GLAPIENTRY +_mesa_VertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribIndex, + GLint size, GLenum type, + GLuint relativeOffset); + void GLAPIENTRY _mesa_VertexAttribBinding_no_error(GLuint attribIndex, GLuint bindingIndex); @@ -416,6 +435,10 @@ extern void GLAPIENTRY _mesa_VertexArrayAttribBinding(GLuint vaobj, GLuint attribIndex, GLuint bindingIndex); +extern void GLAPIENTRY +_mesa_VertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribIndex, + GLuint bindingIndex); + void GLAPIENTRY _mesa_VertexBindingDivisor_no_error(GLuint bindingIndex, GLuint divisor); @@ -430,6 +453,10 @@ extern void GLAPIENTRY _mesa_VertexArrayBindingDivisor(GLuint vaobj, GLuint bindingIndex, GLuint divisor); +extern void GLAPIENTRY +_mesa_VertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingIndex, + GLuint divisor); + extern void _mesa_copy_vertex_attrib_array(struct gl_context *ctx, |