Merge branch 'glsl2-head' into glsl2
[mesa.git] / src / gallium / auxiliary / draw / draw_so_emit_tmp.h
1
2 static void FUNC( struct pt_so_emit *so,
3 const struct draw_prim_info *input_prims,
4 const struct draw_vertex_info *input_verts,
5 unsigned start,
6 unsigned count)
7 {
8 struct draw_context *draw = so->draw;
9
10 boolean flatfirst = (draw->rasterizer->flatshade &&
11 draw->rasterizer->flatshade_first);
12 unsigned i;
13 LOCAL_VARS
14
15 if (0) debug_printf("%s %d\n", __FUNCTION__, count);
16
17 debug_assert(input_prims->primitive_count == 1);
18
19 switch (input_prims->prim) {
20 case PIPE_PRIM_POINTS:
21 for (i = 0; i < count; i++) {
22 POINT( so, start + i + 0 );
23 }
24 break;
25
26 case PIPE_PRIM_LINES:
27 for (i = 0; i+1 < count; i += 2) {
28 LINE( so , start + i + 0 , start + i + 1 );
29 }
30 break;
31
32 case PIPE_PRIM_LINE_LOOP:
33 if (count >= 2) {
34
35 for (i = 1; i < count; i++) {
36 LINE( so, start + i - 1, start + i );
37 }
38
39 LINE( so, start + i - 1, start );
40 }
41 break;
42
43 case PIPE_PRIM_LINE_STRIP:
44 for (i = 1; i < count; i++) {
45 LINE( so, start + i - 1, start + i );
46 }
47 break;
48
49 case PIPE_PRIM_TRIANGLES:
50 for (i = 0; i+2 < count; i += 3) {
51 TRIANGLE( so, start + i + 0, start + i + 1, start + i + 2 );
52 }
53 break;
54
55 case PIPE_PRIM_TRIANGLE_STRIP:
56 if (flatfirst) {
57 for (i = 0; i+2 < count; i++) {
58 TRIANGLE( so,
59 start + i + 0,
60 start + i + 1 + (i&1),
61 start + i + 2 - (i&1) );
62 }
63 }
64 else {
65 for (i = 0; i+2 < count; i++) {
66 TRIANGLE( so,
67 start + i + 0 + (i&1),
68 start + i + 1 - (i&1),
69 start + i + 2 );
70 }
71 }
72 break;
73
74 case PIPE_PRIM_TRIANGLE_FAN:
75 if (count >= 3) {
76 if (flatfirst) {
77 for (i = 0; i+2 < count; i++) {
78 TRIANGLE( so,
79 start + i + 1,
80 start + i + 2,
81 start );
82 }
83 }
84 else {
85 for (i = 0; i+2 < count; i++) {
86 TRIANGLE( so,
87 start,
88 start + i + 1,
89 start + i + 2 );
90 }
91 }
92 }
93 break;
94
95 case PIPE_PRIM_POLYGON:
96 {
97 /* These bitflags look a little odd because we submit the
98 * vertices as (1,2,0) to satisfy flatshade requirements.
99 */
100
101 for (i = 0; i+2 < count; i++) {
102
103 if (flatfirst) {
104 TRIANGLE( so, start + 0, start + i + 1, start + i + 2 );
105 }
106 else {
107 TRIANGLE( so, start + i + 1, start + i + 2, start + 0 );
108 }
109 }
110 }
111 break;
112
113 default:
114 debug_assert(!"Unsupported primitive in stream output");
115 break;
116 }
117 }
118
119
120 #undef TRIANGLE
121 #undef POINT
122 #undef LINE
123 #undef FUNC