Merge commit 'origin/openvg-1.0'
[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 if (flatfirst) {
51 /* put provoking vertex in last pos for clipper */
52 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
53 (i + 1),
54 (i + 2),
55 (i + 0 ));
56 }
57 else {
58 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
59 (i + 0),
60 (i + 1),
61 (i + 2 ));
62 }
63 }
64 break;
65
66 case PIPE_PRIM_TRIANGLE_STRIP:
67 if (flatfirst) {
68 for (i = 0; i+2 < count; i++) {
69 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
70 (i + 1 + (i&1)),
71 (i + 2 - (i&1)),
72 (i + 0) );
73 }
74 }
75 else {
76 for (i = 0; i+2 < count; i++) {
77 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
78 (i + 0 + (i&1)),
79 (i + 1 - (i&1)),
80 (i + 2 ));
81 }
82 }
83 break;
84
85 case PIPE_PRIM_TRIANGLE_FAN:
86 if (count >= 3) {
87 if (flatfirst) {
88 for (i = 0; i+2 < count; i++) {
89 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
90 (i + 2),
91 0,
92 (i + 1) );
93 }
94 }
95 else {
96 for (i = 0; i+2 < count; i++) {
97 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
98 (0),
99 (i + 1),
100 (i + 2 ));
101 }
102 }
103 }
104 break;
105
106
107 case PIPE_PRIM_QUADS:
108 if (flatfirst) {
109 for (i = 0; i+3 < count; i += 4) {
110 QUAD( (i + 1),
111 (i + 2),
112 (i + 3),
113 (i + 0) );
114 }
115 }
116 else {
117 for (i = 0; i+3 < count; i += 4) {
118 QUAD( (i + 0),
119 (i + 1),
120 (i + 2),
121 (i + 3));
122 }
123 }
124 break;
125
126 case PIPE_PRIM_QUAD_STRIP:
127 if (flatfirst) {
128 for (i = 0; i+3 < count; i += 2) {
129 QUAD( (i + 1),
130 (i + 3),
131 (i + 2),
132 (i + 0) );
133 }
134 }
135 else {
136 for (i = 0; i+3 < count; i += 2) {
137 QUAD( (i + 2),
138 (i + 0),
139 (i + 1),
140 (i + 3));
141 }
142 }
143 break;
144
145 case PIPE_PRIM_POLYGON:
146 {
147 /* These bitflags look a little odd because we submit the
148 * vertices as (1,2,0) to satisfy flatshade requirements.
149 */
150 const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
151 const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
152 const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
153
154 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
155
156 for (i = 0; i+2 < count; i++, flags = edge_middle) {
157
158 if (i + 3 == count)
159 flags |= edge_last;
160
161 TRIANGLE( flags,
162 (i + 1),
163 (i + 2),
164 (0));
165 }
166 }
167 break;
168
169 default:
170 assert(0);
171 break;
172 }
173
174 FLUSH;
175 }
176
177
178 #undef TRIANGLE
179 #undef QUAD
180 #undef POINT
181 #undef LINE
182 #undef FUNC