draw: implement triangle lists with adjacency support in gs
[mesa.git] / src / gallium / auxiliary / draw / draw_gs_tmp.h
1
2 static void FUNC( struct draw_geometry_shader *shader,
3 const struct draw_prim_info *input_prims,
4 const struct draw_vertex_info *input_verts,
5 struct draw_prim_info *output_prims,
6 struct draw_vertex_info *output_verts)
7 {
8 struct draw_context *draw = shader->draw;
9
10 boolean flatfirst = (draw->rasterizer->flatshade &&
11 draw->rasterizer->flatshade_first);
12 unsigned i;
13 unsigned count = input_prims->count;
14 LOCAL_VARS
15
16 if (0) debug_printf("%s %d\n", __FUNCTION__, count);
17
18 debug_assert(input_prims->primitive_count == 1);
19
20 switch (input_prims->prim) {
21 case PIPE_PRIM_POINTS:
22 for (i = 0; i < count; i++) {
23 POINT( shader, i + 0 );
24 }
25 break;
26
27 case PIPE_PRIM_LINES:
28 for (i = 0; i+1 < count; i += 2) {
29 LINE( shader , i + 0 , i + 1 );
30 }
31 break;
32
33 case PIPE_PRIM_LINE_LOOP:
34 if (count >= 2) {
35
36 for (i = 1; i < count; i++) {
37 LINE( shader, i - 1, i );
38 }
39
40 LINE( shader, i - 1, 0 );
41 }
42 break;
43
44 case PIPE_PRIM_LINE_STRIP:
45 for (i = 1; i < count; i++) {
46 LINE( shader, i - 1, i );
47 }
48 break;
49
50 case PIPE_PRIM_TRIANGLES:
51 for (i = 0; i+2 < count; i += 3) {
52 TRIANGLE( shader, i + 0, i + 1, i + 2 );
53 }
54 break;
55
56 case PIPE_PRIM_TRIANGLE_STRIP:
57 if (flatfirst) {
58 for (i = 0; i+2 < count; i++) {
59 TRIANGLE( shader,
60 i + 0,
61 i + 1 + (i&1),
62 i + 2 - (i&1) );
63 }
64 }
65 else {
66 for (i = 0; i+2 < count; i++) {
67 TRIANGLE( shader,
68 i + 0 + (i&1),
69 i + 1 - (i&1),
70 i + 2 );
71 }
72 }
73 break;
74
75 case PIPE_PRIM_TRIANGLE_FAN:
76 if (count >= 3) {
77 if (flatfirst) {
78 for (i = 0; i+2 < count; i++) {
79 TRIANGLE( shader,
80 i + 1,
81 i + 2,
82 0 );
83 }
84 }
85 else {
86 for (i = 0; i+2 < count; i++) {
87 TRIANGLE( shader,
88 0,
89 i + 1,
90 i + 2 );
91 }
92 }
93 }
94 break;
95
96 case PIPE_PRIM_POLYGON:
97 {
98 for (i = 0; i+2 < count; i++) {
99
100 if (flatfirst) {
101 TRIANGLE( shader, 0, i + 1, i + 2 );
102 }
103 else {
104 TRIANGLE( shader, i + 1, i + 2, 0 );
105 }
106 }
107 }
108 break;
109
110 case PIPE_PRIM_LINES_ADJACENCY:
111 for (i = 0; i+3 < count; i += 4) {
112 LINE_ADJ( shader , i + 0 , i + 1, i + 2, i + 3 );
113 }
114 break;
115 case PIPE_PRIM_LINE_STRIP_ADJACENCY:
116 for (i = 1; i + 2 < count; i++) {
117 LINE_ADJ( shader, i - 1, i, i + 1, i + 2 );
118 }
119 break;
120
121 case PIPE_PRIM_TRIANGLES_ADJACENCY:
122 for (i = 0; i+5 < count; i += 5) {
123 TRI_ADJ( shader, i + 0, i + 1, i + 2,
124 i + 3, i + 4, i + 5);
125 }
126 break;
127
128 default:
129 debug_assert(!"Unsupported primitive in geometry shader");
130 break;
131 }
132 }
133
134
135 #undef TRIANGLE
136 #undef TRI_ADJ
137 #undef POINT
138 #undef LINE
139 #undef LINE_ADJ
140 #undef FUNC
141 #undef LOCAL_VARS