Mesa (main): radv: only re-emit the per-vertex VRS rates if necessary

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Feb 16 08:49:13 UTC 2022


Module: Mesa
Branch: main
Commit: b4f526cc1915dbbaf134aadb04599d0685d53a35
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b4f526cc1915dbbaf134aadb04599d0685d53a35

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Tue Jan 25 12:04:59 2022 +0100

radv: only re-emit the per-vertex VRS rates if necessary

This reduces the overhead slightly when the VRS rates don't change.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14713>

---

 src/amd/vulkan/radv_cmd_buffer.c | 18 ++++++++++++++++--
 src/amd/vulkan/radv_private.h    |  4 ++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 0f84067dfe9..ecdf99a6acd 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -3637,8 +3637,11 @@ radv_flush_force_vrs_state(struct radv_cmd_buffer *cmd_buffer)
    uint32_t vrs_rates = 0;
    uint32_t base_reg;
 
-   if (!pipeline->graphics.force_vrs_per_vertex)
+   if (!pipeline->graphics.force_vrs_per_vertex) {
+      /* Un-set the SGPR index so we know to re-emit it later. */
+      cmd_buffer->state.last_vrs_rates_sgpr_idx = -1;
       return;
+   }
 
    loc = radv_lookup_user_sgpr(pipeline, stage, AC_UD_FORCE_VRS_RATES);
    assert(loc->sgpr_idx != -1);
@@ -3659,7 +3662,13 @@ radv_flush_force_vrs_state(struct radv_cmd_buffer *cmd_buffer)
       break;
    }
 
-   radeon_set_sh_reg(cmd_buffer->cs, base_reg + loc->sgpr_idx * 4, vrs_rates);
+   if (cmd_buffer->state.last_vrs_rates != vrs_rates ||
+       cmd_buffer->state.last_vrs_rates_sgpr_idx != loc->sgpr_idx) {
+      radeon_set_sh_reg(cmd_buffer->cs, base_reg + loc->sgpr_idx * 4, vrs_rates);
+   }
+
+   cmd_buffer->state.last_vrs_rates = vrs_rates;
+   cmd_buffer->state.last_vrs_rates_sgpr_idx = loc->sgpr_idx;
 }
 
 static void
@@ -4571,6 +4580,8 @@ radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBegi
    cmd_buffer->state.last_nggc_settings = -1;
    cmd_buffer->state.last_nggc_settings_sgpr_idx = -1;
    cmd_buffer->state.mesh_shading = false;
+   cmd_buffer->state.last_vrs_rates = -1;
+   cmd_buffer->state.last_vrs_rates_sgpr_idx = -1;
    cmd_buffer->usage_flags = pBeginInfo->flags;
 
    if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY &&
@@ -5707,6 +5718,9 @@ radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCou
       primary->state.last_nggc_settings = secondary->state.last_nggc_settings;
       primary->state.last_nggc_settings_sgpr_idx = secondary->state.last_nggc_settings_sgpr_idx;
       primary->state.last_nggc_skip = secondary->state.last_nggc_skip;
+
+      primary->state.last_vrs_rates = secondary->state.last_vrs_rates;
+      primary->state.last_vrs_rates_sgpr_idx = secondary->state.last_vrs_rates_sgpr_idx;
    }
 
    /* After executing commands from secondary buffers we have to dirty
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 2d40c48e3d9..c1fe1ee8bab 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1469,6 +1469,10 @@ struct radv_cmd_state {
 
    /* Whether the cmdbuffer owns the current render pass rather than the app. */
    bool own_render_pass;
+
+   /* Per-vertex VRS state. */
+   uint32_t last_vrs_rates;
+   int8_t last_vrs_rates_sgpr_idx;
 };
 
 struct radv_cmd_pool {



More information about the mesa-commit mailing list