10ac08ea3002e5e9506f1c513a8cab31b2a51a73
2 static void FUNC(struct draw_pt_front_end
*frontend
,
7 struct varray_frontend
*varray
= (struct varray_frontend
*)frontend
;
8 struct draw_context
*draw
= varray
->draw
;
9 unsigned start
= (unsigned)elts
;
11 boolean flatfirst
= (draw
->rasterizer
->flatshade
&&
12 draw
->rasterizer
->flatshade_first
);
16 varray
->fetch_start
= start
;
18 split_prim_inplace(varray
->input_prim
, &first
, &incr
);
21 debug_printf("%s (%d) %d/%d\n", __FUNCTION__
,
26 switch (varray
->input_prim
) {
27 case PIPE_PRIM_POINTS
:
28 for (j
= 0; j
+ first
<= count
; j
+= i
) {
29 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
31 for (i
= 0; i
< count
; i
++) {
35 fetch_init(varray
, end
);
41 for (j
= 0; j
+ first
<= count
; j
+= i
) {
42 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
44 for (i
= 0; i
+1 < end
; i
+= 2) {
45 LINE(varray
, DRAW_PIPE_RESET_STIPPLE
,
49 fetch_init(varray
, end
);
54 case PIPE_PRIM_LINE_LOOP
:
56 flags
= DRAW_PIPE_RESET_STIPPLE
;
58 for (j
= 0; j
+ first
<= count
; j
+= i
) {
59 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
61 for (i
= 1; i
< end
; i
++, flags
= 0) {
62 LINE(varray
, flags
, i
- 1, i
);
64 LINE(varray
, flags
, i
- 1, 0);
66 fetch_init(varray
, end
);
72 case PIPE_PRIM_LINE_STRIP
:
73 flags
= DRAW_PIPE_RESET_STIPPLE
;
74 for (j
= 0; j
+ first
<= count
; j
+= i
) {
75 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
77 for (i
= 1; i
< end
; i
++, flags
= 0) {
78 LINE(varray
, flags
, i
- 1, i
);
81 fetch_init(varray
, end
);
86 case PIPE_PRIM_TRIANGLES
:
87 for (j
= 0; j
+ first
<= count
; j
+= i
) {
88 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
90 for (i
= 0; i
+2 < end
; i
+= 3) {
91 TRIANGLE(varray
, DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
95 varray
->fetch_count
= end
;
96 varray_flush_linear(varray
);
97 varray
->fetch_start
+= end
;
101 case PIPE_PRIM_TRIANGLE_STRIP
:
103 for (j
= 0; j
+ first
<= count
; j
+= i
) {
104 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
106 for (i
= 0; i
+2 < end
; i
++) {
107 TRIANGLE(varray
, DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
108 i
+ 0, i
+ 1 + (i
&1), i
+ 2 - (i
&1));
111 fetch_init(varray
, end
);
112 varray_flush(varray
);
116 for (j
= 0; j
+ first
<= count
; j
+= i
) {
117 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
119 for (i
= 0; i
+2 < end
; i
++) {
120 TRIANGLE(varray
, DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
121 i
+ 0 + (i
&1), i
+ 1 - (i
&1), i
+ 2);
124 fetch_init(varray
, end
);
125 varray_flush(varray
);
130 case PIPE_PRIM_TRIANGLE_FAN
:
133 flags
= DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
;
134 for (j
= 0; j
+ first
<= count
; j
+= i
) {
135 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
137 for (i
= 0; i
+2 < end
; i
++) {
138 TRIANGLE(varray
, flags
, i
+ 1, i
+ 2, 0);
141 fetch_init(varray
, end
);
142 varray_flush(varray
);
146 flags
= DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
;
147 for (j
= 0; j
+ first
<= count
; j
+= i
) {
148 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
150 for (i
= 0; i
+2 < end
; i
++) {
151 TRIANGLE(varray
, flags
, 0, i
+ 1, i
+ 2);
154 fetch_init(varray
, end
);
155 varray_flush(varray
);
161 case PIPE_PRIM_QUADS
:
162 for (j
= 0; j
+ first
<= count
; j
+= i
) {
163 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
165 for (i
= 0; i
+3 < end
; i
+= 4) {
166 QUAD(varray
, i
+ 0, i
+ 1, i
+ 2, i
+ 3);
169 fetch_init(varray
, end
);
170 varray_flush(varray
);
174 case PIPE_PRIM_QUAD_STRIP
:
175 for (j
= 0; j
+ first
<= count
; j
+= i
) {
176 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
178 for (i
= 0; i
+3 < end
; i
+= 2) {
179 QUAD(varray
, i
+ 2, i
+ 0, i
+ 1, i
+ 3);
182 fetch_init(varray
, end
);
183 varray_flush(varray
);
187 case PIPE_PRIM_POLYGON
:
189 /* These bitflags look a little odd because we submit the
190 * vertices as (1,2,0) to satisfy flatshade requirements.
192 const unsigned edge_first
= DRAW_PIPE_EDGE_FLAG_2
;
193 const unsigned edge_middle
= DRAW_PIPE_EDGE_FLAG_0
;
194 const unsigned edge_last
= DRAW_PIPE_EDGE_FLAG_1
;
196 flags
= DRAW_PIPE_RESET_STIPPLE
| edge_first
| edge_middle
;
197 for (j
= 0; j
+ first
<= count
; j
+= i
) {
198 unsigned end
= MIN2(FETCH_MAX
, count
- j
);
200 for (i
= 0; i
+2 < end
; i
++, flags
= edge_middle
) {
205 TRIANGLE(varray
, flags
, i
+ 1, i
+ 2, 0);
208 fetch_init(varray
, end
);
209 varray_flush(varray
);
219 varray_flush(varray
);