Module: Mesa Branch: main Commit: 5c362cde33b9f3e76bb032112a91fcb761df490c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5c362cde33b9f3e76bb032112a91fcb761df490c
Author: Daniel Schürmann <[email protected]> Date: Mon Apr 3 12:15:36 2023 +0200 radv: update PS num_vgprs in case of epilogs rather than overallocating VGPRs Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22267> --- src/amd/vulkan/radv_cmd_buffer.c | 10 ++++++---- src/amd/vulkan/radv_shader_args.c | 6 ------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 1ea8e4800a8..b34eae871ab 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1846,10 +1846,12 @@ radv_emit_ps_epilog_state(struct radv_cmd_buffer *cmd_buffer, struct radv_shader radeon_set_context_reg(cmd_buffer->cs, R_02823C_CB_SHADER_MASK, ac_get_cb_shader_mask(ps_epilog->spi_shader_col_format)); - /* The main shader must not use less VGPRs than the epilog, otherwise shared vgprs might not - * work. - */ - assert(G_00B848_VGPRS(ps_shader->config.rsrc1) >= G_00B848_VGPRS(ps_epilog->rsrc1)); + assert(ps_shader->config.num_shared_vgprs == 0); + if (G_00B848_VGPRS(ps_epilog->rsrc1) > G_00B848_VGPRS(ps_shader->config.rsrc1)) { + uint32_t rsrc1 = ps_shader->config.rsrc1; + rsrc1 = (rsrc1 & C_00B848_VGPRS) | (ps_epilog->rsrc1 & ~C_00B848_VGPRS); + radeon_set_sh_reg(cmd_buffer->cs, R_00B028_SPI_SHADER_PGM_RSRC1_PS, rsrc1); + } radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, ps_epilog->bo); diff --git a/src/amd/vulkan/radv_shader_args.c b/src/amd/vulkan/radv_shader_args.c index a3761322589..334d6223890 100644 --- a/src/amd/vulkan/radv_shader_args.c +++ b/src/amd/vulkan/radv_shader_args.c @@ -311,12 +311,6 @@ declare_ps_input_vgprs(const struct radv_shader_info *info, struct radv_shader_a vgpr_arg++; } } - - if (info->ps.has_epilog) { - /* FIXME: Ensure the main shader doesn't have less VGPRs than the epilog */ - for (unsigned i = 0; i < MAX_RTS; i++) - ac_add_arg(&args->ac, AC_ARG_VGPR, 4, AC_ARG_INT, NULL); - } } static void
