3 static void FUNC( struct draw_pt_front_end
*frontend
,
9 struct vcache_frontend
*vcache
= (struct vcache_frontend
*)frontend
;
10 struct draw_context
*draw
= vcache
->draw
;
12 boolean flatfirst
= (draw
->rasterizer
->flatshade
&&
13 draw
->rasterizer
->flatshade_first
);
17 if (0) debug_printf("%s %d\n", __FUNCTION__
, count
);
20 switch (vcache
->input_prim
) {
21 case PIPE_PRIM_POINTS
:
22 for (i
= 0; i
< count
; i
++) {
24 get_elt(elts
, i
+ 0) + elt_bias
);
29 for (i
= 0; i
+1 < count
; i
+= 2) {
31 DRAW_PIPE_RESET_STIPPLE
,
32 get_elt(elts
, i
+ 0) + elt_bias
,
33 get_elt(elts
, i
+ 1) + elt_bias
);
37 case PIPE_PRIM_LINE_LOOP
:
39 flags
= DRAW_PIPE_RESET_STIPPLE
;
41 for (i
= 1; i
< count
; i
++, flags
= 0) {
44 get_elt(elts
, i
- 1) + elt_bias
,
45 get_elt(elts
, i
) + elt_bias
);
50 get_elt(elts
, i
- 1) + elt_bias
,
51 get_elt(elts
, 0 ) + elt_bias
);
55 case PIPE_PRIM_LINE_STRIP
:
56 flags
= DRAW_PIPE_RESET_STIPPLE
;
57 for (i
= 1; i
< count
; i
++, flags
= 0) {
60 get_elt(elts
, i
- 1) + elt_bias
,
61 get_elt(elts
, i
) + elt_bias
);
65 case PIPE_PRIM_TRIANGLES
:
66 for (i
= 0; i
+2 < count
; i
+= 3) {
68 DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
69 get_elt(elts
, i
+ 0) + elt_bias
,
70 get_elt(elts
, i
+ 1) + elt_bias
,
71 get_elt(elts
, i
+ 2 ) + elt_bias
);
75 case PIPE_PRIM_TRIANGLE_STRIP
:
77 for (i
= 0; i
+2 < count
; i
++) {
79 DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
80 get_elt(elts
, i
+ 0) + elt_bias
,
81 get_elt(elts
, i
+ 1 + (i
&1)) + elt_bias
,
82 get_elt(elts
, i
+ 2 - (i
&1)) + elt_bias
);
86 for (i
= 0; i
+2 < count
; i
++) {
88 DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
89 get_elt(elts
, i
+ 0 + (i
&1)) + elt_bias
,
90 get_elt(elts
, i
+ 1 - (i
&1)) + elt_bias
,
91 get_elt(elts
, i
+ 2 ) + elt_bias
);
96 case PIPE_PRIM_TRIANGLE_FAN
:
99 for (i
= 0; i
+2 < count
; i
++) {
101 DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
102 get_elt(elts
, i
+ 1) + elt_bias
,
103 get_elt(elts
, i
+ 2) + elt_bias
,
104 get_elt(elts
, 0 ) + elt_bias
);
108 for (i
= 0; i
+2 < count
; i
++) {
110 DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
111 get_elt(elts
, 0) + elt_bias
,
112 get_elt(elts
, i
+ 1) + elt_bias
,
113 get_elt(elts
, i
+ 2 ) + elt_bias
);
120 case PIPE_PRIM_QUADS
:
121 for (i
= 0; i
+3 < count
; i
+= 4) {
123 get_elt(elts
, i
+ 0) + elt_bias
,
124 get_elt(elts
, i
+ 1) + elt_bias
,
125 get_elt(elts
, i
+ 2) + elt_bias
,
126 get_elt(elts
, i
+ 3) + elt_bias
);
130 case PIPE_PRIM_QUAD_STRIP
:
131 for (i
= 0; i
+3 < count
; i
+= 2) {
133 get_elt(elts
, i
+ 2) + elt_bias
,
134 get_elt(elts
, i
+ 0) + elt_bias
,
135 get_elt(elts
, i
+ 1) + elt_bias
,
136 get_elt(elts
, i
+ 3) + elt_bias
);
140 case PIPE_PRIM_POLYGON
:
142 /* These bitflags look a little odd because we submit the
143 * vertices as (1,2,0) to satisfy flatshade requirements.
145 const ushort edge_first
= DRAW_PIPE_EDGE_FLAG_2
;
146 const ushort edge_middle
= DRAW_PIPE_EDGE_FLAG_0
;
147 const ushort edge_last
= DRAW_PIPE_EDGE_FLAG_1
;
148 ushort edge_next
, edge_finish
;
151 flags
= DRAW_PIPE_RESET_STIPPLE
| edge_middle
| edge_last
;
152 edge_next
= edge_last
;
153 edge_finish
= edge_first
;
156 flags
= DRAW_PIPE_RESET_STIPPLE
| edge_first
| edge_middle
;
157 edge_next
= edge_middle
;
158 edge_finish
= edge_last
;
161 for (i
= 0; i
+2 < count
; i
++, flags
= edge_next
) {
164 flags
|= edge_finish
;
169 get_elt(elts
, 0) + elt_bias
,
170 get_elt(elts
, i
+ 1) + elt_bias
,
171 get_elt(elts
, i
+ 2) + elt_bias
);
176 get_elt(elts
, i
+ 1) + elt_bias
,
177 get_elt(elts
, i
+ 2) + elt_bias
,
178 get_elt(elts
, 0) + elt_bias
);
189 vcache_flush( vcache
);