unsigned count)
{
struct varray_frontend *varray = (struct varray_frontend *)frontend;
- unsigned start = (unsigned)elts;
+ unsigned start = (unsigned) ((char *) elts - (char *) NULL);
- unsigned i, j;
+ unsigned j;
unsigned first, incr;
- varray->fetch_start = start;
-
draw_pt_split_prim(varray->input_prim, &first, &incr);
/* Sanitize primitive length:
case PIPE_PRIM_TRIANGLE_STRIP:
case PIPE_PRIM_QUADS:
case PIPE_PRIM_QUAD_STRIP:
+ case PIPE_PRIM_LINES_ADJACENCY:
+ case PIPE_PRIM_LINE_STRIP_ADJACENCY:
+ case PIPE_PRIM_TRIANGLES_ADJACENCY:
+ case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
for (j = 0; j < count;) {
unsigned remaining = count - j;
- unsigned nr = trim( MIN2(FETCH_MAX, remaining), first, incr );
+ unsigned nr = trim( MIN2(varray->driver_fetch_max, remaining), first, incr );
varray_flush_linear(varray, start + j, nr);
j += nr;
if (nr != remaining)
break;
case PIPE_PRIM_LINE_LOOP:
- if (count >= 2) {
- for (j = 0; j + first <= count; j += i) {
- unsigned end = MIN2(FETCH_MAX, count - j);
- end -= (end % incr);
- for (i = 1; i < end; i++) {
- LINE(varray, i - 1, i);
- }
- LINE(varray, i - 1, 0);
- i = end;
- fetch_init(varray, end);
- varray_flush(varray);
- }
+ /* Always have to decompose as we've stated that this will be
+ * emitted as a line-strip.
+ */
+ for (j = 0; j < count;) {
+ unsigned remaining = count - j;
+ unsigned nr = trim( MIN2(varray->fetch_max-1, remaining), first, incr );
+ varray_line_loop_segment(varray, start, j, nr, nr == remaining);
+ j += nr;
+ if (nr != remaining)
+ j -= (first - incr);
}
break;
case PIPE_PRIM_POLYGON:
- case PIPE_PRIM_TRIANGLE_FAN:
- for (j = 0; j + first <= count; j += i) {
- unsigned end = MIN2(FETCH_MAX, count - j);
- end -= (end % incr);
- for (i = 2; i < end; i++) {
- TRIANGLE(varray, 0, i - 1, i);
+ case PIPE_PRIM_TRIANGLE_FAN:
+ if (count < varray->driver_fetch_max) {
+ varray_flush_linear(varray, start, count);
+ }
+ else {
+ for ( j = 0; j < count;) {
+ unsigned remaining = count - j;
+ unsigned nr = trim( MIN2(varray->fetch_max-1, remaining), first, incr );
+ varray_fan_segment(varray, start, j, nr);
+ j += nr;
+ if (nr != remaining)
+ j -= (first - incr);
}
- i = end;
- fetch_init(varray, end);
- varray_flush(varray);
}
break;
assert(0);
break;
}
-
- varray_flush(varray);
}
#undef TRIANGLE