radv: declare shader arguments/locations for provoking vertex

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19168>
This commit is contained in:
Samuel Pitoiset 2022-10-19 15:44:54 +02:00 committed by Marge Bot
parent 8bb572b7f8
commit 8d8aa05fd2
3 changed files with 24 additions and 11 deletions

View file

@ -142,11 +142,12 @@ enum radv_ud_index {
AC_UD_VIEW_INDEX = 4,
AC_UD_STREAMOUT_BUFFERS = 5,
AC_UD_NGG_QUERY_STATE = 6,
AC_UD_NGG_CULLING_SETTINGS = 7,
AC_UD_NGG_VIEWPORT = 8,
AC_UD_FORCE_VRS_RATES = 9,
AC_UD_TASK_RING_ENTRY = 10,
AC_UD_SHADER_START = 11,
AC_UD_NGG_PROVOKING_VTX = 7,
AC_UD_NGG_CULLING_SETTINGS = 8,
AC_UD_NGG_VIEWPORT = 9,
AC_UD_FORCE_VRS_RATES = 10,
AC_UD_TASK_RING_ENTRY = 11,
AC_UD_SHADER_START = 12,
AC_UD_VS_VERTEX_BUFFERS = AC_UD_SHADER_START,
AC_UD_VS_BASE_VERTEX_START_INSTANCE,
AC_UD_VS_PROLOG_INPUTS,

View file

@ -116,12 +116,14 @@ count_ms_user_sgprs(const struct radv_shader_info *info)
}
static unsigned
count_ngg_sgprs(const struct radv_shader_info *info, bool has_ngg_query)
count_ngg_sgprs(const struct radv_shader_info *info, bool has_ngg_query, bool has_ngg_provoking_vtx)
{
unsigned count = 0;
if (has_ngg_query)
count += 1; /* ngg_query_state */
if (has_ngg_provoking_vtx)
count += 1; /* ngg_provoking_vtx */
if (info->has_ngg_culling)
count += 5; /* ngg_culling_settings + 4x ngg_viewport_* */
@ -163,7 +165,7 @@ static void
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,
gl_shader_stage previous_stage, bool needs_view_index, bool has_ngg_query,
const struct radv_pipeline_key *key,
bool has_ngg_provoking_vtx, const struct radv_pipeline_key *key,
struct user_sgpr_info *user_sgpr_info)
{
uint8_t user_sgpr_count = 0;
@ -221,7 +223,7 @@ allocate_user_sgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info
case MESA_SHADER_GEOMETRY:
if (has_previous_stage) {
if (info->is_ngg)
user_sgpr_count += count_ngg_sgprs(info, has_ngg_query);
user_sgpr_count += count_ngg_sgprs(info, has_ngg_query, has_ngg_provoking_vtx);
if (previous_stage == MESA_SHADER_VERTEX) {
user_sgpr_count += count_vs_user_sgprs(info);
@ -481,11 +483,14 @@ declare_ps_input_vgprs(const struct radv_shader_info *info, struct radv_shader_a
static void
declare_ngg_sgprs(const struct radv_shader_info *info, struct radv_shader_args *args,
bool has_ngg_query)
bool has_ngg_query, bool has_ngg_provoking_vtx)
{
if (has_ngg_query)
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_query_state);
if (has_ngg_provoking_vtx)
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_provoking_vtx);
if (info->has_ngg_culling) {
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_culling_settings);
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_viewport_scale[0]);
@ -563,6 +568,8 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
bool needs_view_index = info->uses_view_index;
bool has_ngg_query = info->has_ngg_prim_query || info->has_ngg_xfb_query ||
(stage == MESA_SHADER_GEOMETRY && info->gs.has_ngg_pipeline_stat_query);
bool has_ngg_provoking_vtx = (stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_GEOMETRY) &&
key->dynamic_provoking_vtx_mode;
if (gfx_level >= GFX10 && info->is_ngg && stage != MESA_SHADER_GEOMETRY) {
/* Handle all NGG shaders as GS to simplify the code here. */
@ -577,7 +584,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;
allocate_user_sgprs(gfx_level, info, args, stage, has_previous_stage, previous_stage,
needs_view_index, has_ngg_query, key, &user_sgpr_info);
needs_view_index, has_ngg_query, has_ngg_provoking_vtx, key, &user_sgpr_info);
if (args->explicit_scratch_args) {
ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ring_offsets);
@ -792,7 +799,7 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
}
if (info->is_ngg) {
declare_ngg_sgprs(info, args, has_ngg_query);
declare_ngg_sgprs(info, args, has_ngg_query, has_ngg_provoking_vtx);
}
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[0]);
@ -936,6 +943,10 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
set_loc_shader(args, AC_UD_NGG_QUERY_STATE, &user_sgpr_idx, 1);
}
if (args->ngg_provoking_vtx.used) {
set_loc_shader(args, AC_UD_NGG_PROVOKING_VTX, &user_sgpr_idx, 1);
}
if (args->ngg_culling_settings.used) {
set_loc_shader(args, AC_UD_NGG_CULLING_SETTINGS, &user_sgpr_idx, 1);
}

View file

@ -46,6 +46,7 @@ struct radv_shader_args {
/* NGG */
struct ac_arg ngg_query_state;
struct ac_arg ngg_provoking_vtx;
/* NGG GS */
struct ac_arg ngg_culling_settings;