Path: blob/21.2-virgl/src/amd/vulkan/radv_shader_args.c
7233 views
/*1* Copyright © 2019 Valve Corporation.2* Copyright © 2016 Red Hat.3* Copyright © 2016 Bas Nieuwenhuizen4*5* based in part on anv driver which is:6* Copyright © 2015 Intel Corporation7*8* Permission is hereby granted, free of charge, to any person obtaining a9* copy of this software and associated documentation files (the "Software"),10* to deal in the Software without restriction, including without limitation11* the rights to use, copy, modify, merge, publish, distribute, sublicense,12* and/or sell copies of the Software, and to permit persons to whom the13* Software is furnished to do so, subject to the following conditions:14*15* The above copyright notice and this permission notice (including the next16* paragraph) shall be included in all copies or substantial portions of the17* Software.18*19* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR20* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,21* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL22* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER23* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING24* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS25* IN THE SOFTWARE.26*/2728#include "radv_shader_args.h"29#include "radv_private.h"30#include "radv_shader.h"3132static void33set_loc(struct radv_userdata_info *ud_info, uint8_t *sgpr_idx, uint8_t num_sgprs)34{35ud_info->sgpr_idx = *sgpr_idx;36ud_info->num_sgprs = num_sgprs;37*sgpr_idx += num_sgprs;38}3940static void41set_loc_shader(struct radv_shader_args *args, int idx, uint8_t *sgpr_idx, uint8_t num_sgprs)42{43struct radv_userdata_info *ud_info = &args->shader_info->user_sgprs_locs.shader_data[idx];44assert(ud_info);4546set_loc(ud_info, sgpr_idx, num_sgprs);47}4849static void50set_loc_shader_ptr(struct radv_shader_args *args, int idx, uint8_t *sgpr_idx)51{52bool use_32bit_pointers = idx != AC_UD_SCRATCH_RING_OFFSETS;5354set_loc_shader(args, idx, sgpr_idx, use_32bit_pointers ? 1 : 2);55}5657static void58set_loc_desc(struct radv_shader_args *args, int idx, uint8_t *sgpr_idx)59{60struct radv_userdata_locations *locs = &args->shader_info->user_sgprs_locs;61struct radv_userdata_info *ud_info = &locs->descriptor_sets[idx];62assert(ud_info);6364set_loc(ud_info, sgpr_idx, 1);6566locs->descriptor_sets_enabled |= 1u << idx;67}6869struct user_sgpr_info {70bool indirect_all_descriptor_sets;71uint8_t remaining_sgprs;72};7374static bool75needs_view_index_sgpr(struct radv_shader_args *args, gl_shader_stage stage)76{77switch (stage) {78case MESA_SHADER_VERTEX:79if (args->shader_info->needs_multiview_view_index ||80(!args->options->key.vs_common_out.as_es && !args->options->key.vs_common_out.as_ls &&81args->options->key.has_multiview_view_index))82return true;83break;84case MESA_SHADER_TESS_EVAL:85if (args->shader_info->needs_multiview_view_index ||86(!args->options->key.vs_common_out.as_es && args->options->key.has_multiview_view_index))87return true;88break;89case MESA_SHADER_TESS_CTRL:90if (args->shader_info->needs_multiview_view_index)91return true;92break;93case MESA_SHADER_GEOMETRY:94if (args->shader_info->needs_multiview_view_index ||95(args->options->key.vs_common_out.as_ngg && args->options->key.has_multiview_view_index))96return true;97break;98default:99break;100}101return false;102}103104static uint8_t105count_vs_user_sgprs(struct radv_shader_args *args)106{107uint8_t count = 1; /* vertex offset */108109if (args->shader_info->vs.vb_desc_usage_mask)110count++;111if (args->shader_info->vs.needs_draw_id)112count++;113if (args->shader_info->vs.needs_base_instance)114count++;115116return count;117}118119static unsigned120count_ngg_sgprs(struct radv_shader_args *args, gl_shader_stage stage)121{122unsigned count = 0;123124if (stage == MESA_SHADER_GEOMETRY)125count += 1; /* ngg_gs_state */126if (args->shader_info->has_ngg_culling)127count += 5; /* ngg_culling_settings + 4x ngg_viewport_* */128129return count;130}131132static void133allocate_inline_push_consts(struct radv_shader_args *args, struct user_sgpr_info *user_sgpr_info)134{135uint8_t remaining_sgprs = user_sgpr_info->remaining_sgprs;136137/* Only supported if shaders use push constants. */138if (args->shader_info->min_push_constant_used == UINT8_MAX)139return;140141/* Only supported if shaders don't have indirect push constants. */142if (args->shader_info->has_indirect_push_constants)143return;144145/* Only supported for 32-bit push constants. */146if (!args->shader_info->has_only_32bit_push_constants)147return;148149uint8_t num_push_consts =150(args->shader_info->max_push_constant_used - args->shader_info->min_push_constant_used) / 4;151152/* Check if the number of user SGPRs is large enough. */153if (num_push_consts < remaining_sgprs) {154args->shader_info->num_inline_push_consts = num_push_consts;155} else {156args->shader_info->num_inline_push_consts = remaining_sgprs;157}158159/* Clamp to the maximum number of allowed inlined push constants. */160if (args->shader_info->num_inline_push_consts > AC_MAX_INLINE_PUSH_CONSTS)161args->shader_info->num_inline_push_consts = AC_MAX_INLINE_PUSH_CONSTS;162163if (args->shader_info->num_inline_push_consts == num_push_consts &&164!args->shader_info->loads_dynamic_offsets) {165/* Disable the default push constants path if all constants are166* inlined and if shaders don't use dynamic descriptors.167*/168args->shader_info->loads_push_constants = false;169}170171args->shader_info->base_inline_push_consts = args->shader_info->min_push_constant_used / 4;172}173174static void175allocate_user_sgprs(struct radv_shader_args *args, gl_shader_stage stage, bool has_previous_stage,176gl_shader_stage previous_stage, bool needs_view_index,177struct user_sgpr_info *user_sgpr_info)178{179uint8_t user_sgpr_count = 0;180181memset(user_sgpr_info, 0, sizeof(struct user_sgpr_info));182183/* 2 user sgprs will always be allocated for scratch/rings */184user_sgpr_count += 2;185186switch (stage) {187case MESA_SHADER_COMPUTE:188if (args->shader_info->cs.uses_sbt)189user_sgpr_count += 1;190if (args->shader_info->cs.uses_grid_size)191user_sgpr_count += 3;192break;193case MESA_SHADER_FRAGMENT:194user_sgpr_count += args->shader_info->ps.needs_sample_positions;195break;196case MESA_SHADER_VERTEX:197if (!args->is_gs_copy_shader)198user_sgpr_count += count_vs_user_sgprs(args);199if (args->options->key.vs_common_out.as_ngg)200user_sgpr_count += count_ngg_sgprs(args, stage);201break;202case MESA_SHADER_TESS_CTRL:203if (has_previous_stage) {204if (previous_stage == MESA_SHADER_VERTEX)205user_sgpr_count += count_vs_user_sgprs(args);206}207break;208case MESA_SHADER_TESS_EVAL:209if (args->options->key.vs_common_out.as_ngg)210user_sgpr_count += count_ngg_sgprs(args, stage);211break;212case MESA_SHADER_GEOMETRY:213if (has_previous_stage) {214if (args->options->key.vs_common_out.as_ngg)215user_sgpr_count += count_ngg_sgprs(args, stage);216217if (previous_stage == MESA_SHADER_VERTEX) {218user_sgpr_count += count_vs_user_sgprs(args);219}220}221break;222default:223break;224}225226if (needs_view_index)227user_sgpr_count++;228229if (args->shader_info->loads_push_constants)230user_sgpr_count++;231232if (args->shader_info->so.num_outputs)233user_sgpr_count++;234235uint32_t available_sgprs =236args->options->chip_class >= GFX9 && stage != MESA_SHADER_COMPUTE ? 32 : 16;237uint32_t remaining_sgprs = available_sgprs - user_sgpr_count;238uint32_t num_desc_set = util_bitcount(args->shader_info->desc_set_used_mask);239240if (remaining_sgprs < num_desc_set) {241user_sgpr_info->indirect_all_descriptor_sets = true;242user_sgpr_info->remaining_sgprs = remaining_sgprs - 1;243} else {244user_sgpr_info->remaining_sgprs = remaining_sgprs - num_desc_set;245}246247allocate_inline_push_consts(args, user_sgpr_info);248}249250static void251declare_global_input_sgprs(struct radv_shader_args *args,252const struct user_sgpr_info *user_sgpr_info)253{254/* 1 for each descriptor set */255if (!user_sgpr_info->indirect_all_descriptor_sets) {256uint32_t mask = args->shader_info->desc_set_used_mask;257258while (mask) {259int i = u_bit_scan(&mask);260261ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_PTR, &args->descriptor_sets[i]);262}263} else {264ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_PTR_PTR, &args->descriptor_sets[0]);265}266267if (args->shader_info->loads_push_constants) {268/* 1 for push constants and dynamic descriptors */269ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_PTR, &args->ac.push_constants);270}271272for (unsigned i = 0; i < args->shader_info->num_inline_push_consts; i++) {273ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.inline_push_consts[i]);274}275args->ac.num_inline_push_consts = args->shader_info->num_inline_push_consts;276args->ac.base_inline_push_consts = args->shader_info->base_inline_push_consts;277278if (args->shader_info->so.num_outputs) {279ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_DESC_PTR, &args->streamout_buffers);280}281}282283static void284declare_vs_specific_input_sgprs(struct radv_shader_args *args, gl_shader_stage stage,285bool has_previous_stage, gl_shader_stage previous_stage)286{287if (!args->is_gs_copy_shader && (stage == MESA_SHADER_VERTEX ||288(has_previous_stage && previous_stage == MESA_SHADER_VERTEX))) {289if (args->shader_info->vs.vb_desc_usage_mask) {290ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_DESC_PTR, &args->ac.vertex_buffers);291}292ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.base_vertex);293if (args->shader_info->vs.needs_draw_id) {294ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.draw_id);295}296if (args->shader_info->vs.needs_base_instance) {297ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.start_instance);298}299}300}301302static void303declare_vs_input_vgprs(struct radv_shader_args *args)304{305ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.vertex_id);306if (!args->is_gs_copy_shader) {307if (args->options->key.vs_common_out.as_ls) {308ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.vs_rel_patch_id);309if (args->options->chip_class >= GFX10) {310ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* user vgpr */311ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.instance_id);312} else {313ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.instance_id);314ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* unused */315}316} else {317if (args->options->chip_class >= GFX10) {318if (args->options->key.vs_common_out.as_ngg) {319ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* user vgpr */320ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* user vgpr */321ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.instance_id);322} else {323ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* unused */324ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.vs_prim_id);325ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.instance_id);326}327} else {328ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.instance_id);329ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.vs_prim_id);330ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* unused */331}332}333}334}335336static void337declare_streamout_sgprs(struct radv_shader_args *args, gl_shader_stage stage)338{339int i;340341if (args->options->use_ngg_streamout) {342if (stage == MESA_SHADER_TESS_EVAL)343ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL);344return;345}346347/* Streamout SGPRs. */348if (args->shader_info->so.num_outputs) {349assert(stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_TESS_EVAL);350351ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.streamout_config);352ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.streamout_write_index);353} else if (stage == MESA_SHADER_TESS_EVAL) {354ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL);355}356357/* A streamout buffer offset is loaded if the stride is non-zero. */358for (i = 0; i < 4; i++) {359if (!args->shader_info->so.strides[i])360continue;361362ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.streamout_offset[i]);363}364}365366static void367declare_tes_input_vgprs(struct radv_shader_args *args)368{369ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.tes_u);370ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.tes_v);371ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tes_rel_patch_id);372ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tes_patch_id);373}374375static void376declare_ngg_sgprs(struct radv_shader_args *args, gl_shader_stage stage)377{378if (stage == MESA_SHADER_GEOMETRY) {379ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_gs_state);380}381382if (args->shader_info->has_ngg_culling) {383ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_culling_settings);384ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_viewport_scale[0]);385ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_viewport_scale[1]);386ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_viewport_translate[0]);387ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ngg_viewport_translate[1]);388}389}390391static void392set_global_input_locs(struct radv_shader_args *args, const struct user_sgpr_info *user_sgpr_info,393uint8_t *user_sgpr_idx)394{395uint32_t mask = args->shader_info->desc_set_used_mask;396397if (!user_sgpr_info->indirect_all_descriptor_sets) {398while (mask) {399int i = u_bit_scan(&mask);400401set_loc_desc(args, i, user_sgpr_idx);402}403} else {404set_loc_shader_ptr(args, AC_UD_INDIRECT_DESCRIPTOR_SETS, user_sgpr_idx);405406args->shader_info->need_indirect_descriptor_sets = true;407}408409if (args->shader_info->loads_push_constants) {410set_loc_shader_ptr(args, AC_UD_PUSH_CONSTANTS, user_sgpr_idx);411}412413if (args->shader_info->num_inline_push_consts) {414set_loc_shader(args, AC_UD_INLINE_PUSH_CONSTANTS, user_sgpr_idx,415args->shader_info->num_inline_push_consts);416}417418if (args->streamout_buffers.used) {419set_loc_shader_ptr(args, AC_UD_STREAMOUT_BUFFERS, user_sgpr_idx);420}421}422423static void424set_vs_specific_input_locs(struct radv_shader_args *args, gl_shader_stage stage,425bool has_previous_stage, gl_shader_stage previous_stage,426uint8_t *user_sgpr_idx)427{428if (!args->is_gs_copy_shader && (stage == MESA_SHADER_VERTEX ||429(has_previous_stage && previous_stage == MESA_SHADER_VERTEX))) {430if (args->shader_info->vs.vb_desc_usage_mask) {431set_loc_shader_ptr(args, AC_UD_VS_VERTEX_BUFFERS, user_sgpr_idx);432}433434unsigned vs_num =435count_vs_user_sgprs(args) - (args->shader_info->vs.vb_desc_usage_mask ? 1 : 0);436set_loc_shader(args, AC_UD_VS_BASE_VERTEX_START_INSTANCE, user_sgpr_idx, vs_num);437}438}439440static void441set_ngg_sgprs_locs(struct radv_shader_args *args, gl_shader_stage stage, uint8_t *user_sgpr_idx)442{443if (stage == MESA_SHADER_GEOMETRY) {444assert(args->ngg_gs_state.used);445set_loc_shader(args, AC_UD_NGG_GS_STATE, user_sgpr_idx, 1);446}447448if (args->shader_info->has_ngg_culling) {449assert(args->ngg_culling_settings.used &&450args->ngg_viewport_scale[0].used && args->ngg_viewport_scale[1].used &&451args->ngg_viewport_translate[0].used && args->ngg_viewport_translate[1].used);452453set_loc_shader(args, AC_UD_NGG_CULLING_SETTINGS, user_sgpr_idx, 1);454set_loc_shader(args, AC_UD_NGG_VIEWPORT, user_sgpr_idx, 4);455}456}457458/* Returns whether the stage is a stage that can be directly before the GS */459static bool460is_pre_gs_stage(gl_shader_stage stage)461{462return stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_TESS_EVAL;463}464465void466radv_declare_shader_args(struct radv_shader_args *args, gl_shader_stage stage,467bool has_previous_stage, gl_shader_stage previous_stage)468{469struct user_sgpr_info user_sgpr_info;470bool needs_view_index = needs_view_index_sgpr(args, stage);471472if (args->options->chip_class >= GFX10) {473if (is_pre_gs_stage(stage) && args->options->key.vs_common_out.as_ngg) {474/* On GFX10, VS is merged into GS for NGG. */475previous_stage = stage;476stage = MESA_SHADER_GEOMETRY;477has_previous_stage = true;478}479}480481for (int i = 0; i < MAX_SETS; i++)482args->shader_info->user_sgprs_locs.descriptor_sets[i].sgpr_idx = -1;483for (int i = 0; i < AC_UD_MAX_UD; i++)484args->shader_info->user_sgprs_locs.shader_data[i].sgpr_idx = -1;485486allocate_user_sgprs(args, stage, has_previous_stage, previous_stage, needs_view_index,487&user_sgpr_info);488489if (args->options->explicit_scratch_args) {490ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ring_offsets);491}492493switch (stage) {494case MESA_SHADER_COMPUTE:495declare_global_input_sgprs(args, &user_sgpr_info);496497if (args->shader_info->cs.uses_sbt) {498ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_DESC_PTR, &args->ac.sbt_descriptors);499}500501if (args->shader_info->cs.uses_grid_size) {502ac_add_arg(&args->ac, AC_ARG_SGPR, 3, AC_ARG_INT, &args->ac.num_work_groups);503}504505for (int i = 0; i < 3; i++) {506if (args->shader_info->cs.uses_block_id[i]) {507ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.workgroup_ids[i]);508}509}510511if (args->shader_info->cs.uses_local_invocation_idx) {512ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tg_size);513}514515if (args->options->explicit_scratch_args) {516ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);517}518519ac_add_arg(&args->ac, AC_ARG_VGPR, 3, AC_ARG_INT, &args->ac.local_invocation_ids);520break;521case MESA_SHADER_VERTEX:522declare_global_input_sgprs(args, &user_sgpr_info);523524declare_vs_specific_input_sgprs(args, stage, has_previous_stage, previous_stage);525526if (needs_view_index) {527ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);528}529530if (args->options->key.vs_common_out.as_es) {531ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.es2gs_offset);532} else if (args->options->key.vs_common_out.as_ls) {533/* no extra parameters */534} else {535declare_streamout_sgprs(args, stage);536}537538if (args->options->explicit_scratch_args) {539ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);540}541if (args->options->key.vs_common_out.as_ngg) {542declare_ngg_sgprs(args, stage);543}544545declare_vs_input_vgprs(args);546break;547case MESA_SHADER_TESS_CTRL:548if (has_previous_stage) {549// First 6 system regs550ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);551ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.merged_wave_info);552ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tcs_factor_offset);553554ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);555ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); // unknown556ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); // unknown557558declare_global_input_sgprs(args, &user_sgpr_info);559560declare_vs_specific_input_sgprs(args, stage, has_previous_stage, previous_stage);561562if (needs_view_index) {563ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);564}565566ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_patch_id);567ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_rel_ids);568569declare_vs_input_vgprs(args);570} else {571declare_global_input_sgprs(args, &user_sgpr_info);572573if (needs_view_index) {574ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);575}576577ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);578ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tcs_factor_offset);579if (args->options->explicit_scratch_args) {580ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);581}582ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_patch_id);583ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tcs_rel_ids);584}585break;586case MESA_SHADER_TESS_EVAL:587declare_global_input_sgprs(args, &user_sgpr_info);588589if (needs_view_index)590ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);591592if (args->options->key.vs_common_out.as_es) {593ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);594ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL);595ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.es2gs_offset);596} else {597declare_streamout_sgprs(args, stage);598ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);599}600if (args->options->explicit_scratch_args) {601ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);602}603if (args->options->key.vs_common_out.as_ngg) {604declare_ngg_sgprs(args, stage);605}606declare_tes_input_vgprs(args);607break;608case MESA_SHADER_GEOMETRY:609if (has_previous_stage) {610// First 6 system regs611if (args->options->key.vs_common_out.as_ngg) {612ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.gs_tg_info);613} else {614ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.gs2vs_offset);615}616617ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.merged_wave_info);618ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.tess_offchip_offset);619620ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);621ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); // unknown622ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); // unknown623624declare_global_input_sgprs(args, &user_sgpr_info);625626if (previous_stage != MESA_SHADER_TESS_EVAL) {627declare_vs_specific_input_sgprs(args, stage, has_previous_stage, previous_stage);628}629630if (needs_view_index) {631ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);632}633634if (args->options->key.vs_common_out.as_ngg) {635declare_ngg_sgprs(args, stage);636}637638ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[0]);639ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[2]);640ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_prim_id);641ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_invocation_id);642ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[4]);643644if (previous_stage == MESA_SHADER_VERTEX) {645declare_vs_input_vgprs(args);646} else {647declare_tes_input_vgprs(args);648}649} else {650declare_global_input_sgprs(args, &user_sgpr_info);651652if (needs_view_index) {653ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.view_index);654}655656ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.gs2vs_offset);657ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.gs_wave_id);658if (args->options->explicit_scratch_args) {659ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);660}661ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[0]);662ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[1]);663ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_prim_id);664ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[2]);665ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[3]);666ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[4]);667ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_vtx_offset[5]);668ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.gs_invocation_id);669}670break;671case MESA_SHADER_FRAGMENT:672declare_global_input_sgprs(args, &user_sgpr_info);673674ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.prim_mask);675if (args->options->explicit_scratch_args) {676ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);677}678ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_sample);679ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_center);680ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_centroid);681ac_add_arg(&args->ac, AC_ARG_VGPR, 3, AC_ARG_INT, &args->ac.pull_model);682ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.linear_sample);683ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.linear_center);684ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.linear_centroid);685ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, NULL); /* line stipple tex */686ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.frag_pos[0]);687ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.frag_pos[1]);688ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.frag_pos[2]);689ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.frag_pos[3]);690ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.front_face);691ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.ancillary);692ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.sample_coverage);693ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* fixed pt */694break;695default:696unreachable("Shader stage not implemented");697}698699args->shader_info->num_input_vgprs = 0;700args->shader_info->num_input_sgprs = 2;701args->shader_info->num_input_sgprs += args->ac.num_sgprs_used;702args->shader_info->num_input_vgprs = args->ac.num_vgprs_used;703704uint8_t user_sgpr_idx = 0;705706set_loc_shader_ptr(args, AC_UD_SCRATCH_RING_OFFSETS, &user_sgpr_idx);707708/* For merged shaders the user SGPRs start at 8, with 8 system SGPRs in front (including709* the rw_buffers at s0/s1. With user SGPR0 = s8, lets restart the count from 0 */710if (has_previous_stage)711user_sgpr_idx = 0;712713set_global_input_locs(args, &user_sgpr_info, &user_sgpr_idx);714715switch (stage) {716case MESA_SHADER_COMPUTE:717if (args->shader_info->cs.uses_sbt) {718set_loc_shader_ptr(args, AC_UD_CS_SBT_DESCRIPTORS, &user_sgpr_idx);719}720if (args->shader_info->cs.uses_grid_size) {721set_loc_shader(args, AC_UD_CS_GRID_SIZE, &user_sgpr_idx, 3);722}723break;724case MESA_SHADER_VERTEX:725set_vs_specific_input_locs(args, stage, has_previous_stage, previous_stage, &user_sgpr_idx);726if (args->ac.view_index.used)727set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);728if (args->options->key.vs_common_out.as_ngg)729set_ngg_sgprs_locs(args, stage, &user_sgpr_idx);730break;731case MESA_SHADER_TESS_CTRL:732set_vs_specific_input_locs(args, stage, has_previous_stage, previous_stage, &user_sgpr_idx);733if (args->ac.view_index.used)734set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);735break;736case MESA_SHADER_TESS_EVAL:737if (args->ac.view_index.used)738set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);739if (args->options->key.vs_common_out.as_ngg)740set_ngg_sgprs_locs(args, stage, &user_sgpr_idx);741break;742case MESA_SHADER_GEOMETRY:743if (has_previous_stage) {744if (previous_stage == MESA_SHADER_VERTEX)745set_vs_specific_input_locs(args, stage, has_previous_stage, previous_stage,746&user_sgpr_idx);747}748if (args->ac.view_index.used)749set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);750751if (args->options->key.vs_common_out.as_ngg)752set_ngg_sgprs_locs(args, stage, &user_sgpr_idx);753break;754case MESA_SHADER_FRAGMENT:755break;756default:757unreachable("Shader stage not implemented");758}759760args->shader_info->num_user_sgprs = user_sgpr_idx;761}762763764