aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mapi/glapi/gen/ARB_instanced_arrays.xml6
-rw-r--r--src/mesa/main/glthread.h4
-rw-r--r--src/mesa/main/glthread_varray.c42
3 files changed, 39 insertions, 13 deletions
diff --git a/src/mapi/glapi/gen/ARB_instanced_arrays.xml b/src/mapi/glapi/gen/ARB_instanced_arrays.xml
index 8ecf7951af8..feeeeabeb1c 100644
--- a/src/mapi/glapi/gen/ARB_instanced_arrays.xml
+++ b/src/mapi/glapi/gen/ARB_instanced_arrays.xml
@@ -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, &amp;vaobj, VERT_ATTRIB_GENERIC(index), divisor);">
<param name="vaobj" type="GLuint"/>
<param name="index" type="GLuint"/>
<param name="divisor" type="GLuint"/>
diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h
index c1117872dc8..c13ca9e8236 100644
--- a/src/mesa/main/glthread.h
+++ b/src/mesa/main/glthread.h
@@ -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);
diff --git a/src/mesa/main/glthread_varray.c b/src/mesa/main/glthread_varray.c
index 53a973600a6..bcbd229320b 100644
--- a/src/mesa/main/glthread_varray.c
+++ b/src/mesa/main/glthread_varray.c
@@ -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,