diff options
author | Mathias Fröhlich <[email protected]> | 2016-07-22 10:58:58 +0200 |
---|---|---|
committer | Mathias Fröhlich <[email protected]> | 2016-07-27 06:43:03 +0200 |
commit | 2060f19b4f7331299e597beee42be4c987b58762 (patch) | |
tree | 686503f317b8119b0d6ecd1108c570c0a5accda5 /src/mesa/vbo/vbo_exec_draw.c | |
parent | c98c7321581cf7b5fbbedb434d8f073e357f67af (diff) |
vbo: Fix handling of POS/GENERIC0 attributes.
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 <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
Tested-by: Brian Paul <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96950
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; } |