radv: declare the shader user locs from the shader arguments

Seems more robust. Basically, the idea is to declare shader arguments
from the shader info, and then the user locs from the arguments.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13149>
This commit is contained in:
Samuel Pitoiset
2021-10-01 14:24:14 +02:00
committed by Marge Bot
parent 37a81b4298
commit 2d4fc61bff

View File

@@ -384,13 +384,12 @@ static void
set_global_input_locs(struct radv_shader_args *args, const struct user_sgpr_info *user_sgpr_info, set_global_input_locs(struct radv_shader_args *args, const struct user_sgpr_info *user_sgpr_info,
uint8_t *user_sgpr_idx) uint8_t *user_sgpr_idx)
{ {
uint32_t mask = args->shader_info->desc_set_used_mask; unsigned num_inline_push_consts = 0;
if (!user_sgpr_info->indirect_all_descriptor_sets) { if (!user_sgpr_info->indirect_all_descriptor_sets) {
while (mask) { for (unsigned i = 0; i < ARRAY_SIZE(args->descriptor_sets); i++) {
int i = u_bit_scan(&mask); if (args->descriptor_sets[i].used)
set_loc_desc(args, i, user_sgpr_idx);
set_loc_desc(args, i, user_sgpr_idx);
} }
} else { } else {
set_loc_shader_ptr(args, AC_UD_INDIRECT_DESCRIPTOR_SETS, user_sgpr_idx); set_loc_shader_ptr(args, AC_UD_INDIRECT_DESCRIPTOR_SETS, user_sgpr_idx);
@@ -398,13 +397,17 @@ set_global_input_locs(struct radv_shader_args *args, const struct user_sgpr_info
args->shader_info->need_indirect_descriptor_sets = true; args->shader_info->need_indirect_descriptor_sets = true;
} }
if (args->shader_info->loads_push_constants) { if (args->ac.push_constants.used) {
set_loc_shader_ptr(args, AC_UD_PUSH_CONSTANTS, user_sgpr_idx); set_loc_shader_ptr(args, AC_UD_PUSH_CONSTANTS, user_sgpr_idx);
} }
if (args->shader_info->num_inline_push_consts) { for (unsigned i = 0; i < ARRAY_SIZE(args->ac.inline_push_consts); i++) {
set_loc_shader(args, AC_UD_INLINE_PUSH_CONSTANTS, user_sgpr_idx, if (args->ac.inline_push_consts[i].used)
args->shader_info->num_inline_push_consts); num_inline_push_consts++;
}
if (num_inline_push_consts) {
set_loc_shader(args, AC_UD_INLINE_PUSH_CONSTANTS, user_sgpr_idx, num_inline_push_consts);
} }
if (args->streamout_buffers.used) { if (args->streamout_buffers.used) {
@@ -419,33 +422,16 @@ set_vs_specific_input_locs(struct radv_shader_args *args, gl_shader_stage stage,
{ {
if (!args->is_gs_copy_shader && (stage == MESA_SHADER_VERTEX || if (!args->is_gs_copy_shader && (stage == MESA_SHADER_VERTEX ||
(has_previous_stage && previous_stage == MESA_SHADER_VERTEX))) { (has_previous_stage && previous_stage == MESA_SHADER_VERTEX))) {
if (args->shader_info->vs.vb_desc_usage_mask) { if (args->ac.vertex_buffers.used) {
set_loc_shader_ptr(args, AC_UD_VS_VERTEX_BUFFERS, user_sgpr_idx); set_loc_shader_ptr(args, AC_UD_VS_VERTEX_BUFFERS, user_sgpr_idx);
} }
unsigned vs_num = unsigned vs_num = args->ac.base_vertex.used + args->ac.draw_id.used +
count_vs_user_sgprs(args) - (args->shader_info->vs.vb_desc_usage_mask ? 1 : 0); args->ac.start_instance.used;
set_loc_shader(args, AC_UD_VS_BASE_VERTEX_START_INSTANCE, user_sgpr_idx, vs_num); set_loc_shader(args, AC_UD_VS_BASE_VERTEX_START_INSTANCE, user_sgpr_idx, vs_num);
} }
} }
static void
set_ngg_sgprs_locs(struct radv_shader_args *args, uint8_t *user_sgpr_idx)
{
if (args->ngg_gs_state.used) {
set_loc_shader(args, AC_UD_NGG_GS_STATE, user_sgpr_idx, 1);
}
if (args->shader_info->has_ngg_culling) {
assert(args->ngg_culling_settings.used &&
args->ngg_viewport_scale[0].used && args->ngg_viewport_scale[1].used &&
args->ngg_viewport_translate[0].used && args->ngg_viewport_translate[1].used);
set_loc_shader(args, AC_UD_NGG_CULLING_SETTINGS, user_sgpr_idx, 1);
set_loc_shader(args, AC_UD_NGG_VIEWPORT, user_sgpr_idx, 4);
}
}
/* Returns whether the stage is a stage that can be directly before the GS */ /* Returns whether the stage is a stage that can be directly before the GS */
static bool static bool
is_pre_gs_stage(gl_shader_stage stage) is_pre_gs_stage(gl_shader_stage stage)
@@ -710,13 +696,13 @@ radv_declare_shader_args(struct radv_shader_args *args, gl_shader_stage stage,
switch (stage) { switch (stage) {
case MESA_SHADER_COMPUTE: case MESA_SHADER_COMPUTE:
if (args->shader_info->cs.uses_sbt) { if (args->ac.sbt_descriptors.used) {
set_loc_shader_ptr(args, AC_UD_CS_SBT_DESCRIPTORS, &user_sgpr_idx); set_loc_shader_ptr(args, AC_UD_CS_SBT_DESCRIPTORS, &user_sgpr_idx);
} }
if (args->shader_info->cs.uses_grid_size) { if (args->ac.num_work_groups.used) {
set_loc_shader(args, AC_UD_CS_GRID_SIZE, &user_sgpr_idx, 3); set_loc_shader(args, AC_UD_CS_GRID_SIZE, &user_sgpr_idx, 3);
} }
if (args->shader_info->cs.uses_ray_launch_size) { if (args->ac.ray_launch_size.used) {
set_loc_shader(args, AC_UD_CS_RAY_LAUNCH_SIZE, &user_sgpr_idx, 3); set_loc_shader(args, AC_UD_CS_RAY_LAUNCH_SIZE, &user_sgpr_idx, 3);
} }
break; break;
@@ -743,8 +729,20 @@ radv_declare_shader_args(struct radv_shader_args *args, gl_shader_stage stage,
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->shader_info->is_ngg) if (args->ngg_gs_state.used) {
set_ngg_sgprs_locs(args, &user_sgpr_idx); set_loc_shader(args, AC_UD_NGG_GS_STATE, &user_sgpr_idx, 1);
}
if (args->ngg_culling_settings.used) {
set_loc_shader(args, AC_UD_NGG_CULLING_SETTINGS, &user_sgpr_idx, 1);
}
if (args->ngg_viewport_scale[0].used) {
assert(args->ngg_viewport_scale[1].used &&
args->ngg_viewport_translate[0].used &&
args->ngg_viewport_translate[1].used);
set_loc_shader(args, AC_UD_NGG_VIEWPORT, &user_sgpr_idx, 4);
}
break; break;
case MESA_SHADER_FRAGMENT: case MESA_SHADER_FRAGMENT:
break; break;