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 <marek.olsak@amd.com>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2019-11-07 13:47:17 +01:00
parent 657396aa10
commit 8b6d19413f
5 changed files with 171 additions and 5 deletions

View File

@ -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"/>

View File

@ -1625,6 +1625,12 @@ offsets = {
"TextureBufferRangeEXT": 1589,
"TextureStorage2DMultisampleEXT": 1590,
"TextureStorage3DMultisampleEXT": 1591,
"VertexArrayBindVertexBufferEXT": 1592,
"VertexArrayVertexAttribFormatEXT": 1593,
"VertexArrayVertexAttribIFormatEXT": 1594,
"VertexArrayVertexAttribLFormatEXT": 1595,
"VertexArrayVertexAttribBindingEXT": 1596,
"VertexArrayVertexBindingDivisorEXT": 1597,
}
functions = [

View File

@ -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 },

View File

@ -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,
@ -3137,6 +3152,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,
@ -3149,6 +3176,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,
@ -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,

View File

@ -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,
@ -384,6 +388,11 @@ _mesa_VertexArrayAttribFormat(GLuint vaobj, GLuint attribIndex, GLint size,
GLenum type, GLboolean normalized,
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);
@ -393,6 +402,11 @@ _mesa_VertexArrayAttribIFormat(GLuint vaobj, GLuint attribIndex,
GLint size, GLenum type,
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,