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:

committed by
Marge Bot

parent
37a81b4298
commit
2d4fc61bff
@@ -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;
|
||||||
|
Reference in New Issue
Block a user