glthread: handle glInterleavedArrays
We need to enable and bind everything on the glthread side too.
The behavior was copied from _mesa_InterleavedArrays.
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6874>
diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index e172c8c..26f9e4f 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -3234,7 +3234,8 @@
<glx handcode="true"/>
</function>
- <function name="InterleavedArrays" deprecated="3.1">
+ <function name="InterleavedArrays" deprecated="3.1" marshal="async"
+ marshal_call_after="_mesa_glthread_InterleavedArrays(ctx, format, stride, pointer);">
<param name="format" type="GLenum"/>
<param name="stride" type="GLsizei"/>
<param name="pointer" type="const GLvoid *"/>
diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h
index b07169e..76cb411 100644
--- a/src/mesa/main/glthread.h
+++ b/src/mesa/main/glthread.h
@@ -244,5 +244,7 @@
bool set_default);
void _mesa_glthread_PopClientAttrib(struct gl_context *ctx);
void _mesa_glthread_ClientAttribDefault(struct gl_context *ctx, GLbitfield mask);
+void _mesa_glthread_InterleavedArrays(struct gl_context *ctx, GLenum format,
+ GLsizei stride, const GLvoid *pointer);
#endif /* _GLTHREAD_H*/
diff --git a/src/mesa/main/glthread_varray.c b/src/mesa/main/glthread_varray.c
index 1771882..4250cf0 100644
--- a/src/mesa/main/glthread_varray.c
+++ b/src/mesa/main/glthread_varray.c
@@ -646,3 +646,54 @@
glthread->CurrentVAO = &glthread->DefaultVAO;
_mesa_glthread_reset_vao(glthread->CurrentVAO);
}
+
+void
+_mesa_glthread_InterleavedArrays(struct gl_context *ctx, GLenum format,
+ GLsizei stride, const GLvoid *pointer)
+{
+ struct gl_interleaved_layout layout;
+ unsigned tex = VERT_ATTRIB_TEX(ctx->GLThread.ClientActiveTexture);
+
+ if (stride < 0 || !_mesa_get_interleaved_layout(format, &layout))
+ return;
+
+ if (!stride)
+ stride = layout.defstride;
+
+ _mesa_glthread_ClientState(ctx, NULL, VERT_ATTRIB_EDGEFLAG, false);
+ _mesa_glthread_ClientState(ctx, NULL, VERT_ATTRIB_COLOR_INDEX, false);
+ /* XXX also disable secondary color and generic arrays? */
+
+ /* Texcoords */
+ if (layout.tflag) {
+ _mesa_glthread_ClientState(ctx, NULL, tex, true);
+ _mesa_glthread_AttribPointer(ctx, tex, layout.tcomps, GL_FLOAT, stride,
+ (GLubyte *) pointer + layout.toffset);
+ } else {
+ _mesa_glthread_ClientState(ctx, NULL, tex, false);
+ }
+
+ /* Color */
+ if (layout.cflag) {
+ _mesa_glthread_ClientState(ctx, NULL, VERT_ATTRIB_COLOR0, true);
+ _mesa_glthread_AttribPointer(ctx, VERT_ATTRIB_COLOR0, layout.ccomps,
+ layout.ctype, stride,
+ (GLubyte *) pointer + layout.coffset);
+ } else {
+ _mesa_glthread_ClientState(ctx, NULL, VERT_ATTRIB_COLOR0, false);
+ }
+
+ /* Normals */
+ if (layout.nflag) {
+ _mesa_glthread_ClientState(ctx, NULL, VERT_ATTRIB_NORMAL, true);
+ _mesa_glthread_AttribPointer(ctx, VERT_ATTRIB_NORMAL, 3, GL_FLOAT,
+ stride, (GLubyte *) pointer + layout.noffset);
+ } else {
+ _mesa_glthread_ClientState(ctx, NULL, VERT_ATTRIB_NORMAL, false);
+ }
+
+ /* Vertices */
+ _mesa_glthread_ClientState(ctx, NULL, VERT_ATTRIB_POS, true);
+ _mesa_glthread_AttribPointer(ctx, VERT_ATTRIB_POS, layout.vcomps, GL_FLOAT,
+ stride, (GLubyte *) pointer + layout.voffset);
+}