1 static unsigned trim( unsigned count
, unsigned first
, unsigned incr
)
3 return count
- (count
- first
) % incr
;
6 static void FUNC(struct draw_pt_front_end
*frontend
,
11 struct varray_frontend
*varray
= (struct varray_frontend
*)frontend
;
12 unsigned start
= (unsigned) ((char *) elts
- (char *) NULL
);
17 draw_pt_split_prim(varray
->input_prim
, &first
, &incr
);
19 /* Sanitize primitive length:
21 count
= trim(count
, first
, incr
);
26 debug_printf("%s (%d) %d/%d\n", __FUNCTION__
,
31 switch (varray
->input_prim
) {
32 case PIPE_PRIM_POINTS
:
34 case PIPE_PRIM_TRIANGLES
:
35 case PIPE_PRIM_LINE_STRIP
:
36 case PIPE_PRIM_TRIANGLE_STRIP
:
38 case PIPE_PRIM_QUAD_STRIP
:
39 case PIPE_PRIM_LINES_ADJACENCY
:
40 case PIPE_PRIM_LINE_STRIP_ADJACENCY
:
41 case PIPE_PRIM_TRIANGLES_ADJACENCY
:
42 case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY
:
43 for (j
= 0; j
< count
;) {
44 unsigned remaining
= count
- j
;
45 unsigned nr
= trim( MIN2(varray
->driver_fetch_max
, remaining
), first
, incr
);
46 varray_flush_linear(varray
, start
+ j
, nr
);
53 case PIPE_PRIM_LINE_LOOP
:
54 /* Always have to decompose as we've stated that this will be
55 * emitted as a line-strip.
57 for (j
= 0; j
< count
;) {
58 unsigned remaining
= count
- j
;
59 unsigned nr
= trim( MIN2(varray
->fetch_max
-1, remaining
), first
, incr
);
60 varray_line_loop_segment(varray
, start
, j
, nr
, nr
== remaining
);
68 case PIPE_PRIM_POLYGON
:
69 case PIPE_PRIM_TRIANGLE_FAN
:
70 if (count
< varray
->driver_fetch_max
) {
71 varray_flush_linear(varray
, start
, count
);
74 for ( j
= 0; j
< count
;) {
75 unsigned remaining
= count
- j
;
76 unsigned nr
= trim( MIN2(varray
->fetch_max
-1, remaining
), first
, incr
);
77 varray_fan_segment(varray
, start
, j
, nr
);