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 <jfonseca@vmware.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user