Fix for-loop in interp() so we don't go out of bounds.
authorBrian <brian.paul@tungstengraphics.com>
Fri, 13 Jul 2007 18:28:42 +0000 (12:28 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 13 Jul 2007 18:28:42 +0000 (12:28 -0600)
Improved comments for that loop.
Added some sanity check assertions regarding vertex layout.

src/mesa/pipe/draw/draw_clip.c

index 7ede51fc6cd92aa81762cf61b34ef13923342e6c..b220cc3643fdcdfdc164cab6c652202ea3395a06 100644 (file)
@@ -110,13 +110,15 @@ static void interp( const struct clipper *clip,
       dst->data[0][3] = oow;
    }
 
-   
    /* Other attributes
-    * Note: start at 1 to skip winpos (data[0]) and subtract one
-    * since there's two vertex attrib slots we want to ignore (the header
-    * and the clippos.
+    * Note: start at 1 to skip winpos (data[0]) since we just computed
+    * it above.
+    * Subtract two from nr_attrs since the first two attribs (always 
+    * VF_ATTRIB_VERTEX_HEADER and VF_ATTRIB_CLIP_POS, see
+    * draw_set_vertex_attributes()) are in the vertex_header struct,
+    * not in the data[] array.
     */
-   for (j = 1; j < nr_attrs-1; j++) {
+   for (j = 1; j < nr_attrs - 2; j++) {
       interp_attr(dst->data[j], t, in->data[j], out->data[j]);
    }
 }
@@ -365,6 +367,11 @@ static void clip_begin( struct draw_stage *stage )
    struct clipper *clipper = clipper_stage(stage);
    GLuint nr = stage->draw->nr_planes;
 
+   /* sanity checks.  If these fail, review the clip/interp code! */
+   assert(stage->draw->nr_attrs >= 3);
+   assert(stage->draw->attrs[0].attrib == VF_ATTRIB_VERTEX_HEADER);
+   assert(stage->draw->attrs[1].attrib == VF_ATTRIB_CLIP_POS);
+
    /* Hacky bitmask to use when we hit CLIP_USER_BIT:
     */   
    clipper->active_user_planes = ((1<<nr)-1) & ~((1<<6)-1);