From 0fd3754c26439f8ef081563ed87b1a5dd7faa13f Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 17 Jun 2022 16:28:31 +0200 Subject: [PATCH] radv: add a function that declares PS epilog shader arguments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PS epilog would be a "normal" compiled shader using RA, etc. It will declare up to 8x4 VGPRs for all color exports. Signed-off-by: Samuel Pitoiset Reviewed-by: Timur Kristóf Part-of: --- src/amd/vulkan/radv_shader_args.c | 22 ++++++++++++++++++++++ src/amd/vulkan/radv_shader_args.h | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/src/amd/vulkan/radv_shader_args.c b/src/amd/vulkan/radv_shader_args.c index 05765531584..40ac439672b 100644 --- a/src/amd/vulkan/radv_shader_args.c +++ b/src/amd/vulkan/radv_shader_args.c @@ -892,3 +892,25 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin args->num_user_sgprs = user_sgpr_idx; } + +void +radv_declare_ps_epilog_args(enum amd_gfx_level gfx_level, const struct radv_ps_epilog_key *key, + struct radv_shader_args *args) +{ + unsigned num_inputs = 0; + + ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ring_offsets); + if (gfx_level < GFX11) + ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset); + + /* Declare VGPR arguments for color exports. */ + for (unsigned i = 0; i < MAX_RTS; i++) { + unsigned col_format = (key->spi_shader_col_format >> (i * 4)) & 0xf; + + if (col_format == V_028714_SPI_SHADER_ZERO) + continue; + + ac_add_arg(&args->ac, AC_ARG_VGPR, 4, AC_ARG_FLOAT, &args->ps_epilog_inputs[num_inputs]); + num_inputs++; + } +} diff --git a/src/amd/vulkan/radv_shader_args.h b/src/amd/vulkan/radv_shader_args.h index ee6540ed3de..7d20a64d179 100644 --- a/src/amd/vulkan/radv_shader_args.h +++ b/src/amd/vulkan/radv_shader_args.h @@ -62,6 +62,9 @@ struct radv_shader_args { struct ac_arg prolog_inputs; struct ac_arg vs_inputs[MAX_VERTEX_ATTRIBS]; + /* PS epilogs */ + struct ac_arg ps_epilog_inputs[MAX_RTS]; + struct radv_userdata_locations user_sgprs_locs; unsigned num_user_sgprs; @@ -86,4 +89,7 @@ void radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pi bool has_previous_stage, gl_shader_stage previous_stage, struct radv_shader_args *args); +void radv_declare_ps_epilog_args(enum amd_gfx_level gfx_level, const struct radv_ps_epilog_key *key, + struct radv_shader_args *args); + #endif