diff options
Diffstat (limited to 'src/mesa/vbo/vbo_exec_draw.c')
-rw-r--r-- | src/mesa/vbo/vbo_exec_draw.c | 19 |
1 files 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 <[email protected]> */ +#include <stdbool.h> #include <stdio.h> #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; } |