draw: forgot to add a file

This commit is contained in:
Zack Rusin 2010-06-10 15:25:30 -04:00
parent 29639932f7
commit 9896b7ebeb

View file

@ -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