From e108716429f85aca3d2a70c609248b7b82f050b4 Mon Sep 17 00:00:00 2001 From: Roland Scheidegger Date: Tue, 21 May 2013 23:57:33 +0200 Subject: [PATCH] llvmpipe: fix early depth test / late depth write stencil issues We actually did early depth/stencil test and late depth/stencil write even when the shader could kill the fragment (alpha test or discard). Since it matters for the new stencil value if the fragment is killed by depth/stencil test or by the shader (in which case it will not reach the depth/stencil test) this simply cannot work (we also would possibly skip writing the new stencil value due to mask checks but this is a secondary issue). So use late depth test / late depth write instead in this case. (No piglit changes as it doesn't seem to hit such bogus early depth test / late depth write path.) Reviewed-by: Jose Fonseca --- src/gallium/drivers/llvmpipe/lp_state_fs.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index 754288ba0e2..98a5a497703 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -266,13 +266,20 @@ generate_fs_loop(struct gallivm_state *gallivm, assert(zs_format_desc); if (!shader->info.base.writes_z) { - if (key->alpha.enabled || shader->info.base.uses_kill) + if (key->alpha.enabled || shader->info.base.uses_kill) { /* With alpha test and kill, can do the depth test early * and hopefully eliminate some quads. But need to do a * special deferred depth write once the final mask value - * is known. + * is known. This only works though if there's either no + * stencil test or the stencil value isn't written. */ - depth_mode = EARLY_DEPTH_TEST | LATE_DEPTH_WRITE; + if (key->stencil[0].enabled && (key->stencil[0].writemask || + (key->stencil[1].enabled && + key->stencil[1].writemask))) + depth_mode = LATE_DEPTH_TEST | LATE_DEPTH_WRITE; + else + depth_mode = EARLY_DEPTH_TEST | LATE_DEPTH_WRITE; + } else depth_mode = EARLY_DEPTH_TEST | EARLY_DEPTH_WRITE; } @@ -281,9 +288,9 @@ generate_fs_loop(struct gallivm_state *gallivm, } if (!(key->depth.enabled && key->depth.writemask) && - !((key->stencil[0].enabled && (key->stencil[0].writemask || + !(key->stencil[0].enabled && (key->stencil[0].writemask || (key->stencil[1].enabled && - key->stencil[1].writemask))))) + key->stencil[1].writemask)))) depth_mode &= ~(LATE_DEPTH_WRITE | EARLY_DEPTH_WRITE); } else { -- 2.30.2