From 315df8dbb8d60fc1edc9004bcf06a94fcfda1d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 25 Sep 2020 20:14:53 -0400 Subject: [PATCH] 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 Part-of: --- src/mapi/glapi/gen/gl_API.xml | 3 +- src/mesa/main/glthread.h | 2 ++ src/mesa/main/glthread_varray.c | 51 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index e172c8c229e..26f9e4ffba9 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -3234,7 +3234,8 @@ - + diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h index b07169e334c..76cb41192a8 100644 --- a/src/mesa/main/glthread.h +++ b/src/mesa/main/glthread.h @@ -244,5 +244,7 @@ void _mesa_glthread_PushClientAttrib(struct gl_context *ctx, GLbitfield mask, 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 17718824c5f..4250cf0744d 100644 --- a/src/mesa/main/glthread_varray.c +++ b/src/mesa/main/glthread_varray.c @@ -646,3 +646,54 @@ _mesa_glthread_ClientAttribDefault(struct gl_context *ctx, GLbitfield mask) 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); +}