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)
8 struct draw_context *draw = shader->draw;
10 boolean flatfirst = (draw->rasterizer->flatshade &&
11 draw->rasterizer->flatshade_first);
13 unsigned count = input_prims->count;
16 if (0) debug_printf("%s %d\n", __FUNCTION__, count);
18 debug_assert(input_prims->primitive_count == 1);
20 switch (input_prims->prim) {
21 case PIPE_PRIM_POINTS:
22 for (i = 0; i < count; i++) {
23 POINT( shader, i + 0 );
28 for (i = 0; i+1 < count; i += 2) {
29 LINE( shader , i + 0 , i + 1 );
33 case PIPE_PRIM_LINE_LOOP:
36 for (i = 1; i < count; i++) {
37 LINE( shader, i - 1, i );
40 LINE( shader, i - 1, 0 );
44 case PIPE_PRIM_LINE_STRIP:
45 for (i = 1; i < count; i++) {
46 LINE( shader, i - 1, i );
50 case PIPE_PRIM_TRIANGLES:
51 for (i = 0; i+2 < count; i += 3) {
52 TRIANGLE( shader, i + 0, i + 1, i + 2 );
56 case PIPE_PRIM_TRIANGLE_STRIP:
58 for (i = 0; i+2 < count; i++) {
66 for (i = 0; i+2 < count; i++) {
75 case PIPE_PRIM_TRIANGLE_FAN:
78 for (i = 0; i+2 < count; i++) {
86 for (i = 0; i+2 < count; i++) {
96 case PIPE_PRIM_POLYGON:
98 for (i = 0; i+2 < count; i++) {
101 TRIANGLE( shader, 0, i + 1, i + 2 );
104 TRIANGLE( shader, i + 1, i + 2, 0 );
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 );
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 );
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);
129 debug_assert(!"Unsupported primitive in geometry shader");