draw: implement flatshade_first for drawing pipeline
[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 (draw->rasterizer->flatshade_first) {
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 printf("%s tri strip %d %d %d\n",
69 __FUNCTION__,
70 (i + 1 + (i&1)),
71 (i + 2 - (i&1)),
72 (i + 0) );
73
74
75 for (i = 0; i+2 < count; i++) {
76 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
77 (i + 1 + (i&1)),
78 (i + 2 - (i&1)),
79 (i + 0) );
80 }
81 }
82 else {
83 for (i = 0; i+2 < count; i++) {
84 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
85 (i + 0 + (i&1)),
86 (i + 1 - (i&1)),
87 (i + 2 ));
88 }
89 }
90 break;
91
92 case PIPE_PRIM_TRIANGLE_FAN:
93 if (count >= 3) {
94 if (flatfirst) {
95 for (i = 0; i+2 < count; i++) {
96 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
97 (i + 2),
98 0,
99 (i + 1) );
100 }
101 }
102 else {
103 for (i = 0; i+2 < count; i++) {
104 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
105 (0),
106 (i + 1),
107 (i + 2 ));
108 }
109 }
110 }
111 break;
112
113
114 case PIPE_PRIM_QUADS:
115 if (flatfirst) {
116 for (i = 0; i+3 < count; i += 4) {
117 QUAD( (i + 1),
118 (i + 2),
119 (i + 3),
120 (i + 0) );
121 }
122 }
123 else {
124 for (i = 0; i+3 < count; i += 4) {
125 QUAD( (i + 0),
126 (i + 1),
127 (i + 2),
128 (i + 3));
129 }
130 }
131 break;
132
133 case PIPE_PRIM_QUAD_STRIP:
134 if (flatfirst) {
135 for (i = 0; i+3 < count; i += 2) {
136 QUAD( (i + 1),
137 (i + 3),
138 (i + 2),
139 (i + 0) );
140 }
141 }
142 else {
143 for (i = 0; i+3 < count; i += 2) {
144 QUAD( (i + 2),
145 (i + 0),
146 (i + 1),
147 (i + 3));
148 }
149 }
150 break;
151
152 case PIPE_PRIM_POLYGON:
153 {
154 /* These bitflags look a little odd because we submit the
155 * vertices as (1,2,0) to satisfy flatshade requirements.
156 */
157 const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
158 const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
159 const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
160
161 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
162
163 for (i = 0; i+2 < count; i++, flags = edge_middle) {
164
165 if (i + 3 == count)
166 flags |= edge_last;
167
168 TRIANGLE( flags,
169 (i + 1),
170 (i + 2),
171 (0));
172 }
173 }
174 break;
175
176 default:
177 assert(0);
178 break;
179 }
180
181 FLUSH;
182 }
183
184
185 #undef TRIANGLE
186 #undef QUAD
187 #undef POINT
188 #undef LINE
189 #undef FUNC