Merge remote branch 'origin/7.8'
[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 for (i = 0; i+3 < count; i += 4) {
109 QUAD( (i + 0),
110 (i + 1),
111 (i + 2),
112 (i + 3));
113 }
114 break;
115
116 case PIPE_PRIM_QUAD_STRIP:
117 for (i = 0; i+3 < count; i += 2) {
118 QUAD( (i + 2),
119 (i + 0),
120 (i + 1),
121 (i + 3));
122 }
123 break;
124
125 case PIPE_PRIM_POLYGON:
126 {
127 /* These bitflags look a little odd because we submit the
128 * vertices as (1,2,0) to satisfy flatshade requirements.
129 */
130 const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
131 const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
132 const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
133
134 flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
135
136 for (i = 0; i+2 < count; i++, flags = edge_middle) {
137
138 if (i + 3 == count)
139 flags |= edge_last;
140
141 TRIANGLE( flags,
142 (i + 1),
143 (i + 2),
144 (0));
145 }
146 }
147 break;
148
149 default:
150 assert(0);
151 break;
152 }
153
154 FLUSH;
155 }
156
157
158 #undef TRIANGLE
159 #undef QUAD
160 #undef POINT
161 #undef LINE
162 #undef FUNC