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 debug_printf("%s (%d) %d/%d\n", __FUNCTION__
, draw
->prim
, start
, count
);
19 debug_printf("INPUT PRIM = %d (start = %d, count = %d)\n", varray
->input_prim
,
23 for (i
= 0; i
< count
; ++i
) {
24 varray
->fetch_elts
[i
] = start
+ i
;
26 varray
->fetch_count
= count
;
28 switch (varray
->input_prim
) {
29 case PIPE_PRIM_POINTS
:
30 for (i
= 0; i
< count
; i
++) {
36 for (i
= 0; i
+1 < count
; i
+= 2) {
37 LINE(varray
, DRAW_PIPE_RESET_STIPPLE
,
42 case PIPE_PRIM_LINE_LOOP
:
44 flags
= DRAW_PIPE_RESET_STIPPLE
;
46 for (i
= 1; i
< count
; i
++, flags
= 0) {
47 LINE(varray
, flags
, i
- 1, i
);
49 LINE(varray
, flags
, i
- 1, 0);
53 case PIPE_PRIM_LINE_STRIP
:
54 flags
= DRAW_PIPE_RESET_STIPPLE
;
55 for (i
= 1; i
< count
; i
++, flags
= 0) {
56 LINE(varray
, flags
, i
- 1, i
);
60 case PIPE_PRIM_TRIANGLES
:
61 for (i
= 0; i
+2 < count
; i
+= 3) {
62 TRIANGLE(varray
, DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
67 case PIPE_PRIM_TRIANGLE_STRIP
:
69 for (i
= 0; i
+2 < count
; i
++) {
70 TRIANGLE(varray
, DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
71 i
+ 0, i
+ 1 + (i
&1), i
+ 2 - (i
&1));
75 for (i
= 0; i
+2 < count
; i
++) {
76 TRIANGLE(varray
, DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
,
77 i
+ 0 + (i
&1), i
+ 1 - (i
&1), i
+ 2);
82 case PIPE_PRIM_TRIANGLE_FAN
:
85 flags
= DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
;
86 for (i
= 0; i
+2 < count
; i
++) {
87 TRIANGLE(varray
, flags
, i
+ 1, i
+ 2, 0);
91 flags
= DRAW_PIPE_RESET_STIPPLE
| DRAW_PIPE_EDGE_FLAG_ALL
;
92 for (i
= 0; i
+2 < count
; i
++) {
93 TRIANGLE(varray
, flags
, 0, i
+ 1, i
+ 2);
100 for (i
= 0; i
+3 < count
; i
+= 4) {
101 QUAD(varray
, i
+ 0, i
+ 1, i
+ 2, i
+ 3);
105 case PIPE_PRIM_QUAD_STRIP
:
106 for (i
= 0; i
+3 < count
; i
+= 2) {
107 QUAD(varray
, i
+ 2, i
+ 0, i
+ 1, i
+ 3);
111 case PIPE_PRIM_POLYGON
:
113 /* These bitflags look a little odd because we submit the
114 * vertices as (1,2,0) to satisfy flatshade requirements.
116 const unsigned edge_first
= DRAW_PIPE_EDGE_FLAG_2
;
117 const unsigned edge_middle
= DRAW_PIPE_EDGE_FLAG_0
;
118 const unsigned edge_last
= DRAW_PIPE_EDGE_FLAG_1
;
120 flags
= DRAW_PIPE_RESET_STIPPLE
| edge_first
| edge_middle
;
122 for (i
= 0; i
+2 < count
; i
++, flags
= edge_middle
) {
127 TRIANGLE(varray
, flags
, i
+ 1, i
+ 2, 0);
137 varray_flush(varray
);