vbo: fix attr reset
authorRob Clark <robdclark@gmail.com>
Tue, 5 Jul 2016 19:41:26 +0000 (15:41 -0400)
committerRob Clark <robdclark@gmail.com>
Wed, 6 Jul 2016 14:17:30 +0000 (10:17 -0400)
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 <robdclark@gmail.com>
Reviewed-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
src/mesa/vbo/vbo_exec.h
src/mesa/vbo/vbo_exec_api.c
src/mesa/vbo/vbo_exec_draw.c

index 5e20cf6f24a564a03f5a4a4b954892637cc530d2..4f11f17c49ed66570434a520e4943e097df43f81 100644 (file)
@@ -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 );
index e02bb907c4fca6f318acef6317b672f7744be512..32f15db39004a284c357c05cc768dde02fa10d2b 100644 (file)
@@ -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;
index 8d1b2c08d270347f21c2463cb2d49b97c81513df..0ef30819e225233ce06c96e51664b998b58c7128 100644 (file)
@@ -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);
       }