radv: add shader arguments for dynamic patch control points
This introduces two new user SGPRS: - tcs_offchip_layout: input patch size and number of patches in TCS - tes_num_patches: number of patches in TES 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/18344>
This commit is contained in:

committed by
Marge Bot

parent
9a6aa3e23a
commit
8253ec3855
@@ -158,9 +158,11 @@ enum radv_ud_index {
|
|||||||
AC_UD_CS_TASK_IB,
|
AC_UD_CS_TASK_IB,
|
||||||
AC_UD_CS_MAX_UD,
|
AC_UD_CS_MAX_UD,
|
||||||
AC_UD_GS_MAX_UD,
|
AC_UD_GS_MAX_UD,
|
||||||
|
AC_UD_TCS_OFFCHIP_LAYOUT = AC_UD_VS_MAX_UD,
|
||||||
AC_UD_TCS_MAX_UD,
|
AC_UD_TCS_MAX_UD,
|
||||||
|
AC_UD_TES_NUM_PATCHES = AC_UD_SHADER_START,
|
||||||
AC_UD_TES_MAX_UD,
|
AC_UD_TES_MAX_UD,
|
||||||
AC_UD_MAX_UD = AC_UD_TCS_MAX_UD,
|
AC_UD_MAX_UD = AC_UD_CS_MAX_UD,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct radv_stream_output {
|
struct radv_stream_output {
|
||||||
|
@@ -91,6 +91,17 @@ count_vs_user_sgprs(const struct radv_shader_info *info)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t
|
||||||
|
count_tes_user_sgprs(const struct radv_pipeline_key *key)
|
||||||
|
{
|
||||||
|
unsigned count = 0;
|
||||||
|
|
||||||
|
if (key->dynamic_patch_control_points)
|
||||||
|
count++; /* tes_num_patches */
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
static uint8_t
|
static uint8_t
|
||||||
count_ms_user_sgprs(const struct radv_shader_info *info)
|
count_ms_user_sgprs(const struct radv_shader_info *info)
|
||||||
{
|
{
|
||||||
@@ -152,6 +163,7 @@ static void
|
|||||||
allocate_user_sgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info *info,
|
allocate_user_sgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info *info,
|
||||||
struct radv_shader_args *args, gl_shader_stage stage, bool has_previous_stage,
|
struct radv_shader_args *args, gl_shader_stage stage, bool has_previous_stage,
|
||||||
gl_shader_stage previous_stage, bool needs_view_index, bool has_ngg_query,
|
gl_shader_stage previous_stage, bool needs_view_index, bool has_ngg_query,
|
||||||
|
const struct radv_pipeline_key *key,
|
||||||
struct user_sgpr_info *user_sgpr_info)
|
struct user_sgpr_info *user_sgpr_info)
|
||||||
{
|
{
|
||||||
uint8_t user_sgpr_count = 0;
|
uint8_t user_sgpr_count = 0;
|
||||||
@@ -196,8 +208,11 @@ allocate_user_sgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info
|
|||||||
if (previous_stage == MESA_SHADER_VERTEX)
|
if (previous_stage == MESA_SHADER_VERTEX)
|
||||||
user_sgpr_count += count_vs_user_sgprs(info);
|
user_sgpr_count += count_vs_user_sgprs(info);
|
||||||
}
|
}
|
||||||
|
if (key->dynamic_patch_control_points)
|
||||||
|
user_sgpr_count += 1; /* tcs_offchip_layout */
|
||||||
break;
|
break;
|
||||||
case MESA_SHADER_TESS_EVAL:
|
case MESA_SHADER_TESS_EVAL:
|
||||||
|
count_tes_user_sgprs(key);
|
||||||
break;
|
break;
|
||||||
case MESA_SHADER_GEOMETRY:
|
case MESA_SHADER_GEOMETRY:
|
||||||
if (has_previous_stage) {
|
if (has_previous_stage) {
|
||||||
@@ -206,6 +221,8 @@ allocate_user_sgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info
|
|||||||
|
|
||||||
if (previous_stage == MESA_SHADER_VERTEX) {
|
if (previous_stage == MESA_SHADER_VERTEX) {
|
||||||
user_sgpr_count += count_vs_user_sgprs(info);
|
user_sgpr_count += count_vs_user_sgprs(info);
|
||||||
|
} else if (previous_stage == MESA_SHADER_TESS_EVAL) {
|
||||||
|
user_sgpr_count += count_tes_user_sgprs(key);
|
||||||
} else if (previous_stage == MESA_SHADER_MESH) {
|
} else if (previous_stage == MESA_SHADER_MESH) {
|
||||||
user_sgpr_count += count_ms_user_sgprs(info);
|
user_sgpr_count += count_ms_user_sgprs(info);
|
||||||
}
|
}
|
||||||
@@ -555,7 +572,7 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
|
|||||||
args->user_sgprs_locs.shader_data[i].sgpr_idx = -1;
|
args->user_sgprs_locs.shader_data[i].sgpr_idx = -1;
|
||||||
|
|
||||||
allocate_user_sgprs(gfx_level, info, args, stage, has_previous_stage, previous_stage,
|
allocate_user_sgprs(gfx_level, info, args, stage, has_previous_stage, previous_stage,
|
||||||
needs_view_index, has_ngg_query, &user_sgpr_info);
|
needs_view_index, has_ngg_query, key, &user_sgpr_info);
|
||||||
|
|
||||||
if (args->explicit_scratch_args) {
|
if (args->explicit_scratch_args) {
|
||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ring_offsets);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ring_offsets);
|
||||||
@@ -671,6 +688,10 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
|
|||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (key->dynamic_patch_control_points) {
|
||||||
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->tcs_offchip_layout);
|
||||||
|
}
|
||||||
|
|
||||||
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_patch_id);
|
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_patch_id);
|
||||||
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_rel_ids);
|
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_rel_ids);
|
||||||
|
|
||||||
@@ -682,6 +703,10 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
|
|||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (key->dynamic_patch_control_points) {
|
||||||
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->tcs_offchip_layout);
|
||||||
|
}
|
||||||
|
|
||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);
|
||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tcs_factor_offset);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tcs_factor_offset);
|
||||||
if (args->explicit_scratch_args) {
|
if (args->explicit_scratch_args) {
|
||||||
@@ -700,6 +725,9 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
|
|||||||
if (needs_view_index)
|
if (needs_view_index)
|
||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
||||||
|
|
||||||
|
if (key->dynamic_patch_control_points)
|
||||||
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->tes_num_patches);
|
||||||
|
|
||||||
if (info->tes.as_es) {
|
if (info->tes.as_es) {
|
||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);
|
||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL);
|
||||||
@@ -744,6 +772,9 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
|
|||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (previous_stage == MESA_SHADER_TESS_EVAL && key->dynamic_patch_control_points)
|
||||||
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->tes_num_patches);
|
||||||
|
|
||||||
if (info->force_vrs_per_vertex) {
|
if (info->force_vrs_per_vertex) {
|
||||||
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.force_vrs_rates);
|
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.force_vrs_rates);
|
||||||
}
|
}
|
||||||
@@ -861,15 +892,24 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
|
|||||||
case MESA_SHADER_TESS_CTRL:
|
case MESA_SHADER_TESS_CTRL:
|
||||||
if (args->ac.view_index.used)
|
if (args->ac.view_index.used)
|
||||||
set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
|
set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
|
||||||
|
|
||||||
|
if (args->tcs_offchip_layout.used)
|
||||||
|
set_loc_shader(args, AC_UD_TCS_OFFCHIP_LAYOUT, &user_sgpr_idx, 1);
|
||||||
break;
|
break;
|
||||||
case MESA_SHADER_TESS_EVAL:
|
case MESA_SHADER_TESS_EVAL:
|
||||||
if (args->ac.view_index.used)
|
if (args->ac.view_index.used)
|
||||||
set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
|
set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
|
||||||
|
|
||||||
|
if (args->tes_num_patches.used)
|
||||||
|
set_loc_shader(args, AC_UD_TES_NUM_PATCHES, &user_sgpr_idx, 1);
|
||||||
break;
|
break;
|
||||||
case MESA_SHADER_GEOMETRY:
|
case MESA_SHADER_GEOMETRY:
|
||||||
if (args->ac.view_index.used)
|
if (args->ac.view_index.used)
|
||||||
set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
|
set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
|
||||||
|
|
||||||
|
if (args->tes_num_patches.used)
|
||||||
|
set_loc_shader(args, AC_UD_TES_NUM_PATCHES, &user_sgpr_idx, 1);
|
||||||
|
|
||||||
if (args->ac.force_vrs_rates.used)
|
if (args->ac.force_vrs_rates.used)
|
||||||
set_loc_shader(args, AC_UD_FORCE_VRS_RATES, &user_sgpr_idx, 1);
|
set_loc_shader(args, AC_UD_FORCE_VRS_RATES, &user_sgpr_idx, 1);
|
||||||
|
|
||||||
|
@@ -65,6 +65,15 @@ struct radv_shader_args {
|
|||||||
/* PS epilogs */
|
/* PS epilogs */
|
||||||
struct ac_arg ps_epilog_inputs[MAX_RTS];
|
struct ac_arg ps_epilog_inputs[MAX_RTS];
|
||||||
|
|
||||||
|
/* TCS */
|
||||||
|
/* # [0:5] = the number of patch control points
|
||||||
|
* # [6:13] = the number of tessellation patches
|
||||||
|
*/
|
||||||
|
struct ac_arg tcs_offchip_layout;
|
||||||
|
|
||||||
|
/* TES */
|
||||||
|
struct ac_arg tes_num_patches;
|
||||||
|
|
||||||
struct radv_userdata_locations user_sgprs_locs;
|
struct radv_userdata_locations user_sgprs_locs;
|
||||||
unsigned num_user_sgprs;
|
unsigned num_user_sgprs;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user