mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 22:58:31 +02:00
freedreno/regs: A6XX_EARLY_LRZ_LATE_Z is really A6XX_EARLY_Z_LATE_Z
By observing prop driver and doing some tests this mode is about both early_z and early lrz. Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34973>
This commit is contained in:
parent
cd4c0bc58e
commit
de6d111d73
4 changed files with 25 additions and 41 deletions
|
|
@ -1166,36 +1166,20 @@ to upconvert to 32b float internally?
|
|||
<doc>Disable early z-test and early-lrz test (if applicable)</doc>
|
||||
<value value="0x1" name="A6XX_LATE_Z"/>
|
||||
<doc>
|
||||
A special mode that allows early-lrz test but disables
|
||||
early-z test. Which might sound a bit funny, since
|
||||
lrz-test happens before z-test. But as long as a couple
|
||||
conditions are maintained this allows using lrz-test in
|
||||
cases where fragment shader has kill/discard:
|
||||
A special mode that allows early-lrz (if applicable) or early-z
|
||||
tests, but also does late-z tests at which point it writes depth.
|
||||
|
||||
1) Disable lrz-write in cases where it is uncertain during
|
||||
binning pass that a fragment will pass. Ie. if frag
|
||||
shader has-kill, writes-z, or alpha/stencil test is
|
||||
enabled. (For correctness, lrz-write must be disabled
|
||||
when blend is enabled.) This is analogous to how a
|
||||
z-prepass works.
|
||||
This mode is used when fragment can be killed (via discard or
|
||||
sample mask) after early-z tests and it writes depth. In such case
|
||||
depth can be written only at late-z stage, but it's ok to use
|
||||
early-z to discard fragments.
|
||||
|
||||
2) Disable lrz-write and test if a depth-test direction
|
||||
reversal is detected. Due to condition (1), the contents
|
||||
of the lrz buffer are a conservative estimation of the
|
||||
depth buffer during the draw pass. Meaning that geometry
|
||||
that we know for certain will not be visible will not pass
|
||||
lrz-test. But geometry which may be (or contributes to
|
||||
blend) will pass the lrz-test.
|
||||
|
||||
This allows us to keep early-lrz-test in cases where the frag
|
||||
shader does not write-z (ie. we know the z-value before FS)
|
||||
and does not have side-effects (image/ssbo writes, etc), but
|
||||
does have kill/discard. Which turns out to be a common
|
||||
enough case that it is useful to keep early-lrz test against
|
||||
the conservative lrz buffer to discard fragments that we
|
||||
know will definitely not be visible.
|
||||
However this mode is not compatible with:
|
||||
- Lack of D/S attachment
|
||||
- Stencil writes on stencil or depth test failures
|
||||
- Per-sample shading
|
||||
</doc>
|
||||
<value value="0x2" name="A6XX_EARLY_LRZ_LATE_Z"/>
|
||||
<value value="0x2" name="A6XX_EARLY_Z_LATE_Z"/>
|
||||
<doc>Not a real hw value, used internally by mesa</doc>
|
||||
<value value="0x3" name="A6XX_INVALID_ZTEST"/>
|
||||
</enum>
|
||||
|
|
@ -3233,9 +3217,9 @@ to upconvert to 32b float internally?
|
|||
<enum name="a6xx_lrz_feedback_mask">
|
||||
<value value="0x0" name="LRZ_FEEDBACK_NONE"/>
|
||||
<value value="0x1" name="LRZ_FEEDBACK_EARLY_Z"/>
|
||||
<value value="0x2" name="LRZ_FEEDBACK_EARLY_LRZ_LATE_Z"/>
|
||||
<value value="0x2" name="LRZ_FEEDBACK_EARLY_Z_LATE_Z"/>
|
||||
<!-- We don't have a flag type and this flags combination is often used -->
|
||||
<value value="0x3" name="LRZ_FEEDBACK_EARLY_Z_OR_EARLY_LRZ_LATE_Z"/>
|
||||
<value value="0x3" name="LRZ_FEEDBACK_EARLY_Z_OR_EARLY_Z_LATE_Z"/>
|
||||
<value value="0x4" name="LRZ_FEEDBACK_LATE_Z"/>
|
||||
</enum>
|
||||
|
||||
|
|
|
|||
|
|
@ -1251,8 +1251,8 @@ tu6_emit_tile_select(struct tu_cmd_buffer *cmd,
|
|||
.buffers_location = BUFFERS_IN_GMEM,
|
||||
.lrz_feedback_zmode_mask =
|
||||
phys_dev->info->a6xx.has_lrz_feedback
|
||||
? (hw_binning ? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_LRZ_LATE_Z :
|
||||
LRZ_FEEDBACK_EARLY_LRZ_LATE_Z)
|
||||
? (hw_binning ? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_Z_LATE_Z :
|
||||
LRZ_FEEDBACK_EARLY_Z_LATE_Z)
|
||||
: LRZ_FEEDBACK_NONE,
|
||||
});
|
||||
|
||||
|
|
@ -2346,7 +2346,7 @@ tu6_sysmem_render_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
|
|||
.buffers_location = BUFFERS_IN_SYSMEM,
|
||||
.lrz_feedback_zmode_mask =
|
||||
cmd->device->physical_device->info->a6xx.has_lrz_feedback
|
||||
? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_LRZ_LATE_Z
|
||||
? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_Z_LATE_Z
|
||||
: LRZ_FEEDBACK_NONE,
|
||||
});
|
||||
|
||||
|
|
@ -2452,7 +2452,7 @@ tu6_tile_render_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
|
|||
.buffers_location = BUFFERS_IN_GMEM,
|
||||
.lrz_feedback_zmode_mask =
|
||||
phys_dev->info->a6xx.has_lrz_feedback
|
||||
? LRZ_FEEDBACK_EARLY_LRZ_LATE_Z
|
||||
? LRZ_FEEDBACK_EARLY_Z_LATE_Z
|
||||
: LRZ_FEEDBACK_NONE
|
||||
});
|
||||
|
||||
|
|
@ -6215,7 +6215,7 @@ tu6_build_depth_plane_z_mode(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
|
|||
tu_fs_reads_dynamic_ds_input_attachment(cmd, fs)) &&
|
||||
(depth_write || stencil_write)) {
|
||||
zmode = (cmd->state.lrz.valid && cmd->state.lrz.enabled)
|
||||
? A6XX_EARLY_LRZ_LATE_Z
|
||||
? A6XX_EARLY_Z_LATE_Z
|
||||
: A6XX_LATE_Z;
|
||||
}
|
||||
|
||||
|
|
@ -6234,7 +6234,7 @@ tu6_build_depth_plane_z_mode(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
|
|||
*/
|
||||
if (!force_late_z && cmd->state.lrz.enabled && fs->variant->writes_pos &&
|
||||
zmode != A6XX_LATE_Z) {
|
||||
zmode = A6XX_EARLY_LRZ_LATE_Z;
|
||||
zmode = A6XX_EARLY_Z_LATE_Z;
|
||||
}
|
||||
|
||||
if ((force_late_z && !fs->variant->fs.early_fragment_tests) ||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ compute_ztest_mode(struct fd6_emit *emit, bool lrz_valid) assert_dt
|
|||
* that could discard samples that would otherwise only be
|
||||
* hidden by a later draw.
|
||||
*/
|
||||
return lrz_valid ? A6XX_EARLY_LRZ_LATE_Z : A6XX_LATE_Z;
|
||||
return lrz_valid ? A6XX_EARLY_Z_LATE_Z : A6XX_LATE_Z;
|
||||
} else {
|
||||
return A6XX_EARLY_Z;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1177,7 +1177,7 @@ fd6_emit_tile_init(struct fd_batch *batch) assert_dt
|
|||
.force_lrz_write_dis = !screen->info->a6xx.has_lrz_feedback,
|
||||
.buffers_location = BUFFERS_IN_GMEM,
|
||||
.lrz_feedback_zmode_mask = screen->info->a6xx.has_lrz_feedback
|
||||
? LRZ_FEEDBACK_EARLY_LRZ_LATE_Z
|
||||
? LRZ_FEEDBACK_EARLY_Z_LATE_Z
|
||||
: LRZ_FEEDBACK_NONE,
|
||||
});
|
||||
|
||||
|
|
@ -1208,7 +1208,7 @@ fd6_emit_tile_init(struct fd_batch *batch) assert_dt
|
|||
.buffers_location = BUFFERS_IN_GMEM,
|
||||
.lrz_feedback_zmode_mask =
|
||||
screen->info->a6xx.has_lrz_feedback
|
||||
? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_LRZ_LATE_Z
|
||||
? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_Z_LATE_Z
|
||||
: LRZ_FEEDBACK_NONE,
|
||||
});
|
||||
}
|
||||
|
|
@ -1305,7 +1305,7 @@ fd6_emit_tile_prep(struct fd_batch *batch, const struct fd_tile *tile)
|
|||
.force_lrz_write_dis = !screen->info->a6xx.has_lrz_feedback,
|
||||
.buffers_location = BUFFERS_IN_GMEM,
|
||||
.lrz_feedback_zmode_mask = screen->info->a6xx.has_lrz_feedback
|
||||
? LRZ_FEEDBACK_EARLY_LRZ_LATE_Z
|
||||
? LRZ_FEEDBACK_EARLY_Z_LATE_Z
|
||||
: LRZ_FEEDBACK_NONE,
|
||||
});
|
||||
|
||||
|
|
@ -1332,7 +1332,7 @@ fd6_emit_tile_prep(struct fd_batch *batch, const struct fd_tile *tile)
|
|||
.buffers_location = BUFFERS_IN_GMEM,
|
||||
.lrz_feedback_zmode_mask =
|
||||
screen->info->a6xx.has_lrz_feedback
|
||||
? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_LRZ_LATE_Z
|
||||
? LRZ_FEEDBACK_EARLY_Z_OR_EARLY_Z_LATE_Z
|
||||
: LRZ_FEEDBACK_NONE,
|
||||
});
|
||||
}
|
||||
|
|
@ -1344,7 +1344,7 @@ fd6_emit_tile_prep(struct fd_batch *batch, const struct fd_tile *tile)
|
|||
.force_lrz_write_dis = !ctx->screen->info->a6xx.has_lrz_feedback,
|
||||
.buffers_location = BUFFERS_IN_GMEM,
|
||||
.lrz_feedback_zmode_mask = ctx->screen->info->a6xx.has_lrz_feedback
|
||||
? LRZ_FEEDBACK_EARLY_LRZ_LATE_Z
|
||||
? LRZ_FEEDBACK_EARLY_Z_LATE_Z
|
||||
: LRZ_FEEDBACK_NONE,
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue