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