diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_gs_tmp.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/draw/draw_gs_tmp.h b/src/gallium/auxiliary/draw/draw_gs_tmp.h new file mode 100644 index 00000000000..eb4a313ca18 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_gs_tmp.h @@ -0,0 +1,129 @@ + +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 |