diff options
| author | Brian Paul <brianp@vmware.com> | 2009-06-09 21:53:34 -0600 | 
|---|---|---|
| committer | Brian Paul <brianp@vmware.com> | 2009-06-09 21:53:34 -0600 | 
| commit | 8b45c9ce6e17f9b74f49d308eda3da1c768bc726 (patch) | |
| tree | 0b29434d9d8453d161948414d480e916d350ea9b /src/gallium | |
| parent | 5aec03aaf45ce83cb203849bb3f13c336b232822 (diff) | |
draw: implement flatshade_first for drawing pipeline
Diffstat (limited to 'src/gallium')
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_pipe_vbuf.c | 15 | ||||
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_decompose.h | 72 | 
2 files changed, 67 insertions, 20 deletions
| diff --git a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c index a5d840b96e..1a5269c0de 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c +++ b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c @@ -159,8 +159,19 @@ vbuf_tri( struct draw_stage *stage,     check_space( vbuf, 3 ); -   for (i = 0; i < 3; i++) { -      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] ); +   if (vbuf->stage.draw->rasterizer->flatshade_first) { +      /* Put provoking vertex in position expected by the driver. +       * Emit last provoking vertex in first pos. +       * Swap verts 0 & 1 to preserve polygon winding. +       */ +      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[2] ); +      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[0] ); +      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[1] ); +   } +   else { +      for (i = 0; i < 3; i++) { +         vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] ); +      }     }  } diff --git a/src/gallium/auxiliary/draw/draw_pt_decompose.h b/src/gallium/auxiliary/draw/draw_pt_decompose.h index 3fb0695687..a86c8d7877 100644 --- a/src/gallium/auxiliary/draw/draw_pt_decompose.h +++ b/src/gallium/auxiliary/draw/draw_pt_decompose.h @@ -47,20 +47,36 @@ static void FUNC( ARGS,     case PIPE_PRIM_TRIANGLES:        for (i = 0; i+2 < count; i += 3) { -         TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, -                   (i + 0), -                   (i + 1), -                   (i + 2 )); +         if (draw->rasterizer->flatshade_first) { +            /* put provoking vertex in last pos for clipper */ +            TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, +                      (i + 1), +                      (i + 2), +                      (i + 0 )); +         } +         else { +            TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, +                      (i + 0), +                      (i + 1), +                      (i + 2 )); +         }        }        break;     case PIPE_PRIM_TRIANGLE_STRIP:        if (flatfirst) { +         printf("%s tri strip %d %d %d\n", +                __FUNCTION__, +                (i + 1 + (i&1)), +                (i + 2 - (i&1)), +                (i + 0) ); + +           for (i = 0; i+2 < count; i++) {              TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, -                      (i + 0),                        (i + 1 + (i&1)), -                      (i + 2 - (i&1))); +                      (i + 2 - (i&1)), +                      (i + 0) );           }        }        else { @@ -78,9 +94,9 @@ static void FUNC( ARGS,           if (flatfirst) {              for (i = 0; i+2 < count; i++) {                 TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, -                         (i + 1),                           (i + 2), -                         (0 )); +                         0, +                         (i + 1) );              }           }           else { @@ -96,20 +112,40 @@ static void FUNC( ARGS,     case PIPE_PRIM_QUADS: -      for (i = 0; i+3 < count; i += 4) { -         QUAD( (i + 0), -               (i + 1), -               (i + 2), -               (i + 3)); +      if (flatfirst) { +         for (i = 0; i+3 < count; i += 4) { +            QUAD( (i + 1), +                  (i + 2), +                  (i + 3), +                  (i + 0) ); +         } +      } +      else { +         for (i = 0; i+3 < count; i += 4) { +            QUAD( (i + 0), +                  (i + 1), +                  (i + 2), +                  (i + 3)); +         }        }        break;     case PIPE_PRIM_QUAD_STRIP: -      for (i = 0; i+3 < count; i += 2) { -         QUAD( (i + 2), -               (i + 0), -               (i + 1), -               (i + 3)); +      if (flatfirst) { +         for (i = 0; i+3 < count; i += 2) { +            QUAD( (i + 1), +                  (i + 3), +                  (i + 2), +                  (i + 0) ); +         } +      } +      else { +         for (i = 0; i+3 < count; i += 2) { +            QUAD( (i + 2), +                  (i + 0), +                  (i + 1), +                  (i + 3)); +         }        }        break; | 
