header.pad = 0;
for (i = 2; i < n; i++, header.flags = edge_middle) {
- header.v[0] = inlist[i-1];
- header.v[1] = inlist[i];
- header.v[2] = inlist[0]; /* keep in v[2] for flatshading */
+ /* keep in provoking vertex for flatshading */
+ if (stage->draw->rasterizer->flatshade_first) {
+ header.v[0] = inlist[0];
+ header.v[1] = inlist[i-1];
+ header.v[2] = inlist[i];
+ }
+ else {
+ header.v[0] = inlist[i-1];
+ header.v[1] = inlist[i];
+ header.v[2] = inlist[0];
+ }
if (i == n-1)
header.flags |= edge_last;
/* If flat-shading, copy color to new provoking vertex.
*/
- if (clipper->flat && inlist[0] != header->v[2]) {
- inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
+ if (stage->draw->rasterizer->flatshade_first) {
+ if (clipper->flat && inlist[0] != header->v[0]) {
+ inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
+
+ copy_colors(stage, inlist[0], header->v[0]);
+ }
+ } else {
+ if (clipper->flat && inlist[0] != header->v[2]) {
+ inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
- copy_colors(stage, inlist[0], header->v[2]);
+ copy_colors(stage, inlist[0], header->v[2]);
+ }
}
+
/* Emit the polygon as triangles to the setup stage:
*/
if (n >= 3)
case PIPE_PRIM_TRIANGLES:
for (i = 0; i+2 < count; i += 3) {
- if (flatfirst) {
- /* 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 ));
- }
+ TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
+ (i + 0),
+ (i + 1),
+ (i + 2 ));
}
break;
if (flatfirst) {
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 + 0) );
+ (i + 2 - (i&1)) );
}
}
else {
if (flatfirst) {
for (i = 0; i+2 < count; i++) {
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
+ (i + 1),
(i + 2),
- 0,
- (i + 1) );
+ 0 );
}
}
else {