/*
* 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
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;
+ const unsigned start = istart;
+ const unsigned end = istart + icount;
+
+ /* If the index buffer overflows we'll need to run
+ * through the normal paths */
+ if (end >= draw->pt.user.eltMax ||
+ end < istart)
+ return FALSE;
/* use the ib directly */
if (min_index == 0 && sizeof(ib[0]) == sizeof(draw_elts[0])) {
return FALSE;
for (i = 0; i < icount; i++) {
- ELT_TYPE idx = ib[istart + i];
- assert(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 */
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? */
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[istart + i];
+ ELT_TYPE idx = DRAW_GET_IDX(ib, i + start);
- assert(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[istart + i];
+ ELT_TYPE idx = DRAW_GET_IDX(ib, i + start);
- assert(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);
}
}
* When spoken is TRUE, ispoken replaces istart; When close is TRUE, iclose is
* appended.
*/
-static INLINE void
+static inline void
CONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit,
unsigned flags,
unsigned istart, unsigned icount,
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;
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) {
+ else {
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);
- }
- else {
- if (spoken) {
- if (ib[ispoken] < -ibias)
- return;
- ADD_CACHE(vsplit, ib[ispoken] + ibias);
- }
-
- for (i = spoken; i < icount; i++) {
- if (ib[istart + i] < -ibias)
- return;
- 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);
}
vsplit_flush_cache(vsplit, flags);
assert(icount + !!close_loop <= vsplit->segment_size);
+ /* need to draw the sections of the line loop as line strips */
+ flags |= DRAW_LINE_LOOP_AS_STRIP;
+
if (close_loop) {
for (nr = 0; nr < icount; nr++)
vsplit->fetch_elts[nr] = istart + nr;