Merge commit 'origin/master' into gallium-0.2
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_decompose.h
1
2
3 static void FUNC( ARGS,
4 unsigned count )
5 {
6 LOCAL_VARS;
7
8 switch (prim) {
9 case PIPE_PRIM_POINTS:
10 for (i = 0; i < count; i ++) {
11 POINT( (i + 0) );
12 }
13 break;
14
15 case PIPE_PRIM_LINES:
16 for (i = 0; i+1 < count; i += 2) {
17 LINE( DRAW_PIPE_RESET_STIPPLE,
18 (i + 0),
19 (i + 1));
20 }
21 break;
22
23 case PIPE_PRIM_LINE_LOOP:
24 if (count >= 2) {
25 flags = DRAW_PIPE_RESET_STIPPLE;
26
27 for (i = 1; i < count; i++, flags = 0) {
28 LINE( flags,
29 (i - 1),
30 (i ));
31 }
32
33 LINE( flags,
34 (i - 1),
35 (0 ));
36 }
37 break;
38
39 case PIPE_PRIM_LINE_STRIP:
40 flags = DRAW_PIPE_RESET_STIPPLE;
41 for (i = 1; i < count; i++, flags = 0) {
42 LINE( flags,
43 (i - 1),
44 (i ));
45 }
46 break;
47
48 case PIPE_PRIM_TRIANGLES:
49 for (i = 0; i+2 < count; i += 3) {
50 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
51 (i + 0),
52 (i + 1),
53 (i + 2 ));
54 }
55 break;
56
57 case PIPE_PRIM_TRIANGLE_STRIP:
58 if (flatfirst) {
59 for (i = 0; i+2 < count; i++) {
60 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
61 (i + 0),
62 (i + 1 + (i&1)),
63 (i + 2 - (i&1)));
64 }
65 }
66 else {
67 for (i = 0; i+2 < count; i++) {
68 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
69 (i + 0 + (i&1)),
70 (i + 1 - (i&1)),
71 (i + 2 ));
72 }
73 }
74 break;
75
76 case PIPE_PRIM_TRIANGLE_FAN:
77 if (count >= 3) {
78 if (flatfirst) {
79 for (i = 0; i+2 < count; i++) {
80 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
81 (i + 1),
82 (i + 2),
83 (0 ));
84 }
85 }
86 else {
87 for (i = 0; i+2 < count; i++) {
88 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
89 (0),
90 (i + 1),
91 (i + 2 ));
92 }
93 }
94 }
95 break;
96
97
98 case PIPE_PRIM_QUADS:
99 for (i = 0; i+3 < count; i += 4) {
100 QUAD( (i + 0),
101 (i + 1),
102 (i + 2),
103 (i + 3));
104 }
105 break;
106
107 case PIPE_PRIM_QUAD_STRIP:
108 for (i = 0; i+3 < count; i += 2) {
109 QUAD( (i + 2),
110 (i + 0),
111 (i + 1),
112 (i + 3));
113 }
114 break;
115
116 case PIPE_PRIM_POLYGON:
117 {
118 /* These bitflags look a little odd because we submit the
119 * vertices as (1,2,0) to satisfy flatshade requirements.
120 */
121 const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
122 const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
123 const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
124
125 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
126
127 for (i = 0; i+2 < count; i++, flags = edge_middle) {
128
129 if (i + 3 == count)
130 flags |= edge_last;
131
132 TRIANGLE( flags,
133 (i + 1),
134 (i + 2),
135 (0));
136 }
137 }
138 break;
139
140 default:
141 assert(0);
142 break;
143 }
144
145 FLUSH;
146 }
147
148
149 #undef TRIANGLE
150 #undef QUAD
151 #undef POINT
152 #undef LINE
153 #undef FUNC