draw: Fix bug when drawing ushort indices.
authorJosé Fonseca <jfonseca@vmware.com>
Tue, 29 Mar 2011 14:35:30 +0000 (15:35 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 30 Mar 2011 15:05:24 +0000 (16:05 +0100)
When the condition

 min_index == 0 && sizeof(ib[0]) == sizeof(draw_elts[0])

was true, we were wrongly ignoring istart and processing indices 0.

Reorder some statements to make the code easier to understand.

src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h

index 75dba8c..228da68 100644 (file)
@@ -47,13 +47,18 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
    const ushort *draw_elts = NULL;
    unsigned i;
 
+   ib += istart;
+
+   fetch_start = min_index + elt_bias;
+   fetch_count = max_index - min_index + 1;
+
    /* use the ib directly */
    if (min_index == 0 && sizeof(ib[0]) == sizeof(draw_elts[0])) {
       if (icount > vsplit->max_vertices)
          return FALSE;
 
       for (i = 0; i < icount; i++) {
-         ELT_TYPE idx = ib[istart + i];
+         ELT_TYPE idx = ib[i];
          assert(idx >= min_index && idx <= max_index);
       }
       draw_elts = (const ushort *) ib;
@@ -65,7 +70,7 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
    }
 
    /* this is faster only when we fetch less elements than the normal path */
-   if (max_index - min_index > icount - 1)
+   if (fetch_count > icount)
       return FALSE;
 
    if (elt_bias < 0 && min_index < -elt_bias)
@@ -77,13 +82,10 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
          return FALSE;
    }
 
-   fetch_start = min_index + elt_bias;
-   fetch_count = max_index - min_index + 1;
-
    if (!draw_elts) {
       if (min_index == 0) {
          for (i = 0; i < icount; i++) {
-            ELT_TYPE idx = ib[istart + i];
+            ELT_TYPE idx = ib[i];
 
             assert(idx >= min_index && idx <= max_index);
             vsplit->draw_elts[i] = (ushort) idx;