From 2060f19b4f7331299e597beee42be4c987b58762 Mon Sep 17 00:00:00 2001 From: =?utf8?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=utf8 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. v2: Use bool instead of boolean. Signed-off-by: Mathias Fröhlich Reviewed-by: Brian Paul Tested-by: Brian Paul Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96950 --- src/mesa/vbo/vbo_exec_draw.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index 0ef30819e22..6061ca0ff51 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -25,6 +25,7 @@ * Keith Whitwell */ +#include #include #include "main/glheader.h" #include "main/bufferobj.h" @@ -177,6 +178,7 @@ vbo_exec_bind_arrays( struct gl_context *ctx ) const GLuint *map; GLuint attr; GLbitfield64 varying_inputs = 0x0; + bool swap_pos = false; /* Install the default (ie Current) attributes first, then overlay * all active ones. @@ -207,15 +209,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 +265,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.30.2