[Mesa-dev] [PATCH] i965/clear: Quantize the depth clear value based on the format
Jason Ekstrand
jason at jlekstrand.net
Sun Aug 20 03:45:13 UTC 2017
In f9fd976e8adba733b08d we changed the clear value to be stored as an
isl_color_value. This had the side-effect same clear value check is now
happening directly between the f32[0] field of the isl_color_value and
ctx->Depth.Clear. This isn't what we want for two reasons. One is that
the comparison happens in floating point even for Z16 and Z24 formats.
Worse than that, ctx->Depth.Clear is a double so, even for 32-bit float
formats, we were comparing as doubles and not floats. This means that
the test basically always fails for anything other than 0.0f and 1.0f.
This caused a slight performance regression in Lightsmark 2008 because
it was using a depth clear value of 0.999 which can't be stored in a
32-bit float so we were doing unneeded resolves.
Cc: Kenneth Graunke <kenneth at whitecape.org>
Bugzilla: https://bugs.freedesktop.org/101678
---
src/mesa/drivers/dri/i965/brw_clear.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_clear.c b/src/mesa/drivers/dri/i965/brw_clear.c
index adaf250..650bfee 100644
--- a/src/mesa/drivers/dri/i965/brw_clear.c
+++ b/src/mesa/drivers/dri/i965/brw_clear.c
@@ -158,12 +158,22 @@ brw_fast_clear_depth(struct gl_context *ctx)
break;
}
+ /* Quantize the clear value to what can be stored in the actual depth
+ * buffer. This makes the following check more accurate because it now
+ * checks if the actual depth bits will match. It also prevents us from
+ * getting a too-accurate depth value during depth testing or when sampling
+ * with HiZ enabled.
+ */
+ float clear_value = mt->format == MESA_FORMAT_Z_FLOAT32 ?
+ round(ctx->Depth.Clear * fb->_DepthMax) / fb->_DepthMax :
+ ctx->Depth.Clear;
+
/* If we're clearing to a new clear value, then we need to resolve any clear
* flags out of the HiZ buffer into the real depth buffer.
*/
- if (mt->fast_clear_color.f32[0] != ctx->Depth.Clear) {
+ if (mt->fast_clear_color.f32[0] != clear_value) {
intel_miptree_all_slices_resolve_depth(brw, mt);
- mt->fast_clear_color.f32[0] = ctx->Depth.Clear;
+ mt->fast_clear_color.f32[0] = clear_value;
}
if (brw->gen == 6) {
--
2.5.0.400.gff86faf
More information about the mesa-dev
mailing list