glthread: track instance divisor changes
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4314>
This commit is contained in:
@@ -10,12 +10,14 @@
|
||||
|
||||
<enum name="VERTEX_ATTRIB_ARRAY_DIVISOR_ARB" value="0x88FE"/>
|
||||
|
||||
<function name="VertexAttribDivisorARB" alias="VertexAttribDivisor">
|
||||
<function name="VertexAttribDivisorARB" alias="VertexAttribDivisor"
|
||||
marshal_call_after="if (COMPAT) _mesa_glthread_AttribDivisor(ctx, NULL, VERT_ATTRIB_GENERIC(index), divisor);">
|
||||
<param name="index" type="GLuint"/>
|
||||
<param name="divisor" type="GLuint"/>
|
||||
</function>
|
||||
|
||||
<function name="VertexArrayVertexAttribDivisorEXT">
|
||||
<function name="VertexArrayVertexAttribDivisorEXT"
|
||||
marshal_call_after="if (COMPAT) _mesa_glthread_AttribDivisor(ctx, &vaobj, VERT_ATTRIB_GENERIC(index), divisor);">
|
||||
<param name="vaobj" type="GLuint"/>
|
||||
<param name="index" type="GLuint"/>
|
||||
<param name="divisor" type="GLuint"/>
|
||||
|
||||
@@ -64,10 +64,12 @@ struct glthread_vao {
|
||||
GLuint CurrentElementBufferName;
|
||||
GLbitfield Enabled;
|
||||
GLbitfield UserPointerMask;
|
||||
GLbitfield NonZeroDivisorMask;
|
||||
|
||||
struct {
|
||||
GLuint ElementSize;
|
||||
GLsizei Stride;
|
||||
GLuint Divisor;
|
||||
const void *Pointer;
|
||||
} Attrib[VERT_ATTRIB_MAX];
|
||||
};
|
||||
@@ -162,6 +164,8 @@ void _mesa_glthread_GenVertexArrays(struct gl_context *ctx,
|
||||
GLsizei n, GLuint *arrays);
|
||||
void _mesa_glthread_ClientState(struct gl_context *ctx, GLuint *vaobj,
|
||||
gl_vert_attrib attrib, bool enable);
|
||||
void _mesa_glthread_AttribDivisor(struct gl_context *ctx, const GLuint *vaobj,
|
||||
gl_vert_attrib attrib, GLuint divisor);
|
||||
void _mesa_glthread_AttribPointer(struct gl_context *ctx, gl_vert_attrib attrib,
|
||||
GLint size, GLenum type, GLsizei stride,
|
||||
const void *pointer);
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#include "main/dispatch.h"
|
||||
|
||||
/* TODO:
|
||||
* - Handle GL_ARB_instanced_arrays (incl. EXT_dsa)
|
||||
* - Handle ARB_vertex_attrib_binding (incl. EXT_dsa and ARB_dsa)
|
||||
*/
|
||||
|
||||
@@ -131,23 +130,26 @@ _mesa_glthread_GenVertexArrays(struct gl_context *ctx,
|
||||
}
|
||||
}
|
||||
|
||||
/* If vaobj is NULL, use the currently-bound VAO. */
|
||||
static inline struct glthread_vao *
|
||||
get_vao(struct gl_context *ctx, const GLuint *vaobj)
|
||||
{
|
||||
if (vaobj)
|
||||
return lookup_vao(ctx, *vaobj);
|
||||
|
||||
return ctx->GLThread.CurrentVAO;
|
||||
}
|
||||
|
||||
void
|
||||
_mesa_glthread_ClientState(struct gl_context *ctx, GLuint *vaobj,
|
||||
gl_vert_attrib attrib, bool enable)
|
||||
{
|
||||
struct glthread_state *glthread = &ctx->GLThread;
|
||||
struct glthread_vao *vao;
|
||||
|
||||
if (attrib >= VERT_ATTRIB_MAX)
|
||||
return;
|
||||
|
||||
if (vaobj) {
|
||||
vao = lookup_vao(ctx, *vaobj);
|
||||
if (!vao)
|
||||
return;
|
||||
} else {
|
||||
vao = glthread->CurrentVAO;
|
||||
}
|
||||
struct glthread_vao *vao = get_vao(ctx, vaobj);
|
||||
if (!vao)
|
||||
return;
|
||||
|
||||
if (enable)
|
||||
vao->Enabled |= 1u << attrib;
|
||||
@@ -155,6 +157,24 @@ _mesa_glthread_ClientState(struct gl_context *ctx, GLuint *vaobj,
|
||||
vao->Enabled &= ~(1u << attrib);
|
||||
}
|
||||
|
||||
void _mesa_glthread_AttribDivisor(struct gl_context *ctx, const GLuint *vaobj,
|
||||
gl_vert_attrib attrib, GLuint divisor)
|
||||
{
|
||||
if (attrib >= VERT_ATTRIB_MAX)
|
||||
return;
|
||||
|
||||
struct glthread_vao *vao = get_vao(ctx, vaobj);
|
||||
if (!vao)
|
||||
return;
|
||||
|
||||
vao->Attrib[attrib].Divisor = divisor;
|
||||
|
||||
if (divisor)
|
||||
vao->NonZeroDivisorMask |= 1u << attrib;
|
||||
else
|
||||
vao->NonZeroDivisorMask &= ~(1u << attrib);
|
||||
}
|
||||
|
||||
static void
|
||||
attrib_pointer(struct glthread_state *glthread, struct glthread_vao *vao,
|
||||
GLuint buffer, gl_vert_attrib attrib,
|
||||
|
||||
Reference in New Issue
Block a user