Merge branch 'gallium-msaa'
[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 /* Emit first triangle vertex as first triangle vertex */
61 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
62 (i + 0),
63 (i + 1 + (i&1)),
64 (i + 2 - (i&1)) );
65 }
66 }
67 else {
68 for (i = 0; i+2 < count; i++) {
69 /* Emit last triangle vertex as last triangle vertex */
70 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
71 (i + 0 + (i&1)),
72 (i + 1 - (i&1)),
73 (i + 2 ));
74 }
75 }
76 break;
77
78 case PIPE_PRIM_TRIANGLE_FAN:
79 if (count >= 3) {
80 if (flatfirst) {
81 for (i = 0; i+2 < count; i++) {
82 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
83 (i + 1),
84 (i + 2),
85 0 );
86 }
87 }
88 else {
89 for (i = 0; i+2 < count; i++) {
90 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
91 (0),
92 (i + 1),
93 (i + 2 ));
94 }
95 }
96 }
97 break;
98
99
100 case PIPE_PRIM_QUADS:
101 /* GL quads don't follow provoking vertex convention */
102 if (flatfirst) {
103 for (i = 0; i+3 < count; i += 4) {
104 /* emit last quad vertex as first triangle vertex */
105 QUAD_FIRST_PV( (i + 3),
106 (i + 0),
107 (i + 1),
108 (i + 2) );
109 }
110 }
111 else {
112 for (i = 0; i+3 < count; i += 4) {
113 /* emit last quad vertex as last triangle vertex */
114 QUAD_LAST_PV( (i + 0),
115 (i + 1),
116 (i + 2),
117 (i + 3) );
118 }
119 }
120 break;
121
122 case PIPE_PRIM_QUAD_STRIP:
123 /* GL quad strips don't follow provoking vertex convention */
124 if (flatfirst) {
125 for (i = 0; i+3 < count; i += 2) {
126 /* emit last quad vertex as first triangle vertex */
127 QUAD_FIRST_PV( (i + 3),
128 (i + 2),
129 (i + 0),
130 (i + 1) );
131
132 }
133 }
134 else {
135 for (i = 0; i+3 < count; i += 2) {
136 /* emit last quad vertex as last triangle vertex */
137 QUAD_LAST_PV( (i + 2),
138 (i + 0),
139 (i + 1),
140 (i + 3) );
141 }
142 }
143 break;
144
145 case PIPE_PRIM_POLYGON:
146 /* GL polygons don't follow provoking vertex convention */
147 {
148 /* These bitflags look a little odd because we submit the
149 * vertices as (1,2,0) to satisfy flatshade requirements.
150 */
151 const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
152 const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
153 const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
154
155 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
156
157 for (i = 0; i+2 < count; i++, flags = edge_middle) {
158
159 if (i + 3 == count)
160 flags |= edge_last;
161
162 if (flatfirst) {
163 /* emit first polygon vertex as first triangle vertex */
164 TRIANGLE( flags,
165 (0),
166 (i + 1),
167 (i + 2) );
168 }
169 else {
170 /* emit first polygon vertex as last triangle vertex */
171 TRIANGLE( flags,
172 (i + 1),
173 (i + 2),
174 (0));
175 }
176 }
177 }
178 break;
179
180 default:
181 assert(0);
182 break;
183 }
184
185 FLUSH;
186 }
187
188
189 #undef TRIANGLE
190 #undef QUAD_FIRST_PV
191 #undef QUAD_LAST_PV
192 #undef POINT
193 #undef LINE
194 #undef FUNC