Path: blob/21.2-virgl/src/amd/vulkan/radv_shader_info.c
7237 views
/*1* Copyright © 2017 Red Hat2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/22#include "nir/nir.h"23#include "nir/nir_xfb_info.h"24#include "radv_private.h"25#include "radv_shader.h"2627static void28mark_sampler_desc(const nir_variable *var, struct radv_shader_info *info)29{30info->desc_set_used_mask |= (1u << var->data.descriptor_set);31}3233static void34gather_intrinsic_load_input_info(const nir_shader *nir, const nir_intrinsic_instr *instr,35struct radv_shader_info *info)36{37switch (nir->info.stage) {38case MESA_SHADER_VERTEX: {39unsigned idx = nir_intrinsic_io_semantics(instr).location;40unsigned component = nir_intrinsic_component(instr);41unsigned mask = nir_ssa_def_components_read(&instr->dest.ssa);4243info->vs.input_usage_mask[idx] |= mask << component;44break;45}46default:47break;48}49}5051static uint32_t52widen_writemask(uint32_t wrmask)53{54uint32_t new_wrmask = 0;55for (unsigned i = 0; i < 4; i++)56new_wrmask |= (wrmask & (1 << i) ? 0x3 : 0x0) << (i * 2);57return new_wrmask;58}5960static void61set_writes_memory(const nir_shader *nir, struct radv_shader_info *info)62{63if (nir->info.stage == MESA_SHADER_FRAGMENT)64info->ps.writes_memory = true;65}6667static void68gather_intrinsic_store_output_info(const nir_shader *nir, const nir_intrinsic_instr *instr,69struct radv_shader_info *info)70{71unsigned idx = nir_intrinsic_base(instr);72unsigned num_slots = nir_intrinsic_io_semantics(instr).num_slots;73unsigned component = nir_intrinsic_component(instr);74unsigned write_mask = nir_intrinsic_write_mask(instr);75uint8_t *output_usage_mask = NULL;7677if (instr->src[0].ssa->bit_size == 64)78write_mask = widen_writemask(write_mask);7980switch (nir->info.stage) {81case MESA_SHADER_VERTEX:82output_usage_mask = info->vs.output_usage_mask;83break;84case MESA_SHADER_TESS_EVAL:85output_usage_mask = info->tes.output_usage_mask;86break;87case MESA_SHADER_GEOMETRY:88output_usage_mask = info->gs.output_usage_mask;89break;90default:91break;92}9394if (output_usage_mask) {95for (unsigned i = 0; i < num_slots; i++) {96output_usage_mask[idx + i] |= ((write_mask >> (i * 4)) & 0xf) << component;97}98}99}100101static void102gather_push_constant_info(const nir_shader *nir, const nir_intrinsic_instr *instr,103struct radv_shader_info *info)104{105int base = nir_intrinsic_base(instr);106107if (!nir_src_is_const(instr->src[0])) {108info->has_indirect_push_constants = true;109} else {110uint32_t min = base + nir_src_as_uint(instr->src[0]);111uint32_t max = min + instr->num_components * 4;112113info->max_push_constant_used = MAX2(max, info->max_push_constant_used);114info->min_push_constant_used = MIN2(min, info->min_push_constant_used);115}116117if (instr->dest.ssa.bit_size != 32)118info->has_only_32bit_push_constants = false;119120info->loads_push_constants = true;121}122123static void124gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,125struct radv_shader_info *info)126{127switch (instr->intrinsic) {128case nir_intrinsic_load_barycentric_sample:129case nir_intrinsic_load_barycentric_pixel:130case nir_intrinsic_load_barycentric_centroid: {131enum glsl_interp_mode mode = nir_intrinsic_interp_mode(instr);132switch (mode) {133case INTERP_MODE_NONE:134case INTERP_MODE_SMOOTH:135case INTERP_MODE_NOPERSPECTIVE:136info->ps.uses_persp_or_linear_interp = true;137break;138default:139break;140}141break;142}143case nir_intrinsic_load_barycentric_at_offset:144case nir_intrinsic_load_barycentric_at_sample:145if (nir_intrinsic_interp_mode(instr) != INTERP_MODE_FLAT)146info->ps.uses_persp_or_linear_interp = true;147148if (instr->intrinsic == nir_intrinsic_load_barycentric_at_sample)149info->ps.needs_sample_positions = true;150break;151case nir_intrinsic_load_draw_id:152info->vs.needs_draw_id = true;153break;154case nir_intrinsic_load_base_instance:155info->vs.needs_base_instance = true;156break;157case nir_intrinsic_load_instance_id:158info->vs.needs_instance_id = true;159break;160case nir_intrinsic_load_num_workgroups:161info->cs.uses_grid_size = true;162break;163case nir_intrinsic_load_local_invocation_id:164case nir_intrinsic_load_workgroup_id: {165unsigned mask = nir_ssa_def_components_read(&instr->dest.ssa);166while (mask) {167unsigned i = u_bit_scan(&mask);168169if (instr->intrinsic == nir_intrinsic_load_workgroup_id)170info->cs.uses_block_id[i] = true;171else172info->cs.uses_thread_id[i] = true;173}174break;175}176case nir_intrinsic_load_local_invocation_index:177case nir_intrinsic_load_subgroup_id:178case nir_intrinsic_load_num_subgroups:179info->cs.uses_local_invocation_idx = true;180break;181case nir_intrinsic_load_sample_mask_in:182info->ps.reads_sample_mask_in = true;183break;184case nir_intrinsic_load_view_index:185info->needs_multiview_view_index = true;186if (nir->info.stage == MESA_SHADER_FRAGMENT)187info->ps.layer_input = true;188break;189case nir_intrinsic_load_layer_id:190if (nir->info.stage == MESA_SHADER_FRAGMENT)191info->ps.layer_input = true;192break;193case nir_intrinsic_load_invocation_id:194info->uses_invocation_id = true;195break;196case nir_intrinsic_load_primitive_id:197info->uses_prim_id = true;198break;199case nir_intrinsic_load_push_constant:200gather_push_constant_info(nir, instr, info);201break;202case nir_intrinsic_vulkan_resource_index:203info->desc_set_used_mask |= (1u << nir_intrinsic_desc_set(instr));204break;205case nir_intrinsic_image_deref_load:206case nir_intrinsic_image_deref_sparse_load:207case nir_intrinsic_image_deref_store:208case nir_intrinsic_image_deref_atomic_add:209case nir_intrinsic_image_deref_atomic_imin:210case nir_intrinsic_image_deref_atomic_umin:211case nir_intrinsic_image_deref_atomic_imax:212case nir_intrinsic_image_deref_atomic_umax:213case nir_intrinsic_image_deref_atomic_and:214case nir_intrinsic_image_deref_atomic_or:215case nir_intrinsic_image_deref_atomic_xor:216case nir_intrinsic_image_deref_atomic_exchange:217case nir_intrinsic_image_deref_atomic_comp_swap:218case nir_intrinsic_image_deref_size: {219nir_variable *var =220nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));221mark_sampler_desc(var, info);222223if (instr->intrinsic == nir_intrinsic_image_deref_store ||224instr->intrinsic == nir_intrinsic_image_deref_atomic_add ||225instr->intrinsic == nir_intrinsic_image_deref_atomic_imin ||226instr->intrinsic == nir_intrinsic_image_deref_atomic_umin ||227instr->intrinsic == nir_intrinsic_image_deref_atomic_imax ||228instr->intrinsic == nir_intrinsic_image_deref_atomic_umax ||229instr->intrinsic == nir_intrinsic_image_deref_atomic_and ||230instr->intrinsic == nir_intrinsic_image_deref_atomic_or ||231instr->intrinsic == nir_intrinsic_image_deref_atomic_xor ||232instr->intrinsic == nir_intrinsic_image_deref_atomic_exchange ||233instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap) {234set_writes_memory(nir, info);235}236break;237}238case nir_intrinsic_store_ssbo:239case nir_intrinsic_ssbo_atomic_add:240case nir_intrinsic_ssbo_atomic_imin:241case nir_intrinsic_ssbo_atomic_umin:242case nir_intrinsic_ssbo_atomic_imax:243case nir_intrinsic_ssbo_atomic_umax:244case nir_intrinsic_ssbo_atomic_and:245case nir_intrinsic_ssbo_atomic_or:246case nir_intrinsic_ssbo_atomic_xor:247case nir_intrinsic_ssbo_atomic_exchange:248case nir_intrinsic_ssbo_atomic_comp_swap:249case nir_intrinsic_store_global:250case nir_intrinsic_global_atomic_add:251case nir_intrinsic_global_atomic_imin:252case nir_intrinsic_global_atomic_umin:253case nir_intrinsic_global_atomic_imax:254case nir_intrinsic_global_atomic_umax:255case nir_intrinsic_global_atomic_and:256case nir_intrinsic_global_atomic_or:257case nir_intrinsic_global_atomic_xor:258case nir_intrinsic_global_atomic_exchange:259case nir_intrinsic_global_atomic_comp_swap:260set_writes_memory(nir, info);261break;262case nir_intrinsic_load_input:263gather_intrinsic_load_input_info(nir, instr, info);264break;265case nir_intrinsic_store_output:266gather_intrinsic_store_output_info(nir, instr, info);267break;268case nir_intrinsic_load_sbt_amd:269info->cs.uses_sbt = true;270break;271default:272break;273}274}275276static void277gather_tex_info(const nir_shader *nir, const nir_tex_instr *instr, struct radv_shader_info *info)278{279for (unsigned i = 0; i < instr->num_srcs; i++) {280switch (instr->src[i].src_type) {281case nir_tex_src_texture_deref:282mark_sampler_desc(nir_deref_instr_get_variable(nir_src_as_deref(instr->src[i].src)), info);283break;284case nir_tex_src_sampler_deref:285mark_sampler_desc(nir_deref_instr_get_variable(nir_src_as_deref(instr->src[i].src)), info);286break;287default:288break;289}290}291}292293static void294gather_info_block(const nir_shader *nir, const nir_block *block, struct radv_shader_info *info)295{296nir_foreach_instr (instr, block) {297switch (instr->type) {298case nir_instr_type_intrinsic:299gather_intrinsic_info(nir, nir_instr_as_intrinsic(instr), info);300break;301case nir_instr_type_tex:302gather_tex_info(nir, nir_instr_as_tex(instr), info);303break;304default:305break;306}307}308}309310static void311gather_info_input_decl_vs(const nir_shader *nir, const nir_variable *var,312struct radv_shader_info *info, const struct radv_shader_variant_key *key)313{314unsigned attrib_count = glsl_count_attribute_slots(var->type, true);315316for (unsigned i = 0; i < attrib_count; ++i) {317unsigned attrib_index = var->data.location + i - VERT_ATTRIB_GENERIC0;318319if (key->vs.instance_rate_inputs & (1u << attrib_index)) {320info->vs.needs_instance_id = true;321info->vs.needs_base_instance = true;322}323324if (info->vs.use_per_attribute_vb_descs)325info->vs.vb_desc_usage_mask |= 1u << attrib_index;326else327info->vs.vb_desc_usage_mask |= 1u << key->vs.vertex_attribute_bindings[attrib_index];328}329}330331static void332mark_16bit_ps_input(struct radv_shader_info *info, const struct glsl_type *type, int location)333{334if (glsl_type_is_scalar(type) || glsl_type_is_vector(type) || glsl_type_is_matrix(type)) {335unsigned attrib_count = glsl_count_attribute_slots(type, false);336if (glsl_type_is_16bit(type)) {337info->ps.float16_shaded_mask |= ((1ull << attrib_count) - 1) << location;338}339} else if (glsl_type_is_array(type)) {340unsigned stride = glsl_count_attribute_slots(glsl_get_array_element(type), false);341for (unsigned i = 0; i < glsl_get_length(type); ++i) {342mark_16bit_ps_input(info, glsl_get_array_element(type), location + i * stride);343}344} else {345assert(glsl_type_is_struct_or_ifc(type));346for (unsigned i = 0; i < glsl_get_length(type); i++) {347mark_16bit_ps_input(info, glsl_get_struct_field(type, i), location);348location += glsl_count_attribute_slots(glsl_get_struct_field(type, i), false);349}350}351}352static void353gather_info_input_decl_ps(const nir_shader *nir, const nir_variable *var,354struct radv_shader_info *info)355{356unsigned attrib_count = glsl_count_attribute_slots(var->type, false);357int idx = var->data.location;358359switch (idx) {360case VARYING_SLOT_PNTC:361info->ps.has_pcoord = true;362break;363case VARYING_SLOT_PRIMITIVE_ID:364info->ps.prim_id_input = true;365break;366case VARYING_SLOT_LAYER:367info->ps.layer_input = true;368break;369case VARYING_SLOT_CLIP_DIST0:370case VARYING_SLOT_CLIP_DIST1:371info->ps.num_input_clips_culls += attrib_count;372break;373case VARYING_SLOT_VIEWPORT:374info->ps.viewport_index_input = true;375break;376default:377break;378}379380if (var->data.compact) {381unsigned component_count = var->data.location_frac + glsl_get_length(var->type);382attrib_count = (component_count + 3) / 4;383} else {384mark_16bit_ps_input(info, var->type, var->data.driver_location);385}386387uint64_t mask = ((1ull << attrib_count) - 1);388389if (var->data.interpolation == INTERP_MODE_FLAT)390info->ps.flat_shaded_mask |= mask << var->data.driver_location;391if (var->data.interpolation == INTERP_MODE_EXPLICIT)392info->ps.explicit_shaded_mask |= mask << var->data.driver_location;393394if (var->data.location >= VARYING_SLOT_VAR0)395info->ps.input_mask |= mask << (var->data.location - VARYING_SLOT_VAR0);396}397398static void399gather_info_input_decl(const nir_shader *nir, const nir_variable *var,400struct radv_shader_info *info, const struct radv_shader_variant_key *key)401{402switch (nir->info.stage) {403case MESA_SHADER_VERTEX:404gather_info_input_decl_vs(nir, var, info, key);405break;406case MESA_SHADER_FRAGMENT:407gather_info_input_decl_ps(nir, var, info);408break;409default:410break;411}412}413414static void415gather_info_output_decl_ps(const nir_shader *nir, const nir_variable *var,416struct radv_shader_info *info)417{418int idx = var->data.location;419420switch (idx) {421case FRAG_RESULT_DEPTH:422info->ps.writes_z = true;423break;424case FRAG_RESULT_STENCIL:425info->ps.writes_stencil = true;426break;427case FRAG_RESULT_SAMPLE_MASK:428info->ps.writes_sample_mask = true;429break;430default:431break;432}433}434435static void436gather_info_output_decl_gs(const nir_shader *nir, const nir_variable *var,437struct radv_shader_info *info)438{439unsigned num_components = glsl_get_component_slots(var->type);440unsigned stream = var->data.stream;441unsigned idx = var->data.location;442443assert(stream < 4);444445info->gs.max_stream = MAX2(info->gs.max_stream, stream);446info->gs.num_stream_output_components[stream] += num_components;447info->gs.output_streams[idx] = stream;448}449450static void451gather_info_output_decl(const nir_shader *nir, const nir_variable *var,452struct radv_shader_info *info, const struct radv_shader_variant_key *key)453{454struct radv_vs_output_info *vs_info = NULL;455456switch (nir->info.stage) {457case MESA_SHADER_FRAGMENT:458gather_info_output_decl_ps(nir, var, info);459break;460case MESA_SHADER_VERTEX:461if (!key->vs_common_out.as_ls && !key->vs_common_out.as_es)462vs_info = &info->vs.outinfo;463464/* TODO: Adjust as_ls/as_nng. */465if (!key->vs_common_out.as_ls && key->vs_common_out.as_ngg)466gather_info_output_decl_gs(nir, var, info);467break;468case MESA_SHADER_GEOMETRY:469vs_info = &info->vs.outinfo;470gather_info_output_decl_gs(nir, var, info);471break;472case MESA_SHADER_TESS_EVAL:473if (!key->vs_common_out.as_es)474vs_info = &info->tes.outinfo;475break;476default:477break;478}479480if (vs_info) {481switch (var->data.location) {482case VARYING_SLOT_CLIP_DIST0:483vs_info->clip_dist_mask = (1 << nir->info.clip_distance_array_size) - 1;484vs_info->cull_dist_mask = (1 << nir->info.cull_distance_array_size) - 1;485vs_info->cull_dist_mask <<= nir->info.clip_distance_array_size;486break;487case VARYING_SLOT_PSIZ:488vs_info->writes_pointsize = true;489break;490case VARYING_SLOT_VIEWPORT:491vs_info->writes_viewport_index = true;492break;493case VARYING_SLOT_LAYER:494vs_info->writes_layer = true;495break;496case VARYING_SLOT_PRIMITIVE_SHADING_RATE:497vs_info->writes_primitive_shading_rate = true;498break;499default:500break;501}502}503}504505static void506gather_xfb_info(const nir_shader *nir, struct radv_shader_info *info)507{508nir_xfb_info *xfb = nir_gather_xfb_info(nir, NULL);509struct radv_streamout_info *so = &info->so;510511if (!xfb)512return;513514assert(xfb->output_count < MAX_SO_OUTPUTS);515so->num_outputs = xfb->output_count;516517for (unsigned i = 0; i < xfb->output_count; i++) {518struct radv_stream_output *output = &so->outputs[i];519520output->buffer = xfb->outputs[i].buffer;521output->stream = xfb->buffer_to_stream[xfb->outputs[i].buffer];522output->offset = xfb->outputs[i].offset;523output->location = xfb->outputs[i].location;524output->component_mask = xfb->outputs[i].component_mask;525526so->enabled_stream_buffers_mask |= (1 << output->buffer) << (output->stream * 4);527}528529for (unsigned i = 0; i < NIR_MAX_XFB_BUFFERS; i++) {530so->strides[i] = xfb->buffers[i].stride / 4;531}532533ralloc_free(xfb);534}535536void537radv_nir_shader_info_init(struct radv_shader_info *info)538{539/* Assume that shaders only have 32-bit push constants by default. */540info->min_push_constant_used = UINT8_MAX;541info->has_only_32bit_push_constants = true;542}543544void545radv_nir_shader_info_pass(struct radv_device *device, const struct nir_shader *nir,546const struct radv_pipeline_layout *layout,547const struct radv_shader_variant_key *key, struct radv_shader_info *info)548{549struct nir_function *func = (struct nir_function *)exec_list_get_head_const(&nir->functions);550551if (layout && layout->dynamic_offset_count &&552(layout->dynamic_shader_stages & mesa_to_vk_shader_stage(nir->info.stage))) {553info->loads_push_constants = true;554info->loads_dynamic_offsets = true;555}556557if (nir->info.stage == MESA_SHADER_VERTEX) {558/* Use per-attribute vertex descriptors to prevent faults and559* for correct bounds checking.560*/561info->vs.use_per_attribute_vb_descs = device->robust_buffer_access;562}563564nir_foreach_shader_in_variable (variable, nir)565gather_info_input_decl(nir, variable, info, key);566567nir_foreach_block (block, func->impl) {568gather_info_block(nir, block, info);569}570571nir_foreach_shader_out_variable(variable, nir) gather_info_output_decl(nir, variable, info, key);572573if (nir->info.stage == MESA_SHADER_VERTEX || nir->info.stage == MESA_SHADER_TESS_EVAL ||574nir->info.stage == MESA_SHADER_GEOMETRY)575gather_xfb_info(nir, info);576577/* Make sure to export the LayerID if the fragment shader needs it. */578if (key->vs_common_out.export_layer_id) {579switch (nir->info.stage) {580case MESA_SHADER_VERTEX:581info->vs.output_usage_mask[VARYING_SLOT_LAYER] |= 0x1;582break;583case MESA_SHADER_TESS_EVAL:584info->tes.output_usage_mask[VARYING_SLOT_LAYER] |= 0x1;585break;586case MESA_SHADER_GEOMETRY:587info->gs.output_usage_mask[VARYING_SLOT_LAYER] |= 0x1;588break;589default:590break;591}592}593594/* Make sure to export the LayerID if the subpass has multiviews. */595if (key->has_multiview_view_index) {596switch (nir->info.stage) {597case MESA_SHADER_VERTEX:598info->vs.outinfo.writes_layer = true;599break;600case MESA_SHADER_TESS_EVAL:601info->tes.outinfo.writes_layer = true;602break;603case MESA_SHADER_GEOMETRY:604info->vs.outinfo.writes_layer = true;605break;606default:607break;608}609}610611/* Make sure to export the PrimitiveID if the fragment shader needs it. */612if (key->vs_common_out.export_prim_id) {613switch (nir->info.stage) {614case MESA_SHADER_VERTEX:615info->vs.outinfo.export_prim_id = true;616break;617case MESA_SHADER_TESS_EVAL:618info->tes.outinfo.export_prim_id = true;619break;620case MESA_SHADER_GEOMETRY:621info->vs.outinfo.export_prim_id = true;622break;623default:624break;625}626}627628/* Make sure to export the ViewportIndex if the fragment shader needs it. */629if (key->vs_common_out.export_viewport_index) {630switch (nir->info.stage) {631case MESA_SHADER_VERTEX:632info->vs.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1;633break;634case MESA_SHADER_TESS_EVAL:635info->tes.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1;636break;637case MESA_SHADER_GEOMETRY:638info->gs.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1;639break;640default:641break;642}643}644645if (nir->info.stage == MESA_SHADER_FRAGMENT)646info->ps.num_interp = nir->num_inputs;647648switch (nir->info.stage) {649case MESA_SHADER_COMPUTE:650for (int i = 0; i < 3; ++i)651info->cs.block_size[i] = nir->info.workgroup_size[i];652break;653case MESA_SHADER_FRAGMENT:654info->ps.can_discard = nir->info.fs.uses_discard;655info->ps.early_fragment_test = nir->info.fs.early_fragment_tests;656info->ps.post_depth_coverage = nir->info.fs.post_depth_coverage;657info->ps.depth_layout = nir->info.fs.depth_layout;658info->ps.uses_sample_shading = nir->info.fs.uses_sample_shading;659break;660case MESA_SHADER_GEOMETRY:661info->gs.vertices_in = nir->info.gs.vertices_in;662info->gs.vertices_out = nir->info.gs.vertices_out;663info->gs.output_prim = nir->info.gs.output_primitive;664info->gs.invocations = nir->info.gs.invocations;665break;666case MESA_SHADER_TESS_EVAL:667info->tes.primitive_mode = nir->info.tess.primitive_mode;668info->tes.spacing = nir->info.tess.spacing;669info->tes.ccw = nir->info.tess.ccw;670info->tes.point_mode = nir->info.tess.point_mode;671info->tes.as_es = key->vs_common_out.as_es;672info->tes.export_prim_id = key->vs_common_out.export_prim_id;673info->is_ngg = key->vs_common_out.as_ngg;674info->is_ngg_passthrough = key->vs_common_out.as_ngg_passthrough;675break;676case MESA_SHADER_TESS_CTRL:677info->tcs.tcs_vertices_out = nir->info.tess.tcs_vertices_out;678break;679case MESA_SHADER_VERTEX:680info->vs.as_es = key->vs_common_out.as_es;681info->vs.as_ls = key->vs_common_out.as_ls;682info->vs.export_prim_id = key->vs_common_out.export_prim_id;683info->is_ngg = key->vs_common_out.as_ngg;684info->is_ngg_passthrough = key->vs_common_out.as_ngg_passthrough;685break;686default:687break;688}689690if (nir->info.stage == MESA_SHADER_GEOMETRY) {691unsigned add_clip =692nir->info.clip_distance_array_size + nir->info.cull_distance_array_size > 4;693info->gs.gsvs_vertex_size = (util_bitcount64(nir->info.outputs_written) + add_clip) * 16;694info->gs.max_gsvs_emit_size = info->gs.gsvs_vertex_size * nir->info.gs.vertices_out;695}696697/* Compute the ESGS item size for VS or TES as ES. */698if ((nir->info.stage == MESA_SHADER_VERTEX || nir->info.stage == MESA_SHADER_TESS_EVAL) &&699key->vs_common_out.as_es) {700struct radv_es_output_info *es_info =701nir->info.stage == MESA_SHADER_VERTEX ? &info->vs.es_info : &info->tes.es_info;702uint32_t num_outputs_written = nir->info.stage == MESA_SHADER_VERTEX703? info->vs.num_linked_outputs704: info->tes.num_linked_outputs;705es_info->esgs_itemsize = num_outputs_written * 16;706}707708info->float_controls_mode = nir->info.float_controls_execution_mode;709710if (nir->info.stage == MESA_SHADER_FRAGMENT) {711info->ps.allow_flat_shading =712!(info->ps.uses_persp_or_linear_interp || info->ps.needs_sample_positions ||713info->ps.writes_memory || nir->info.fs.needs_quad_helper_invocations ||714BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_FRAG_COORD) ||715BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_POINT_COORD) ||716BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_ID) ||717BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_POS) ||718BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_MASK_IN) ||719BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_HELPER_INVOCATION));720}721}722723724