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