From cfdc108479c16051281276ec3af1ff17e8fea1a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Fr=C3=B6hlich?= Date: Fri, 22 Jul 2016 10:58:58 +0200 Subject: [PATCH] vbo: Fix handling of POS/GENERIC0 attributes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case of split primitives we need to restore the original setting of the vtx.attrsz array to make immediate mode attribute array tracking work. Signed-off-by: Mathias Fröhlich --- src/mesa/vbo/vbo_exec_draw.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index 0ef3081..364dbee 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -177,6 +177,7 @@ vbo_exec_bind_arrays( struct gl_context *ctx ) const GLuint *map; GLuint attr; GLbitfield64 varying_inputs = 0x0; + boolean swap_pos = false; /* Install the default (ie Current) attributes first, then overlay * all active ones. @@ -207,15 +208,16 @@ vbo_exec_bind_arrays( struct gl_context *ctx ) /* check if VERT_ATTRIB_POS is not read but VERT_BIT_GENERIC0 is read. * In that case we effectively need to route the data from * glVertexAttrib(0, val) calls to feed into the GENERIC0 input. + * The original state gets essentially restored below. */ if ((ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_POS) == 0 && (ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_GENERIC0)) { + swap_pos = true; exec->vtx.inputs[VERT_ATTRIB_GENERIC0] = exec->vtx.inputs[0]; exec->vtx.attrsz[VERT_ATTRIB_GENERIC0] = exec->vtx.attrsz[0]; + exec->vtx.attrtype[VERT_ATTRIB_GENERIC0] = exec->vtx.attrtype[0]; exec->vtx.attrptr[VERT_ATTRIB_GENERIC0] = exec->vtx.attrptr[0]; - vbo_reset_attr(exec, VERT_ATTRIB_POS); - exec->vtx.enabled &= (~BITFIELD64_BIT(VBO_ATTRIB_POS)); - exec->vtx.enabled |= BITFIELD64_BIT(VBO_ATTRIB_GENERIC0); + exec->vtx.attrsz[0] = 0; } break; default: @@ -262,6 +264,16 @@ vbo_exec_bind_arrays( struct gl_context *ctx ) } } + /* In case we swapped the position and generic0 attribute. + * Restore the original setting of the vtx.* variables. + * They are still needed with the original order and settings in case + * of a split primitive. + */ + if (swap_pos) { + exec->vtx.attrsz[0] = exec->vtx.attrsz[VERT_ATTRIB_GENERIC0]; + exec->vtx.attrsz[VERT_ATTRIB_GENERIC0] = 0; + } + _mesa_set_varying_vp_inputs( ctx, varying_inputs ); ctx->NewDriverState |= ctx->DriverFlags.NewArray; } -- 2.5.5