radv: declare a new user SGPR arg in FS for the epilog PC

The main FS would have to jump to the PC of the PS epilog. Given that
shaders are allocated in the 32-bit addr space, one user SGPR is fine.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17485>
This commit is contained in:
Samuel Pitoiset 2022-06-17 16:22:18 +02:00 committed by Marge Bot
parent 0db7a0b6e8
commit a38db1a94e
3 changed files with 13 additions and 0 deletions

View File

@ -156,6 +156,7 @@ enum radv_ud_index {
AC_UD_VS_BASE_VERTEX_START_INSTANCE,
AC_UD_VS_PROLOG_INPUTS,
AC_UD_VS_MAX_UD,
AC_UD_PS_EPILOG_PC,
AC_UD_PS_MAX_UD,
AC_UD_CS_GRID_SIZE = AC_UD_SHADER_START,
AC_UD_CS_SBT_DESCRIPTORS,

View File

@ -183,6 +183,9 @@ allocate_user_sgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info
user_sgpr_count += 4; /* ring_entry, 2x ib_addr, ib_stride */
break;
case MESA_SHADER_FRAGMENT:
/* epilog continue PC */
if (info->ps.has_epilog)
user_sgpr_count += 1;
break;
case MESA_SHADER_VERTEX:
if (!args->is_gs_copy_shader)
@ -785,6 +788,10 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
case MESA_SHADER_FRAGMENT:
declare_global_input_sgprs(info, &user_sgpr_info, args);
if (info->ps.has_epilog) {
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ps_epilog_pc);
}
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.prim_mask);
if (args->explicit_scratch_args && gfx_level < GFX11) {
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);
@ -876,6 +883,8 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
}
break;
case MESA_SHADER_FRAGMENT:
if (args->ps_epilog_pc.used)
set_loc_shader(args, AC_UD_PS_EPILOG_PC, &user_sgpr_idx, 1);
break;
default:
unreachable("Shader stage not implemented");

View File

@ -56,6 +56,9 @@ struct radv_shader_args {
struct ac_arg task_ib_addr;
struct ac_arg task_ib_stride;
/* Fragment shaders */
struct ac_arg ps_epilog_pc;
struct ac_arg prolog_inputs;
struct ac_arg vs_inputs[MAX_VERTEX_ATTRIBS];