mesa: Replace IS_NEGATIVE(x) with x < 0.0f.
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_vsplit_tmp.h
index e9714c1b3fa5751c0ce126ece7adf241c04b6656..0f7a3cdc0129cc0098b73ed4370b402ed06c55ac 100644 (file)
@@ -1,8 +1,7 @@
 /*
  * Mesa 3-D graphics library
- * Version:  7.9
  *
- * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2007-2008 VMware, Inc.
  * Copyright (C) 2010 LunarG Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -38,16 +37,22 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
                                     unsigned istart, unsigned icount)
 {
    struct draw_context *draw = vsplit->draw;
-   const ELT_TYPE *ib = (const ELT_TYPE *)
-      ((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset);
+   const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts;
    const unsigned min_index = draw->pt.user.min_index;
    const unsigned max_index = draw->pt.user.max_index;
    const int elt_bias = draw->pt.user.eltBias;
    unsigned fetch_start, fetch_count;
    const ushort *draw_elts = NULL;
    unsigned i;
-
-   ib += istart;
+   const unsigned start = istart;
+   const unsigned end = istart + icount;
+
+   /* If the index buffer overflows we'll need to run
+    * through the normal paths */
+   if (start >= draw->pt.user.eltMax ||
+       end > draw->pt.user.eltMax ||
+       end < istart || end < icount)
+      return FALSE;
 
    /* use the ib directly */
    if (min_index == 0 && sizeof(ib[0]) == sizeof(draw_elts[0])) {
@@ -55,12 +60,12 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
          return FALSE;
 
       for (i = 0; i < icount; i++) {
-         ELT_TYPE idx = ib[i];
-         if (idx >= min_index && idx <= max_index) {
+         ELT_TYPE idx = DRAW_GET_IDX(ib, start + i);
+         if (idx < min_index || idx > max_index) {
             debug_printf("warning: index out of range\n");
          }
       }
-      draw_elts = (const ushort *) ib;
+      draw_elts = (const ushort *) (ib + istart);
    }
    else {
       /* have to go through vsplit->draw_elts */
@@ -72,7 +77,7 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
    if (max_index - min_index > icount - 1)
       return FALSE;
 
-   if (elt_bias < 0 && min_index < -elt_bias)
+   if (elt_bias < 0 && (int) min_index < -elt_bias)
       return FALSE;
 
    /* why this check? */
@@ -84,24 +89,28 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
    fetch_start = min_index + elt_bias;
    fetch_count = max_index - min_index + 1;
 
+   /* Check for overflow in the fetch_start */
+   if (fetch_start < min_index || fetch_start < elt_bias)
+      return FALSE;
+
    if (!draw_elts) {
       if (min_index == 0) {
          for (i = 0; i < icount; i++) {
-            ELT_TYPE idx = ib[i];
+            ELT_TYPE idx = DRAW_GET_IDX(ib, i + start);
 
-            if (idx >= min_index && idx <= max_index) {
+            if (idx < min_index || idx > max_index) {
                debug_printf("warning: index out of range\n");
-           }
+            }
             vsplit->draw_elts[i] = (ushort) idx;
          }
       }
       else {
          for (i = 0; i < icount; i++) {
-            ELT_TYPE idx = ib[i];
+            ELT_TYPE idx = DRAW_GET_IDX(ib, i + start);
 
-            if (idx >= min_index && idx <= max_index) {
+            if (idx < min_index || idx > max_index) {
                debug_printf("warning: index out of range\n");
-           }
+            }
             vsplit->draw_elts[i] = (ushort) (idx - min_index);
          }
       }
@@ -128,8 +137,7 @@ CONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit,
                                         boolean close, unsigned iclose)
 {
    struct draw_context *draw = vsplit->draw;
-   const ELT_TYPE *ib = (const ELT_TYPE *)
-      ((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset);
+   const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts;
    const int ibias = draw->pt.user.eltBias;
    unsigned i;
 
@@ -140,41 +148,36 @@ CONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit,
    spoken = !!spoken;
    if (ibias == 0) {
       if (spoken)
-         ADD_CACHE(vsplit, ib[ispoken]);
+         ADD_CACHE(vsplit, ib, 0, ispoken, 0);
 
-      for (i = spoken; i < icount; i++)
-         ADD_CACHE(vsplit, ib[istart + i]);
+      for (i = spoken; i < icount; i++) {
+         ADD_CACHE(vsplit, ib, istart, i, 0);
+      }
 
       if (close)
-         ADD_CACHE(vsplit, ib[iclose]);
+         ADD_CACHE(vsplit, ib, 0, iclose, 0);
    }
    else if (ibias > 0) {
       if (spoken)
-         ADD_CACHE(vsplit, (uint) ib[ispoken] + ibias);
+         ADD_CACHE(vsplit, ib, 0, ispoken, ibias);
 
       for (i = spoken; i < icount; i++)
-         ADD_CACHE(vsplit, (uint) ib[istart + i] + ibias);
+         ADD_CACHE(vsplit, ib, istart, i, ibias);
 
       if (close)
-         ADD_CACHE(vsplit, (uint) ib[iclose] + ibias);
+         ADD_CACHE(vsplit, ib, 0, iclose, ibias);
    }
    else {
       if (spoken) {
-         if (ib[ispoken] < -ibias)
-            return;
-         ADD_CACHE(vsplit, ib[ispoken] + ibias);
+         ADD_CACHE(vsplit, ib, 0, ispoken, ibias);
       }
 
       for (i = spoken; i < icount; i++) {
-         if (ib[istart + i] < -ibias)
-            return;
-         ADD_CACHE(vsplit, ib[istart + i] + ibias);
+         ADD_CACHE(vsplit, ib, istart, i, ibias);
       }
 
       if (close) {
-         if (ib[iclose] < -ibias)
-            return;
-         ADD_CACHE(vsplit, ib[iclose] + ibias);
+         ADD_CACHE(vsplit, ib, 0, iclose, ibias);
       }
    }