Mesa (main): turnip: Use fb->binning_possible to decide on conditional tile load/stores.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jun 7 00:23:17 UTC 2022
Module: Mesa
Branch: main
Commit: 046438b7a4918268c174efef5f0de1d4210e2301
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=046438b7a4918268c174efef5f0de1d4210e2301
Author: Emma Anholt <emma at anholt.net>
Date: Mon May 16 13:39:04 2022 -0700
turnip: Use fb->binning_possible to decide on conditional tile load/stores.
When !fb->binning but fb->binning_possible, we can just set the VSC
per-tile visibility reg to all visible in the "whoops, we'd rather not bin
but we had to anyway for XFB" case. This gets that EndRenderPass state out
of tile_load_cs/store_cs.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16826>
---
src/freedreno/vulkan/tu_cmd_buffer.c | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c
index 17ae859f621..5282074f194 100644
--- a/src/freedreno/vulkan/tu_cmd_buffer.c
+++ b/src/freedreno/vulkan/tu_cmd_buffer.c
@@ -625,7 +625,7 @@ static void
tu6_emit_cond_for_load_stores(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
uint32_t pipe, uint32_t slot, bool wfm)
{
- if (use_hw_binning(cmd)) {
+ if (cmd->state.framebuffer->binning_possible) {
tu_cs_emit_pkt7(cs, CP_REG_TEST, 1);
tu_cs_emit(cs, A6XX_CP_REG_TEST_0_REG(REG_A6XX_VSC_STATE_REG(pipe)) |
A6XX_CP_REG_TEST_0_BIT(slot) |
@@ -666,10 +666,10 @@ tu6_emit_tile_select(struct tu_cmd_buffer *cmd,
tu_cs_emit(cs, pipe * cmd->vsc_draw_strm_pitch);
tu_cs_emit(cs, pipe * 4);
tu_cs_emit(cs, pipe * cmd->vsc_prim_strm_pitch);
-
- tu6_emit_cond_for_load_stores(cmd, cs, pipe, slot, true);
}
+ tu6_emit_cond_for_load_stores(cmd, cs, pipe, slot, hw_binning);
+
tu_cs_emit_pkt7(cs, CP_SET_VISIBILITY_OVERRIDE, 1);
tu_cs_emit(cs, !hw_binning);
@@ -745,7 +745,7 @@ tu6_emit_tile_load(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
tu6_emit_blit_scissor(cmd, cs, true);
for (uint32_t i = 0; i < cmd->state.pass->attachment_count; ++i)
- tu_load_gmem_attachment(cmd, cs, i, use_hw_binning(cmd), false);
+ tu_load_gmem_attachment(cmd, cs, i, cmd->state.framebuffer->binning, false);
}
static void
@@ -764,7 +764,7 @@ tu6_emit_tile_store(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
for (uint32_t a = 0; a < pass->attachment_count; ++a) {
if (pass->attachments[a].gmem_offset >= 0)
- tu_store_gmem_attachment(cmd, cs, a, a, use_hw_binning(cmd));
+ tu_store_gmem_attachment(cmd, cs, a, a, cmd->state.framebuffer->binning_possible);
}
if (subpass->resolve_attachments) {
@@ -1339,6 +1339,16 @@ tu6_tile_render_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
} else {
tu6_emit_bin_size(cs, fb->tile0.width, fb->tile0.height,
A6XX_RB_BIN_CONTROL_LRZ_FEEDBACK_ZMODE_MASK(0x6));
+
+ if (fb->binning_possible) {
+ /* Mark all tiles as visible for tu6_emit_cond_for_load_stores(), since
+ * the actual binner didn't run.
+ */
+ int pipe_count = fb->pipe_count.width * fb->pipe_count.height;
+ tu_cs_emit_pkt4(cs, REG_A6XX_VSC_STATE_REG(0), pipe_count);
+ for (int i = 0; i < pipe_count; i++)
+ tu_cs_emit(cs, ~0);
+ }
}
tu_autotune_begin_renderpass(cmd, cs, autotune_result);
@@ -1400,9 +1410,9 @@ tu_cmd_render_tiles(struct tu_cmd_buffer *cmd,
{
const struct tu_framebuffer *fb = cmd->state.framebuffer;
- /* Create gmem load/stores now (at EndRenderPass time)) because they need to
- * know whether to allow their conditional execution, which is tied to a
- * state that is known only at the end of the renderpass. They will be
+ /* Create gmem load/stores now (at EndRenderPass time)) because they needed to
+ * know whether to allow their conditional execution, which was tied to a
+ * state that was known only at the end of the renderpass. They will be
* called from tu6_render_tile().
*/
tu_cs_begin(&cmd->tile_load_cs);
More information about the mesa-commit
mailing list