summaryrefslogtreecommitdiffstats
path: root/src/mesa/vbo/vbo_exec_draw.c
diff options
context:
space:
mode:
authorMathias Fröhlich <[email protected]>2016-07-22 10:58:58 +0200
committerMathias Fröhlich <[email protected]>2016-07-27 06:43:03 +0200
commit2060f19b4f7331299e597beee42be4c987b58762 (patch)
tree686503f317b8119b0d6ecd1108c570c0a5accda5 /src/mesa/vbo/vbo_exec_draw.c
parentc98c7321581cf7b5fbbedb434d8f073e357f67af (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.c19
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;
}