draw: implement triangle strips with adjacency in geometry shader
[profile/ivi/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, j;
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    case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
128       for (i = 0, j = 0; i+5 < count; i += 2, ++j) {
129          TRI_ADJ( shader,
130                   i + 0,
131                   i + 1 + 2*(j&1),
132                   i + 2 + 2*(j&1),
133                   i + 3 - 2*(j&1),
134                   i + 4 - 2*(j&1),
135                   i + 5);
136       }
137       break;
138
139    default:
140       debug_assert(!"Unsupported primitive in geometry shader");
141       break;
142    }
143 }
144
145
146 #undef TRIANGLE
147 #undef TRI_ADJ
148 #undef POINT
149 #undef LINE
150 #undef LINE_ADJ
151 #undef FUNC
152 #undef LOCAL_VARS