draw: ensure vs outputs mapped correctly to vinfo attribs
[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, flags;
14
15
16 switch (vcache->input_prim) {
17 case PIPE_PRIM_POINTS:
18 for (i = 0; i < count; i ++) {
19 POINT( vcache,
20 get_elt(elts, i + 0) );
21 }
22 break;
23
24 case PIPE_PRIM_LINES:
25 for (i = 0; i+1 < count; i += 2) {
26 LINE( vcache,
27 DRAW_PIPE_RESET_STIPPLE,
28 get_elt(elts, i + 0),
29 get_elt(elts, i + 1));
30 }
31 break;
32
33 case PIPE_PRIM_LINE_LOOP:
34 if (count >= 2) {
35 flags = DRAW_PIPE_RESET_STIPPLE;
36
37 for (i = 1; i < count; i++, flags = 0) {
38 LINE( vcache,
39 flags,
40 get_elt(elts, i - 1),
41 get_elt(elts, i ));
42 }
43
44 LINE( vcache,
45 flags,
46 get_elt(elts, i - 1),
47 get_elt(elts, 0 ));
48 }
49 break;
50
51 case PIPE_PRIM_LINE_STRIP:
52 flags = DRAW_PIPE_RESET_STIPPLE;
53 for (i = 1; i < count; i++, flags = 0) {
54 LINE( vcache,
55 flags,
56 get_elt(elts, i - 1),
57 get_elt(elts, i ));
58 }
59 break;
60
61 case PIPE_PRIM_TRIANGLES:
62 for (i = 0; i+2 < count; i += 3) {
63 TRIANGLE( vcache,
64 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
65 get_elt(elts, i + 0),
66 get_elt(elts, i + 1),
67 get_elt(elts, i + 2 ));
68 }
69 break;
70
71 case PIPE_PRIM_TRIANGLE_STRIP:
72 if (flatfirst) {
73 for (i = 0; i+2 < count; i++) {
74 TRIANGLE( vcache,
75 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
76 get_elt(elts, i + 0),
77 get_elt(elts, i + 1 + (i&1)),
78 get_elt(elts, i + 2 - (i&1)));
79 }
80 }
81 else {
82 for (i = 0; i+2 < count; i++) {
83 TRIANGLE( vcache,
84 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
85 get_elt(elts, i + 0 + (i&1)),
86 get_elt(elts, i + 1 - (i&1)),
87 get_elt(elts, 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( vcache,
97 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
98 get_elt(elts, i + 1),
99 get_elt(elts, i + 2),
100 get_elt(elts, 0 ));
101 }
102 }
103 else {
104 for (i = 0; i+2 < count; i++) {
105 TRIANGLE( vcache,
106 DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
107 get_elt(elts, 0),
108 get_elt(elts, i + 1),
109 get_elt(elts, i + 2 ));
110 }
111 }
112 }
113 break;
114
115
116 case PIPE_PRIM_QUADS:
117 for (i = 0; i+3 < count; i += 4) {
118 QUAD( vcache,
119 get_elt(elts, i + 0),
120 get_elt(elts, i + 1),
121 get_elt(elts, i + 2),
122 get_elt(elts, i + 3));
123 }
124 break;
125
126 case PIPE_PRIM_QUAD_STRIP:
127 for (i = 0; i+3 < count; i += 2) {
128 QUAD( vcache,
129 get_elt(elts, i + 2),
130 get_elt(elts, i + 0),
131 get_elt(elts, i + 1),
132 get_elt(elts, i + 3));
133 }
134 break;
135
136 case PIPE_PRIM_POLYGON:
137 {
138 /* These bitflags look a little odd because we submit the
139 * vertices as (1,2,0) to satisfy flatshade requirements.
140 */
141 const unsigned edge_first = DRAW_PIPE_EDGE_FLAG_2;
142 const unsigned edge_middle = DRAW_PIPE_EDGE_FLAG_0;
143 const unsigned edge_last = DRAW_PIPE_EDGE_FLAG_1;
144
145 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
146
147 for (i = 0; i+2 < count; i++, flags = edge_middle) {
148
149 if (i + 3 == count)
150 flags |= edge_last;
151
152 TRIANGLE( vcache,
153 flags,
154 get_elt(elts, i + 1),
155 get_elt(elts, i + 2),
156 get_elt(elts, 0));
157 }
158 }
159 break;
160
161 default:
162 assert(0);
163 break;
164 }
165
166 vcache_flush( vcache );
167 }
168
169
170 #undef TRIANGLE
171 #undef QUAD
172 #undef POINT
173 #undef LINE
174 #undef FUNC