X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsoftpipe%2Fsp_quad_fs.c;h=8ec1aa2fc630ded23f5ef4b845306d2d9d47dd64;hb=2000086fcd5174f121f61dd6df5948c67101e148;hp=d74d6d4914e90210874fe54cfc408e17be6bcb8b;hpb=636d01bd61cac83e13c3c64874e7e34e828ca93a;p=mesa.git diff --git a/src/gallium/drivers/softpipe/sp_quad_fs.c b/src/gallium/drivers/softpipe/sp_quad_fs.c index d74d6d4914e..8ec1aa2fc63 100644 --- a/src/gallium/drivers/softpipe/sp_quad_fs.c +++ b/src/gallium/drivers/softpipe/sp_quad_fs.c @@ -74,6 +74,7 @@ shade_quad(struct quad_stage *qs, struct quad_header *quad) struct tgsi_exec_machine *machine = softpipe->fs_machine; /* run shader */ + machine->flatshade_color = softpipe->rasterizer->flatshade ? TRUE : FALSE; return softpipe->fs_variant->run( softpipe->fs_variant, machine, quad ); } @@ -89,7 +90,7 @@ coverage_quad(struct quad_stage *qs, struct quad_header *quad) for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) { float (*quadColor)[4] = quad->output.color[cbuf]; unsigned j; - for (j = 0; j < QUAD_SIZE; j++) { + for (j = 0; j < TGSI_QUAD_SIZE; j++) { assert(quad->input.coverage[j] >= 0.0); assert(quad->input.coverage[j] <= 1.0); quadColor[3][j] *= quad->input.coverage[j]; @@ -118,7 +119,16 @@ shade_quads(struct quad_stage *qs, machine->InterpCoefs = quads[0]->coef; for (i = 0; i < nr; i++) { - if (!shade_quad(qs, quads[i])) + /* Only omit this quad from the output list if all the fragments + * are killed _AND_ it's not the first quad in the list. + * The first quad is special in the (optimized) depth-testing code: + * the quads' Z coordinates are step-wise interpolated with respect + * to the first quad in the list. + * For multi-pass algorithms we need to produce exactly the same + * Z values in each pass. If interpolation starts with different quads + * we can get different Z values for the same (x,y). + */ + if (!shade_quad(qs, quads[i]) && i > 0) continue; /* quad totally culled/killed */ if (/*do_coverage*/ 0)