X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsoftpipe%2Fsp_quad_fs.c;h=8fb632d9dcf1f7832408d2ee8167774ddb1f2908;hb=d70f96fd674cfb5a1aeedce179c2cc02c38a9fad;hp=d74d6d4914e90210874fe54cfc408e17be6bcb8b;hpb=4683529048ee133481b2d8f1cae1685aa1736f9a;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..8fb632d9dcf 100644 --- a/src/gallium/drivers/softpipe/sp_quad_fs.c +++ b/src/gallium/drivers/softpipe/sp_quad_fs.c @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2007 VMware, Inc. * All Rights Reserved. * Copyright 2008 VMware, Inc. All rights reserved. * @@ -19,7 +19,7 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -56,7 +56,7 @@ struct quad_shade_stage /** cast wrapper */ -static INLINE struct quad_shade_stage * +static inline struct quad_shade_stage * quad_shade_stage(struct quad_stage *qs) { return (struct quad_shade_stage *) qs; @@ -67,14 +67,20 @@ quad_shade_stage(struct quad_stage *qs) * Execute fragment shader for the four fragments in the quad. * \return TRUE if quad is alive, FALSE if all four pixels are killed */ -static INLINE boolean +static inline boolean shade_quad(struct quad_stage *qs, struct quad_header *quad) { struct softpipe_context *softpipe = qs->softpipe; struct tgsi_exec_machine *machine = softpipe->fs_machine; + if (softpipe->active_statistics_queries) { + softpipe->pipeline_statistics.ps_invocations += + util_bitcount(quad->inout.mask); + } + /* run shader */ - return softpipe->fs_variant->run( softpipe->fs_variant, machine, quad ); + machine->flatshade_color = softpipe->rasterizer->flatshade ? TRUE : FALSE; + return softpipe->fs_variant->run( softpipe->fs_variant, machine, quad, softpipe->early_depth ); } @@ -89,7 +95,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 +124,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) @@ -138,13 +153,6 @@ shade_quads(struct quad_stage *qs, static void shade_begin(struct quad_stage *qs) { - struct softpipe_context *softpipe = qs->softpipe; - - softpipe->fs_variant->prepare( softpipe->fs_variant, - softpipe->fs_machine, - (struct tgsi_sampler **) - softpipe->tgsi.frag_samplers_list ); - qs->next->begin(qs->next); }