static void FUNC( struct draw_geometry_shader *shader, unsigned pipe_prim, unsigned count ) { struct draw_context *draw = shader->draw; boolean flatfirst = (draw->rasterizer->flatshade && draw->rasterizer->flatshade_first); unsigned i; if (0) debug_printf("%s %d\n", __FUNCTION__, count); switch (pipe_prim) { case PIPE_PRIM_POINTS: for (i = 0; i < count; i++) { POINT( shader, i + 0 ); } break; case PIPE_PRIM_LINES: for (i = 0; i+1 < count; i += 2) { LINE( shader , i + 0 , i + 1 ); } break; case PIPE_PRIM_LINE_LOOP: if (count >= 2) { for (i = 1; i < count; i++) { LINE( shader, i - 1, i ); } LINE( shader, i - 1, 0 ); } break; case PIPE_PRIM_LINE_STRIP: for (i = 1; i < count; i++) { LINE( shader, i - 1, i ); } break; case PIPE_PRIM_TRIANGLES: for (i = 0; i+2 < count; i += 3) { TRIANGLE( shader, i + 0, i + 1, i + 2 ); } break; case PIPE_PRIM_TRIANGLE_STRIP: if (flatfirst) { for (i = 0; i+2 < count; i++) { TRIANGLE( shader, i + 0, i + 1 + (i&1), i + 2 - (i&1) ); } } else { for (i = 0; i+2 < count; i++) { TRIANGLE( shader, i + 0 + (i&1), i + 1 - (i&1), i + 2 ); } } break; case PIPE_PRIM_TRIANGLE_FAN: if (count >= 3) { if (flatfirst) { for (i = 0; i+2 < count; i++) { TRIANGLE( shader, i + 1, i + 2, 0 ); } } else { for (i = 0; i+2 < count; i++) { TRIANGLE( shader, 0, i + 1, i + 2 ); } } } break; case PIPE_PRIM_POLYGON: { /* These bitflags look a little odd because we submit the * vertices as (1,2,0) to satisfy flatshade requirements. */ ushort edge_next, edge_finish; if (flatfirst) { edge_next = DRAW_PIPE_EDGE_FLAG_2; edge_finish = DRAW_PIPE_EDGE_FLAG_0; } else { edge_next = DRAW_PIPE_EDGE_FLAG_0; edge_finish = DRAW_PIPE_EDGE_FLAG_1; } for (i = 0; i+2 < count; i++) { if (flatfirst) { TRIANGLE( shader, 0, i + 1, i + 2 ); } else { TRIANGLE( shader, i + 1, i + 2, 0 ); } } } break; default: assert(0); break; } } #undef TRIANGLE #undef POINT #undef LINE #undef FUNC