summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2007-07-13 12:28:42 -0600
committerBrian <brian.paul@tungstengraphics.com>2007-07-13 12:28:42 -0600
commit2bf4a500de24347476ce96cdd48d68ddeecbb019 (patch)
treea07b8cb70259037f5027e94d628bfaa19abe504d
parent5810b40d6e9aae6b184879a99c67f83107fc6637 (diff)
Fix for-loop in interp() so we don't go out of bounds.
Improved comments for that loop. Added some sanity check assertions regarding vertex layout.
-rw-r--r--src/mesa/pipe/draw/draw_clip.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/mesa/pipe/draw/draw_clip.c b/src/mesa/pipe/draw/draw_clip.c
index 7ede51fc6c..b220cc3643 100644
--- a/src/mesa/pipe/draw/draw_clip.c
+++ b/src/mesa/pipe/draw/draw_clip.c
@@ -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);