Revert "draw: no need to rearrange most primitives in vcache for flatshade-first"
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_vcache_tmp.h
1
2
3 static void FUNC( struct draw_pt_front_end *frontend,
4 pt_elt_func get_elt,
5 const void *elts,
6 unsigned count )
7 {
8 struct vcache_frontend *vcache = (struct vcache_frontend *)frontend;
9 struct draw_context *draw = vcache->draw;
10
11 boolean flatfirst = (draw->rasterizer->flatshade &&
12 draw->rasterizer->flatshade_first);
13 unsigned i;
14 ushort flags;
15
16 if (0) debug_printf("%s %d\n", __FUNCTION__, count);
17
18
19 switch (vcache->input_prim) {
20 case PIPE_PRIM_POINTS:
21 for (i = 0; i < count; i ++) {
22 POINT( vcache,
23 get_elt(elts, i + 0) );
24 }
25 break;
26
27 case PIPE_PRIM_LINES:
28 for (i = 0; i+1 < count; i += 2) {
29 LINE( vcache,
30 DRAW_PIPE_RESET_STIPPLE,
31 get_elt(elts, i + 0),
32 get_elt(elts, i + 1));
33 }
34 break;
35
36 case PIPE_PRIM_LINE_LOOP:
37 if (count >= 2) {
38 flags = DRAW_PIPE_RESET_STIPPLE;
39
40 for (i = 1; i < count; i++, flags = 0) {
41 LINE( vcache,
42 flags,
43 get_elt(elts, i - 1),
44 get_elt(elts, i ));
45 }
46
47 LINE( vcache,
48 flags,
49 get_elt(elts, i - 1),
50 get_elt(elts, 0 ));
51 }
52 break;
53
54 case PIPE_PRIM_LINE_STRIP:
55 flags = DRAW_PIPE_RESET_STIPPLE;
56 for (i = 1; i < count; i++, flags = 0) {
57 LINE( vcache,
58 flags,
59 get_elt(elts, i - 1),
60 get_elt(elts, i ));
61 }
62 break;
63
64 case PIPE_PRIM_TRIANGLES:
65 for (i = 0; i+2 < count; i += 3) {
66 TRIANGLE( vcache,
67 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
68 get_elt(elts, i + 0),
69 get_elt(elts, i + 1),
70 get_elt(elts, i + 2 ));
71 }
72 break;
73
74 case PIPE_PRIM_TRIANGLE_STRIP:
75 if (flatfirst) {
76 for (i = 0; i+2 < count; i++) {
77 TRIANGLE( vcache,
78 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
79 get_elt(elts, i + 0),
80 get_elt(elts, i + 1 + (i&1)),
81 get_elt(elts, i + 2 - (i&1)));
82 }
83 }
84 else {
85 for (i = 0; i+2 < count; i++) {
86 TRIANGLE( vcache,
87 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
88 get_elt(elts, i + 0 + (i&1)),
89 get_elt(elts, i + 1 - (i&1)),
90 get_elt(elts, i + 2 ));
91 }
92 }
93 break;
94
95 case PIPE_PRIM_TRIANGLE_FAN:
96 if (count >= 3) {
97 if (flatfirst) {
98 for (i = 0; i+2 < count; i++) {
99 TRIANGLE( vcache,
100 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
101 get_elt(elts, i + 1),
102 get_elt(elts, i + 2),
103 get_elt(elts, 0 ));
104 }
105 }
106 else {
107 for (i = 0; i+2 < count; i++) {
108 TRIANGLE( vcache,
109 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
110 get_elt(elts, 0),
111 get_elt(elts, i + 1),
112 get_elt(elts, i + 2 ));
113 }
114 }
115 }
116 break;
117
118
119 case PIPE_PRIM_QUADS:
120 for (i = 0; i+3 < count; i += 4) {
121 QUAD( vcache,
122 get_elt(elts, i + 0),
123 get_elt(elts, i + 1),
124 get_elt(elts, i + 2),
125 get_elt(elts, i + 3));
126 }
127 break;
128
129 case PIPE_PRIM_QUAD_STRIP:
130 for (i = 0; i+3 < count; i += 2) {
131 QUAD( vcache,
132 get_elt(elts, i + 2),
133 get_elt(elts, i + 0),
134 get_elt(elts, i + 1),
135 get_elt(elts, i + 3));
136 }
137 break;
138
139 case PIPE_PRIM_POLYGON:
140 {
141 /* These bitflags look a little odd because we submit the
142 * vertices as (1,2,0) to satisfy flatshade requirements.
143 */
144 const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
145 const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
146 const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
147
148 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
149
150 for (i = 0; i+2 < count; i++, flags = edge_middle) {
151
152 if (i + 3 == count)
153 flags |= edge_last;
154
155 TRIANGLE( vcache,
156 flags,
157 get_elt(elts, i + 1),
158 get_elt(elts, i + 2),
159 get_elt(elts, 0));
160 }
161 }
162 break;
163
164 default:
165 assert(0);
166 break;
167 }
168
169 vcache_flush( vcache );
170 }
171
172
173 #undef TRIANGLE
174 #undef QUAD
175 #undef POINT
176 #undef LINE
177 #undef FUNC