summaryrefslogtreecommitdiffstats
path: root/src/mesa/vbo
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2016-07-05 15:41:26 -0400
committerRob Clark <[email protected]>2016-07-06 10:17:30 -0400
commit64d35f817afc3106684dd74491b14be4d676cb88 (patch)
tree94e3b6297aa32985f8d9f26c72a53f730da4885b /src/mesa/vbo
parent23dd9eaa94e97450582059763fcb479e1e8fe818 (diff)
vbo: fix attr reset
In bc4e0c4 (vbo: Use a bitmask to track the active arrays in vbo_exec*.) we stopped looping over all the attributes and resetting all slots. Which exposed an issue in vbo_exec_bind_arrays() for handling GENERIC0 vs. POS. Split out a helper which can reset a particular slot, so that vbo_exec_bind_arrays() can re-use it to reset POS. This fixes an issue with 0ad (and possibly others). Signed-off-by: Rob Clark <[email protected]> Reviewed-by: Mathias Fröhlich <[email protected]>
Diffstat (limited to 'src/mesa/vbo')
-rw-r--r--src/mesa/vbo/vbo_exec.h1
-rw-r--r--src/mesa/vbo/vbo_exec_api.c14
-rw-r--r--src/mesa/vbo/vbo_exec_draw.c2
3 files changed, 10 insertions, 7 deletions
diff --git a/src/mesa/vbo/vbo_exec.h b/src/mesa/vbo/vbo_exec.h
index 5e20cf6f24a..4f11f17c49e 100644
--- a/src/mesa/vbo/vbo_exec.h
+++ b/src/mesa/vbo/vbo_exec.h
@@ -152,6 +152,7 @@ void vbo_exec_invalidate_state( struct gl_context *ctx, GLbitfield new_state );
/* Internal functions:
*/
+void vbo_reset_attr(struct vbo_exec_context *exec, GLuint attr);
void vbo_exec_vtx_init( struct vbo_exec_context *exec );
void vbo_exec_vtx_destroy( struct vbo_exec_context *exec );
diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
index e02bb907c4f..32f15db3900 100644
--- a/src/mesa/vbo/vbo_exec_api.c
+++ b/src/mesa/vbo/vbo_exec_api.c
@@ -1275,16 +1275,18 @@ void vbo_exec_FlushVertices( struct gl_context *ctx, GLuint flags )
#endif
}
+void vbo_reset_attr(struct vbo_exec_context *exec, GLuint attr)
+{
+ exec->vtx.attrsz[attr] = 0;
+ exec->vtx.attrtype[attr] = GL_FLOAT;
+ exec->vtx.active_sz[attr] = 0;
+}
static void reset_attrfv( struct vbo_exec_context *exec )
-{
+{
while (exec->vtx.enabled) {
const int i = u_bit_scan64(&exec->vtx.enabled);
- assert(exec->vtx.attrsz[i]);
-
- exec->vtx.attrsz[i] = 0;
- exec->vtx.attrtype[i] = GL_FLOAT;
- exec->vtx.active_sz[i] = 0;
+ vbo_reset_attr(exec, i);
}
exec->vtx.vertex_size = 0;
diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
index 8d1b2c08d27..0ef30819e22 100644
--- a/src/mesa/vbo/vbo_exec_draw.c
+++ b/src/mesa/vbo/vbo_exec_draw.c
@@ -213,7 +213,7 @@ vbo_exec_bind_arrays( struct gl_context *ctx )
exec->vtx.inputs[VERT_ATTRIB_GENERIC0] = exec->vtx.inputs[0];
exec->vtx.attrsz[VERT_ATTRIB_GENERIC0] = exec->vtx.attrsz[0];
exec->vtx.attrptr[VERT_ATTRIB_GENERIC0] = exec->vtx.attrptr[0];
- exec->vtx.attrsz[0] = 0;
+ vbo_reset_attr(exec, VERT_ATTRIB_POS);
exec->vtx.enabled &= (~BITFIELD64_BIT(VBO_ATTRIB_POS));
exec->vtx.enabled |= BITFIELD64_BIT(VBO_ATTRIB_GENERIC0);
}