From 2bf4a500de24347476ce96cdd48d68ddeecbb019 Mon Sep 17 00:00:00 2001 From: Brian Date: Fri, 13 Jul 2007 12:28:42 -0600 Subject: 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. --- src/mesa/pipe/draw/draw_clip.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/mesa/pipe') diff --git a/src/mesa/pipe/draw/draw_clip.c b/src/mesa/pipe/draw/draw_clip.c index 7ede51fc6cd..b220cc3643f 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<