Path: blob/21.2-virgl/src/gallium/drivers/radeonsi/si_shader_llvm.c
4570 views
/*1* Copyright 2016 Advanced Micro Devices, Inc.2* All Rights Reserved.3*4* Permission is hereby granted, free of charge, to any person obtaining a5* copy of this software and associated documentation files (the "Software"),6* to deal in the Software without restriction, including without limitation7* on the rights to use, copy, modify, merge, publish, distribute, sub8* license, and/or sell copies of the Software, and to permit persons to whom9* the Software is furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice (including the next12* paragraph) shall be included in all copies or substantial portions of the13* Software.14*15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL18* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,19* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR20* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE21* USE OR OTHER DEALINGS IN THE SOFTWARE.22*/2324#include "ac_nir_to_llvm.h"25#include "ac_rtld.h"26#include "si_pipe.h"27#include "si_shader_internal.h"28#include "sid.h"29#include "tgsi/tgsi_from_mesa.h"30#include "util/u_memory.h"3132struct si_llvm_diagnostics {33struct pipe_debug_callback *debug;34unsigned retval;35};3637static void si_diagnostic_handler(LLVMDiagnosticInfoRef di, void *context)38{39struct si_llvm_diagnostics *diag = (struct si_llvm_diagnostics *)context;40LLVMDiagnosticSeverity severity = LLVMGetDiagInfoSeverity(di);41const char *severity_str = NULL;4243switch (severity) {44case LLVMDSError:45severity_str = "error";46break;47case LLVMDSWarning:48severity_str = "warning";49break;50case LLVMDSRemark:51case LLVMDSNote:52default:53return;54}5556char *description = LLVMGetDiagInfoDescription(di);5758pipe_debug_message(diag->debug, SHADER_INFO, "LLVM diagnostic (%s): %s", severity_str,59description);6061if (severity == LLVMDSError) {62diag->retval = 1;63fprintf(stderr, "LLVM triggered Diagnostic Handler: %s\n", description);64}6566LLVMDisposeMessage(description);67}6869bool si_compile_llvm(struct si_screen *sscreen, struct si_shader_binary *binary,70struct ac_shader_config *conf, struct ac_llvm_compiler *compiler,71struct ac_llvm_context *ac, struct pipe_debug_callback *debug,72gl_shader_stage stage, const char *name, bool less_optimized)73{74unsigned count = p_atomic_inc_return(&sscreen->num_compilations);7576if (si_can_dump_shader(sscreen, stage)) {77fprintf(stderr, "radeonsi: Compiling shader %d\n", count);7879if (!(sscreen->debug_flags & (DBG(NO_IR) | DBG(PREOPT_IR)))) {80fprintf(stderr, "%s LLVM IR:\n\n", name);81ac_dump_module(ac->module);82fprintf(stderr, "\n");83}84}8586if (sscreen->record_llvm_ir) {87char *ir = LLVMPrintModuleToString(ac->module);88binary->llvm_ir_string = strdup(ir);89LLVMDisposeMessage(ir);90}9192if (!si_replace_shader(count, binary)) {93struct ac_compiler_passes *passes = compiler->passes;9495if (less_optimized && compiler->low_opt_passes)96passes = compiler->low_opt_passes;9798struct si_llvm_diagnostics diag = {debug};99LLVMContextSetDiagnosticHandler(ac->context, si_diagnostic_handler, &diag);100101if (!ac_compile_module_to_elf(passes, ac->module, (char **)&binary->elf_buffer,102&binary->elf_size))103diag.retval = 1;104105if (diag.retval != 0) {106pipe_debug_message(debug, SHADER_INFO, "LLVM compilation failed");107return false;108}109}110111struct ac_rtld_binary rtld;112if (!ac_rtld_open(&rtld, (struct ac_rtld_open_info){113.info = &sscreen->info,114.shader_type = stage,115.wave_size = ac->wave_size,116.num_parts = 1,117.elf_ptrs = &binary->elf_buffer,118.elf_sizes = &binary->elf_size}))119return false;120121bool ok = ac_rtld_read_config(&sscreen->info, &rtld, conf);122ac_rtld_close(&rtld);123return ok;124}125126void si_llvm_context_init(struct si_shader_context *ctx, struct si_screen *sscreen,127struct ac_llvm_compiler *compiler, unsigned wave_size)128{129memset(ctx, 0, sizeof(*ctx));130ctx->screen = sscreen;131ctx->compiler = compiler;132133ac_llvm_context_init(&ctx->ac, compiler, sscreen->info.chip_class, sscreen->info.family,134&sscreen->info, AC_FLOAT_MODE_DEFAULT_OPENGL, wave_size, 64);135}136137void si_llvm_create_func(struct si_shader_context *ctx, const char *name, LLVMTypeRef *return_types,138unsigned num_return_elems, unsigned max_workgroup_size)139{140LLVMTypeRef ret_type;141enum ac_llvm_calling_convention call_conv;142143if (num_return_elems)144ret_type = LLVMStructTypeInContext(ctx->ac.context, return_types, num_return_elems, true);145else146ret_type = ctx->ac.voidt;147148gl_shader_stage real_stage = ctx->stage;149150/* LS is merged into HS (TCS), and ES is merged into GS. */151if (ctx->screen->info.chip_class >= GFX9) {152if (ctx->shader->key.as_ls)153real_stage = MESA_SHADER_TESS_CTRL;154else if (ctx->shader->key.as_es || ctx->shader->key.as_ngg)155real_stage = MESA_SHADER_GEOMETRY;156}157158switch (real_stage) {159case MESA_SHADER_VERTEX:160case MESA_SHADER_TESS_EVAL:161call_conv = AC_LLVM_AMDGPU_VS;162break;163case MESA_SHADER_TESS_CTRL:164call_conv = AC_LLVM_AMDGPU_HS;165break;166case MESA_SHADER_GEOMETRY:167call_conv = AC_LLVM_AMDGPU_GS;168break;169case MESA_SHADER_FRAGMENT:170call_conv = AC_LLVM_AMDGPU_PS;171break;172case MESA_SHADER_COMPUTE:173call_conv = AC_LLVM_AMDGPU_CS;174break;175default:176unreachable("Unhandle shader type");177}178179/* Setup the function */180ctx->return_type = ret_type;181ctx->main_fn = ac_build_main(&ctx->args, &ctx->ac, call_conv, name, ret_type, ctx->ac.module);182ctx->return_value = LLVMGetUndef(ctx->return_type);183184if (ctx->screen->info.address32_hi) {185ac_llvm_add_target_dep_function_attr(ctx->main_fn, "amdgpu-32bit-address-high-bits",186ctx->screen->info.address32_hi);187}188189ac_llvm_set_workgroup_size(ctx->main_fn, max_workgroup_size);190ac_llvm_set_target_features(ctx->main_fn, &ctx->ac);191}192193void si_llvm_create_main_func(struct si_shader_context *ctx, bool ngg_cull_shader)194{195struct si_shader *shader = ctx->shader;196LLVMTypeRef returns[AC_MAX_ARGS];197unsigned i;198199si_init_shader_args(ctx, ngg_cull_shader);200201for (i = 0; i < ctx->args.num_sgprs_returned; i++)202returns[i] = ctx->ac.i32; /* SGPR */203for (; i < ctx->args.return_count; i++)204returns[i] = ctx->ac.f32; /* VGPR */205206si_llvm_create_func(ctx, ngg_cull_shader ? "ngg_cull_main" : "main", returns,207ctx->args.return_count, si_get_max_workgroup_size(shader));208209/* Reserve register locations for VGPR inputs the PS prolog may need. */210if (ctx->stage == MESA_SHADER_FRAGMENT && !ctx->shader->is_monolithic) {211ac_llvm_add_target_dep_function_attr(212ctx->main_fn, "InitialPSInputAddr",213S_0286D0_PERSP_SAMPLE_ENA(1) | S_0286D0_PERSP_CENTER_ENA(1) |214S_0286D0_PERSP_CENTROID_ENA(1) | S_0286D0_LINEAR_SAMPLE_ENA(1) |215S_0286D0_LINEAR_CENTER_ENA(1) | S_0286D0_LINEAR_CENTROID_ENA(1) |216S_0286D0_FRONT_FACE_ENA(1) | S_0286D0_ANCILLARY_ENA(1) | S_0286D0_POS_FIXED_PT_ENA(1));217}218219220if (shader->key.as_ls || ctx->stage == MESA_SHADER_TESS_CTRL) {221if (USE_LDS_SYMBOLS) {222/* The LSHS size is not known until draw time, so we append it223* at the end of whatever LDS use there may be in the rest of224* the shader (currently none, unless LLVM decides to do its225* own LDS-based lowering).226*/227ctx->ac.lds = LLVMAddGlobalInAddressSpace(ctx->ac.module, LLVMArrayType(ctx->ac.i32, 0),228"__lds_end", AC_ADDR_SPACE_LDS);229LLVMSetAlignment(ctx->ac.lds, 256);230} else {231ac_declare_lds_as_pointer(&ctx->ac);232}233}234235/* Unlike radv, we override these arguments in the prolog, so to the236* API shader they appear as normal arguments.237*/238if (ctx->stage == MESA_SHADER_VERTEX) {239ctx->abi.vertex_id = ac_get_arg(&ctx->ac, ctx->args.vertex_id);240ctx->abi.instance_id = ac_get_arg(&ctx->ac, ctx->args.instance_id);241} else if (ctx->stage == MESA_SHADER_FRAGMENT) {242ctx->abi.persp_centroid = ac_get_arg(&ctx->ac, ctx->args.persp_centroid);243ctx->abi.linear_centroid = ac_get_arg(&ctx->ac, ctx->args.linear_centroid);244}245}246247void si_llvm_optimize_module(struct si_shader_context *ctx)248{249/* Dump LLVM IR before any optimization passes */250if (ctx->screen->debug_flags & DBG(PREOPT_IR) && si_can_dump_shader(ctx->screen, ctx->stage))251LLVMDumpModule(ctx->ac.module);252253/* Run the pass */254LLVMRunPassManager(ctx->compiler->passmgr, ctx->ac.module);255LLVMDisposeBuilder(ctx->ac.builder);256}257258void si_llvm_dispose(struct si_shader_context *ctx)259{260LLVMDisposeModule(ctx->ac.module);261LLVMContextDispose(ctx->ac.context);262ac_llvm_context_dispose(&ctx->ac);263}264265/**266* Load a dword from a constant buffer.267*/268LLVMValueRef si_buffer_load_const(struct si_shader_context *ctx, LLVMValueRef resource,269LLVMValueRef offset)270{271return ac_build_buffer_load(&ctx->ac, resource, 1, NULL, offset, NULL, 0, ctx->ac.f32,2720, true, true);273}274275void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret)276{277if (LLVMGetTypeKind(LLVMTypeOf(ret)) == LLVMVoidTypeKind)278LLVMBuildRetVoid(ctx->ac.builder);279else280LLVMBuildRet(ctx->ac.builder, ret);281}282283LLVMValueRef si_insert_input_ret(struct si_shader_context *ctx, LLVMValueRef ret,284struct ac_arg param, unsigned return_index)285{286return LLVMBuildInsertValue(ctx->ac.builder, ret, ac_get_arg(&ctx->ac, param), return_index, "");287}288289LLVMValueRef si_insert_input_ret_float(struct si_shader_context *ctx, LLVMValueRef ret,290struct ac_arg param, unsigned return_index)291{292LLVMBuilderRef builder = ctx->ac.builder;293LLVMValueRef p = ac_get_arg(&ctx->ac, param);294295return LLVMBuildInsertValue(builder, ret, ac_to_float(&ctx->ac, p), return_index, "");296}297298LLVMValueRef si_insert_input_ptr(struct si_shader_context *ctx, LLVMValueRef ret,299struct ac_arg param, unsigned return_index)300{301LLVMBuilderRef builder = ctx->ac.builder;302LLVMValueRef ptr = ac_get_arg(&ctx->ac, param);303ptr = LLVMBuildPtrToInt(builder, ptr, ctx->ac.i32, "");304return LLVMBuildInsertValue(builder, ret, ptr, return_index, "");305}306307LLVMValueRef si_prolog_get_internal_bindings(struct si_shader_context *ctx)308{309LLVMValueRef ptr[2], list;310bool merged_shader = si_is_merged_shader(ctx->shader);311312ptr[0] = LLVMGetParam(ctx->main_fn, (merged_shader ? 8 : 0) + SI_SGPR_INTERNAL_BINDINGS);313list =314LLVMBuildIntToPtr(ctx->ac.builder, ptr[0], ac_array_in_const32_addr_space(ctx->ac.v4i32), "");315return list;316}317318void si_llvm_emit_barrier(struct si_shader_context *ctx)319{320/* GFX6 only (thanks to a hw bug workaround):321* The real barrier instruction isn’t needed, because an entire patch322* always fits into a single wave.323*/324if (ctx->screen->info.chip_class == GFX6 && ctx->stage == MESA_SHADER_TESS_CTRL) {325ac_build_waitcnt(&ctx->ac, AC_WAIT_LGKM | AC_WAIT_VLOAD | AC_WAIT_VSTORE);326return;327}328329ac_build_s_barrier(&ctx->ac);330}331332/* Ensure that the esgs ring is declared.333*334* We declare it with 64KB alignment as a hint that the335* pointer value will always be 0.336*/337void si_llvm_declare_esgs_ring(struct si_shader_context *ctx)338{339if (ctx->esgs_ring)340return;341342assert(!LLVMGetNamedGlobal(ctx->ac.module, "esgs_ring"));343344ctx->esgs_ring = LLVMAddGlobalInAddressSpace(ctx->ac.module, LLVMArrayType(ctx->ac.i32, 0),345"esgs_ring", AC_ADDR_SPACE_LDS);346LLVMSetLinkage(ctx->esgs_ring, LLVMExternalLinkage);347LLVMSetAlignment(ctx->esgs_ring, 64 * 1024);348}349350static void si_init_exec_from_input(struct si_shader_context *ctx, struct ac_arg param,351unsigned bitoffset)352{353LLVMValueRef args[] = {354ac_get_arg(&ctx->ac, param),355LLVMConstInt(ctx->ac.i32, bitoffset, 0),356};357ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.init.exec.from.input", ctx->ac.voidt, args, 2,358AC_FUNC_ATTR_CONVERGENT);359}360361/**362* Get the value of a shader input parameter and extract a bitfield.363*/364static LLVMValueRef unpack_llvm_param(struct si_shader_context *ctx, LLVMValueRef value,365unsigned rshift, unsigned bitwidth)366{367if (LLVMGetTypeKind(LLVMTypeOf(value)) == LLVMFloatTypeKind)368value = ac_to_integer(&ctx->ac, value);369370if (rshift)371value = LLVMBuildLShr(ctx->ac.builder, value, LLVMConstInt(ctx->ac.i32, rshift, 0), "");372373if (rshift + bitwidth < 32) {374unsigned mask = (1 << bitwidth) - 1;375value = LLVMBuildAnd(ctx->ac.builder, value, LLVMConstInt(ctx->ac.i32, mask, 0), "");376}377378return value;379}380381LLVMValueRef si_unpack_param(struct si_shader_context *ctx, struct ac_arg param, unsigned rshift,382unsigned bitwidth)383{384LLVMValueRef value = ac_get_arg(&ctx->ac, param);385386return unpack_llvm_param(ctx, value, rshift, bitwidth);387}388389LLVMValueRef si_get_primitive_id(struct si_shader_context *ctx, unsigned swizzle)390{391if (swizzle > 0)392return ctx->ac.i32_0;393394switch (ctx->stage) {395case MESA_SHADER_VERTEX:396return ac_get_arg(&ctx->ac, ctx->args.vs_prim_id);397case MESA_SHADER_TESS_CTRL:398return ac_get_arg(&ctx->ac, ctx->args.tcs_patch_id);399case MESA_SHADER_TESS_EVAL:400return ac_get_arg(&ctx->ac, ctx->args.tes_patch_id);401case MESA_SHADER_GEOMETRY:402return ac_get_arg(&ctx->ac, ctx->args.gs_prim_id);403default:404assert(0);405return ctx->ac.i32_0;406}407}408409static LLVMValueRef si_llvm_get_block_size(struct ac_shader_abi *abi)410{411struct si_shader_context *ctx = si_shader_context_from_abi(abi);412413assert(ctx->shader->selector->info.base.workgroup_size_variable &&414ctx->shader->selector->info.uses_variable_block_size);415416LLVMValueRef chan[3] = {417si_unpack_param(ctx, ctx->block_size, 0, 10),418si_unpack_param(ctx, ctx->block_size, 10, 10),419si_unpack_param(ctx, ctx->block_size, 20, 10),420};421return ac_build_gather_values(&ctx->ac, chan, 3);422}423424static void si_llvm_declare_compute_memory(struct si_shader_context *ctx)425{426struct si_shader_selector *sel = ctx->shader->selector;427unsigned lds_size = sel->info.base.shared_size;428429LLVMTypeRef i8p = LLVMPointerType(ctx->ac.i8, AC_ADDR_SPACE_LDS);430LLVMValueRef var;431432assert(!ctx->ac.lds);433434var = LLVMAddGlobalInAddressSpace(ctx->ac.module, LLVMArrayType(ctx->ac.i8, lds_size),435"compute_lds", AC_ADDR_SPACE_LDS);436LLVMSetAlignment(var, 64 * 1024);437438ctx->ac.lds = LLVMBuildBitCast(ctx->ac.builder, var, i8p, "");439}440441static bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir)442{443if (nir->info.stage == MESA_SHADER_VERTEX) {444si_llvm_load_vs_inputs(ctx, nir);445} else if (nir->info.stage == MESA_SHADER_FRAGMENT) {446unsigned colors_read = ctx->shader->selector->info.colors_read;447LLVMValueRef main_fn = ctx->main_fn;448449LLVMValueRef undef = LLVMGetUndef(ctx->ac.f32);450451unsigned offset = SI_PARAM_POS_FIXED_PT + 1;452453if (colors_read & 0x0f) {454unsigned mask = colors_read & 0x0f;455LLVMValueRef values[4];456values[0] = mask & 0x1 ? LLVMGetParam(main_fn, offset++) : undef;457values[1] = mask & 0x2 ? LLVMGetParam(main_fn, offset++) : undef;458values[2] = mask & 0x4 ? LLVMGetParam(main_fn, offset++) : undef;459values[3] = mask & 0x8 ? LLVMGetParam(main_fn, offset++) : undef;460ctx->abi.color0 = ac_to_integer(&ctx->ac, ac_build_gather_values(&ctx->ac, values, 4));461}462if (colors_read & 0xf0) {463unsigned mask = (colors_read & 0xf0) >> 4;464LLVMValueRef values[4];465values[0] = mask & 0x1 ? LLVMGetParam(main_fn, offset++) : undef;466values[1] = mask & 0x2 ? LLVMGetParam(main_fn, offset++) : undef;467values[2] = mask & 0x4 ? LLVMGetParam(main_fn, offset++) : undef;468values[3] = mask & 0x8 ? LLVMGetParam(main_fn, offset++) : undef;469ctx->abi.color1 = ac_to_integer(&ctx->ac, ac_build_gather_values(&ctx->ac, values, 4));470}471472ctx->abi.interp_at_sample_force_center =473ctx->shader->key.mono.u.ps.interpolate_at_sample_force_center;474475ctx->abi.kill_ps_if_inf_interp =476ctx->screen->options.no_infinite_interp &&477(ctx->shader->selector->info.uses_persp_center ||478ctx->shader->selector->info.uses_persp_centroid ||479ctx->shader->selector->info.uses_persp_sample);480481} else if (nir->info.stage == MESA_SHADER_COMPUTE) {482if (nir->info.cs.user_data_components_amd) {483ctx->abi.user_data = ac_get_arg(&ctx->ac, ctx->cs_user_data);484ctx->abi.user_data = ac_build_expand_to_vec4(&ctx->ac, ctx->abi.user_data,485nir->info.cs.user_data_components_amd);486}487488if (ctx->shader->selector->info.base.shared_size)489si_llvm_declare_compute_memory(ctx);490}491492ctx->abi.inputs = &ctx->inputs[0];493ctx->abi.clamp_shadow_reference = true;494ctx->abi.robust_buffer_access = true;495ctx->abi.convert_undef_to_zero = true;496ctx->abi.clamp_div_by_zero = ctx->screen->options.clamp_div_by_zero;497ctx->abi.adjust_frag_coord_z = false;498499const struct si_shader_info *info = &ctx->shader->selector->info;500for (unsigned i = 0; i < info->num_outputs; i++) {501LLVMTypeRef type = ctx->ac.f32;502503/* Only FS uses unpacked f16. Other stages pack 16-bit outputs into low and high bits of f32. */504if (nir->info.stage == MESA_SHADER_FRAGMENT &&505nir_alu_type_get_type_size(ctx->shader->selector->info.output_type[i]) == 16)506type = ctx->ac.f16;507508for (unsigned j = 0; j < 4; j++)509ctx->abi.outputs[i * 4 + j] = ac_build_alloca_undef(&ctx->ac, type, "");510}511512ac_nir_translate(&ctx->ac, &ctx->abi, &ctx->args, nir);513514return true;515}516517/**518* Given a list of shader part functions, build a wrapper function that519* runs them in sequence to form a monolithic shader.520*/521void si_build_wrapper_function(struct si_shader_context *ctx, LLVMValueRef *parts,522unsigned num_parts, unsigned main_part,523unsigned next_shader_first_part, bool same_thread_count)524{525LLVMBuilderRef builder = ctx->ac.builder;526/* PS epilog has one arg per color component; gfx9 merged shader527* prologs need to forward 40 SGPRs.528*/529LLVMValueRef initial[AC_MAX_ARGS], out[AC_MAX_ARGS];530LLVMTypeRef function_type;531unsigned num_first_params;532unsigned num_out, initial_num_out;533ASSERTED unsigned num_out_sgpr; /* used in debug checks */534ASSERTED unsigned initial_num_out_sgpr; /* used in debug checks */535unsigned num_sgprs, num_vgprs;536unsigned gprs;537538memset(&ctx->args, 0, sizeof(ctx->args));539540for (unsigned i = 0; i < num_parts; ++i) {541ac_add_function_attr(ctx->ac.context, parts[i], -1, AC_FUNC_ATTR_ALWAYSINLINE);542LLVMSetLinkage(parts[i], LLVMPrivateLinkage);543}544545/* The parameters of the wrapper function correspond to those of the546* first part in terms of SGPRs and VGPRs, but we use the types of the547* main part to get the right types. This is relevant for the548* dereferenceable attribute on descriptor table pointers.549*/550num_sgprs = 0;551num_vgprs = 0;552553function_type = LLVMGetElementType(LLVMTypeOf(parts[0]));554num_first_params = LLVMCountParamTypes(function_type);555556for (unsigned i = 0; i < num_first_params; ++i) {557LLVMValueRef param = LLVMGetParam(parts[0], i);558559if (ac_is_sgpr_param(param)) {560assert(num_vgprs == 0);561num_sgprs += ac_get_type_size(LLVMTypeOf(param)) / 4;562} else {563num_vgprs += ac_get_type_size(LLVMTypeOf(param)) / 4;564}565}566567gprs = 0;568while (gprs < num_sgprs + num_vgprs) {569LLVMValueRef param = LLVMGetParam(parts[main_part], ctx->args.arg_count);570LLVMTypeRef type = LLVMTypeOf(param);571unsigned size = ac_get_type_size(type) / 4;572573/* This is going to get casted anyways, so we don't have to574* have the exact same type. But we do have to preserve the575* pointer-ness so that LLVM knows about it.576*/577enum ac_arg_type arg_type = AC_ARG_INT;578if (LLVMGetTypeKind(type) == LLVMPointerTypeKind) {579type = LLVMGetElementType(type);580581if (LLVMGetTypeKind(type) == LLVMVectorTypeKind) {582if (LLVMGetVectorSize(type) == 4)583arg_type = AC_ARG_CONST_DESC_PTR;584else if (LLVMGetVectorSize(type) == 8)585arg_type = AC_ARG_CONST_IMAGE_PTR;586else587assert(0);588} else if (type == ctx->ac.f32) {589arg_type = AC_ARG_CONST_FLOAT_PTR;590} else {591assert(0);592}593}594595ac_add_arg(&ctx->args, gprs < num_sgprs ? AC_ARG_SGPR : AC_ARG_VGPR, size, arg_type, NULL);596597assert(ac_is_sgpr_param(param) == (gprs < num_sgprs));598assert(gprs + size <= num_sgprs + num_vgprs &&599(gprs >= num_sgprs || gprs + size <= num_sgprs));600601gprs += size;602}603604/* Prepare the return type. */605unsigned num_returns = 0;606LLVMTypeRef returns[AC_MAX_ARGS], last_func_type, return_type;607608last_func_type = LLVMGetElementType(LLVMTypeOf(parts[num_parts - 1]));609return_type = LLVMGetReturnType(last_func_type);610611switch (LLVMGetTypeKind(return_type)) {612case LLVMStructTypeKind:613num_returns = LLVMCountStructElementTypes(return_type);614assert(num_returns <= ARRAY_SIZE(returns));615LLVMGetStructElementTypes(return_type, returns);616break;617case LLVMVoidTypeKind:618break;619default:620unreachable("unexpected type");621}622623si_llvm_create_func(ctx, "wrapper", returns, num_returns,624si_get_max_workgroup_size(ctx->shader));625626if (si_is_merged_shader(ctx->shader) && !same_thread_count)627ac_init_exec_full_mask(&ctx->ac);628629/* Record the arguments of the function as if they were an output of630* a previous part.631*/632num_out = 0;633num_out_sgpr = 0;634635for (unsigned i = 0; i < ctx->args.arg_count; ++i) {636LLVMValueRef param = LLVMGetParam(ctx->main_fn, i);637LLVMTypeRef param_type = LLVMTypeOf(param);638LLVMTypeRef out_type = ctx->args.args[i].file == AC_ARG_SGPR ? ctx->ac.i32 : ctx->ac.f32;639unsigned size = ac_get_type_size(param_type) / 4;640641if (size == 1) {642if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) {643param = LLVMBuildPtrToInt(builder, param, ctx->ac.i32, "");644param_type = ctx->ac.i32;645}646647if (param_type != out_type)648param = LLVMBuildBitCast(builder, param, out_type, "");649out[num_out++] = param;650} else {651LLVMTypeRef vector_type = LLVMVectorType(out_type, size);652653if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) {654param = LLVMBuildPtrToInt(builder, param, ctx->ac.i64, "");655param_type = ctx->ac.i64;656}657658if (param_type != vector_type)659param = LLVMBuildBitCast(builder, param, vector_type, "");660661for (unsigned j = 0; j < size; ++j)662out[num_out++] =663LLVMBuildExtractElement(builder, param, LLVMConstInt(ctx->ac.i32, j, 0), "");664}665666if (ctx->args.args[i].file == AC_ARG_SGPR)667num_out_sgpr = num_out;668}669670memcpy(initial, out, sizeof(out));671initial_num_out = num_out;672initial_num_out_sgpr = num_out_sgpr;673674/* Now chain the parts. */675LLVMValueRef ret = NULL;676for (unsigned part = 0; part < num_parts; ++part) {677LLVMValueRef in[AC_MAX_ARGS];678LLVMTypeRef ret_type;679unsigned out_idx = 0;680unsigned num_params = LLVMCountParams(parts[part]);681682/* Merged shaders are executed conditionally depending683* on the number of enabled threads passed in the input SGPRs. */684if (si_is_multi_part_shader(ctx->shader) && part == 0) {685if (same_thread_count) {686struct ac_arg arg;687arg.arg_index = 3;688arg.used = true;689690si_init_exec_from_input(ctx, arg, 0);691} else {692LLVMValueRef ena, count = initial[3];693694count = LLVMBuildAnd(builder, count, LLVMConstInt(ctx->ac.i32, 0x7f, 0), "");695ena = LLVMBuildICmp(builder, LLVMIntULT, ac_get_thread_id(&ctx->ac), count, "");696ac_build_ifcc(&ctx->ac, ena, 6506);697}698}699700/* Derive arguments for the next part from outputs of the701* previous one.702*/703for (unsigned param_idx = 0; param_idx < num_params; ++param_idx) {704LLVMValueRef param;705LLVMTypeRef param_type;706bool is_sgpr;707unsigned param_size;708LLVMValueRef arg = NULL;709710param = LLVMGetParam(parts[part], param_idx);711param_type = LLVMTypeOf(param);712param_size = ac_get_type_size(param_type) / 4;713is_sgpr = ac_is_sgpr_param(param);714715if (is_sgpr) {716ac_add_function_attr(ctx->ac.context, parts[part], param_idx + 1, AC_FUNC_ATTR_INREG);717} else if (out_idx < num_out_sgpr) {718/* Skip returned SGPRs the current part doesn't719* declare on the input. */720out_idx = num_out_sgpr;721}722723assert(out_idx + param_size <= (is_sgpr ? num_out_sgpr : num_out));724725if (param_size == 1)726arg = out[out_idx];727else728arg = ac_build_gather_values(&ctx->ac, &out[out_idx], param_size);729730if (LLVMTypeOf(arg) != param_type) {731if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) {732if (LLVMGetPointerAddressSpace(param_type) == AC_ADDR_SPACE_CONST_32BIT) {733arg = LLVMBuildBitCast(builder, arg, ctx->ac.i32, "");734arg = LLVMBuildIntToPtr(builder, arg, param_type, "");735} else {736arg = LLVMBuildBitCast(builder, arg, ctx->ac.i64, "");737arg = LLVMBuildIntToPtr(builder, arg, param_type, "");738}739} else {740arg = LLVMBuildBitCast(builder, arg, param_type, "");741}742}743744in[param_idx] = arg;745out_idx += param_size;746}747748ret = ac_build_call(&ctx->ac, parts[part], in, num_params);749750if (!same_thread_count &&751si_is_multi_part_shader(ctx->shader) && part + 1 == next_shader_first_part) {752ac_build_endif(&ctx->ac, 6506);753754/* The second half of the merged shader should use755* the inputs from the toplevel (wrapper) function,756* not the return value from the last call.757*758* That's because the last call was executed condi-759* tionally, so we can't consume it in the main760* block.761*/762memcpy(out, initial, sizeof(initial));763num_out = initial_num_out;764num_out_sgpr = initial_num_out_sgpr;765766/* Execute the second shader conditionally based on the number of767* enabled threads there.768*/769if (ctx->stage == MESA_SHADER_TESS_CTRL) {770LLVMValueRef ena, count = initial[3];771772count = LLVMBuildLShr(builder, count, LLVMConstInt(ctx->ac.i32, 8, 0), "");773count = LLVMBuildAnd(builder, count, LLVMConstInt(ctx->ac.i32, 0x7f, 0), "");774ena = LLVMBuildICmp(builder, LLVMIntULT, ac_get_thread_id(&ctx->ac), count, "");775ac_build_ifcc(&ctx->ac, ena, 6507);776}777continue;778}779780/* Extract the returned GPRs. */781ret_type = LLVMTypeOf(ret);782num_out = 0;783num_out_sgpr = 0;784785if (LLVMGetTypeKind(ret_type) != LLVMVoidTypeKind) {786assert(LLVMGetTypeKind(ret_type) == LLVMStructTypeKind);787788unsigned ret_size = LLVMCountStructElementTypes(ret_type);789790for (unsigned i = 0; i < ret_size; ++i) {791LLVMValueRef val = LLVMBuildExtractValue(builder, ret, i, "");792793assert(num_out < ARRAY_SIZE(out));794out[num_out++] = val;795796if (LLVMTypeOf(val) == ctx->ac.i32) {797assert(num_out_sgpr + 1 == num_out);798num_out_sgpr = num_out;799}800}801}802}803804/* Close the conditional wrapping the second shader. */805if (ctx->stage == MESA_SHADER_TESS_CTRL &&806!same_thread_count && si_is_multi_part_shader(ctx->shader))807ac_build_endif(&ctx->ac, 6507);808809/* Return the value from the last part. It's non-void only for the prim810* discard compute shader.811*/812if (LLVMGetTypeKind(LLVMTypeOf(ret)) == LLVMVoidTypeKind)813LLVMBuildRetVoid(builder);814else815LLVMBuildRet(builder, ret);816}817818bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shader,819struct nir_shader *nir, bool free_nir, bool ngg_cull_shader)820{821struct si_shader_selector *sel = shader->selector;822const struct si_shader_info *info = &sel->info;823824ctx->shader = shader;825ctx->stage = sel->info.stage;826827ctx->num_const_buffers = info->base.num_ubos;828ctx->num_shader_buffers = info->base.num_ssbos;829830ctx->num_samplers = BITSET_LAST_BIT(info->base.textures_used);831ctx->num_images = info->base.num_images;832833si_llvm_init_resource_callbacks(ctx);834835switch (ctx->stage) {836case MESA_SHADER_VERTEX:837si_llvm_init_vs_callbacks(ctx, ngg_cull_shader);838break;839case MESA_SHADER_TESS_CTRL:840si_llvm_init_tcs_callbacks(ctx);841break;842case MESA_SHADER_TESS_EVAL:843si_llvm_init_tes_callbacks(ctx, ngg_cull_shader);844break;845case MESA_SHADER_GEOMETRY:846si_llvm_init_gs_callbacks(ctx);847break;848case MESA_SHADER_FRAGMENT:849si_llvm_init_ps_callbacks(ctx);850break;851case MESA_SHADER_COMPUTE:852ctx->abi.load_local_group_size = si_llvm_get_block_size;853break;854default:855assert(!"Unsupported shader type");856return false;857}858859si_llvm_create_main_func(ctx, ngg_cull_shader);860861if (ctx->shader->key.as_es || ctx->stage == MESA_SHADER_GEOMETRY)862si_preload_esgs_ring(ctx);863864if (ctx->stage == MESA_SHADER_GEOMETRY)865si_preload_gs_rings(ctx);866else if (ctx->stage == MESA_SHADER_TESS_EVAL)867si_llvm_preload_tes_rings(ctx);868869if (ctx->stage == MESA_SHADER_TESS_CTRL && sel->info.tessfactors_are_def_in_all_invocs) {870for (unsigned i = 0; i < 6; i++) {871ctx->invoc0_tess_factors[i] = ac_build_alloca_undef(&ctx->ac, ctx->ac.i32, "");872}873}874875if (ctx->stage == MESA_SHADER_GEOMETRY) {876for (unsigned i = 0; i < 4; i++) {877ctx->gs_next_vertex[i] = ac_build_alloca(&ctx->ac, ctx->ac.i32, "");878}879if (shader->key.as_ngg) {880for (unsigned i = 0; i < 4; ++i) {881ctx->gs_curprim_verts[i] = ac_build_alloca(&ctx->ac, ctx->ac.i32, "");882ctx->gs_generated_prims[i] = ac_build_alloca(&ctx->ac, ctx->ac.i32, "");883}884885assert(!ctx->gs_ngg_scratch);886LLVMTypeRef ai32 = LLVMArrayType(ctx->ac.i32, gfx10_ngg_get_scratch_dw_size(shader));887ctx->gs_ngg_scratch =888LLVMAddGlobalInAddressSpace(ctx->ac.module, ai32, "ngg_scratch", AC_ADDR_SPACE_LDS);889LLVMSetInitializer(ctx->gs_ngg_scratch, LLVMGetUndef(ai32));890LLVMSetAlignment(ctx->gs_ngg_scratch, 4);891892ctx->gs_ngg_emit = LLVMAddGlobalInAddressSpace(893ctx->ac.module, LLVMArrayType(ctx->ac.i32, 0), "ngg_emit", AC_ADDR_SPACE_LDS);894LLVMSetLinkage(ctx->gs_ngg_emit, LLVMExternalLinkage);895LLVMSetAlignment(ctx->gs_ngg_emit, 4);896}897}898899if (ctx->stage != MESA_SHADER_GEOMETRY && (shader->key.as_ngg && !shader->key.as_es)) {900/* Unconditionally declare scratch space base for streamout and901* vertex compaction. Whether space is actually allocated is902* determined during linking / PM4 creation.903*904* Add an extra dword per vertex to ensure an odd stride, which905* avoids bank conflicts for SoA accesses.906*/907if (!gfx10_is_ngg_passthrough(shader))908si_llvm_declare_esgs_ring(ctx);909910/* This is really only needed when streamout and / or vertex911* compaction is enabled.912*/913if (!ctx->gs_ngg_scratch && (sel->so.num_outputs || shader->key.opt.ngg_culling)) {914LLVMTypeRef asi32 = LLVMArrayType(ctx->ac.i32, gfx10_ngg_get_scratch_dw_size(shader));915ctx->gs_ngg_scratch =916LLVMAddGlobalInAddressSpace(ctx->ac.module, asi32, "ngg_scratch", AC_ADDR_SPACE_LDS);917LLVMSetInitializer(ctx->gs_ngg_scratch, LLVMGetUndef(asi32));918LLVMSetAlignment(ctx->gs_ngg_scratch, 4);919}920}921922/* For merged shaders (VS-TCS, VS-GS, TES-GS): */923if (ctx->screen->info.chip_class >= GFX9 && si_is_merged_shader(shader)) {924LLVMValueRef thread_enabled = NULL;925926/* TES is special because it has only 1 shader part if NGG shader culling is disabled,927* and therefore it doesn't use the wrapper function.928*/929bool no_wrapper_func = ctx->stage == MESA_SHADER_TESS_EVAL && !shader->key.as_es &&930!shader->key.opt.ngg_culling;931932/* Set EXEC = ~0 before the first shader. If the prolog is present, EXEC is set there933* instead. For monolithic shaders, the wrapper function does this.934*/935if ((!shader->is_monolithic || no_wrapper_func) &&936(ctx->stage == MESA_SHADER_TESS_EVAL ||937(ctx->stage == MESA_SHADER_VERTEX &&938!si_vs_needs_prolog(sel, &shader->key.part.vs.prolog, &shader->key, ngg_cull_shader))))939ac_init_exec_full_mask(&ctx->ac);940941/* NGG VS and NGG TES: Send gs_alloc_req and the prim export at the beginning to decrease942* register usage.943*/944if ((ctx->stage == MESA_SHADER_VERTEX || ctx->stage == MESA_SHADER_TESS_EVAL) &&945shader->key.as_ngg && !shader->key.as_es && !shader->key.opt.ngg_culling) {946/* GFX10 requires a barrier before gs_alloc_req due to a hw bug. */947if (ctx->screen->info.chip_class == GFX10)948ac_build_s_barrier(&ctx->ac);949950gfx10_ngg_build_sendmsg_gs_alloc_req(ctx);951952/* Build the primitive export at the beginning953* of the shader if possible.954*/955if (gfx10_ngg_export_prim_early(shader))956gfx10_ngg_build_export_prim(ctx, NULL, NULL);957}958959/* NGG GS: Initialize LDS and insert s_barrier, which must not be inside the if statement. */960if (ctx->stage == MESA_SHADER_GEOMETRY && shader->key.as_ngg)961gfx10_ngg_gs_emit_prologue(ctx);962963if (ctx->stage == MESA_SHADER_GEOMETRY ||964(ctx->stage == MESA_SHADER_TESS_CTRL && !shader->is_monolithic)) {965/* Wrap both shaders in an if statement according to the number of enabled threads966* there. For monolithic TCS, the if statement is inserted by the wrapper function,967* not here.968*/969thread_enabled = si_is_gs_thread(ctx); /* 2nd shader: thread enabled bool */970} else if (((shader->key.as_ls || shader->key.as_es) && !shader->is_monolithic) ||971(shader->key.as_ngg && !shader->key.as_es)) {972/* This is NGG VS or NGG TES or VS before GS or TES before GS or VS before TCS.973* For monolithic LS (VS before TCS) and ES (VS before GS and TES before GS),974* the if statement is inserted by the wrapper function.975*/976thread_enabled = si_is_es_thread(ctx); /* 1st shader: thread enabled bool */977}978979if (thread_enabled) {980ctx->merged_wrap_if_entry_block = LLVMGetInsertBlock(ctx->ac.builder);981ctx->merged_wrap_if_label = 11500;982ac_build_ifcc(&ctx->ac, thread_enabled, ctx->merged_wrap_if_label);983}984985/* Execute a barrier before the second shader in986* a merged shader.987*988* Execute the barrier inside the conditional block,989* so that empty waves can jump directly to s_endpgm,990* which will also signal the barrier.991*992* This is possible in gfx9, because an empty wave993* for the second shader does not participate in994* the epilogue. With NGG, empty waves may still995* be required to export data (e.g. GS output vertices),996* so we cannot let them exit early.997*998* If the shader is TCS and the TCS epilog is present999* and contains a barrier, it will wait there and then1000* reach s_endpgm.1001*/1002if (ctx->stage == MESA_SHADER_TESS_CTRL) {1003/* We need the barrier only if TCS inputs are read from LDS. */1004if (!shader->key.opt.same_patch_vertices ||1005shader->selector->info.base.inputs_read &1006~shader->selector->tcs_vgpr_only_inputs)1007ac_build_s_barrier(&ctx->ac);1008} else if (ctx->stage == MESA_SHADER_GEOMETRY && !shader->key.as_ngg) {1009/* gfx10_ngg_gs_emit_prologue inserts the barrier for NGG. */1010ac_build_s_barrier(&ctx->ac);1011}1012}10131014bool success = si_nir_build_llvm(ctx, nir);1015if (free_nir)1016ralloc_free(nir);1017if (!success) {1018fprintf(stderr, "Failed to translate shader from NIR to LLVM\n");1019return false;1020}10211022si_llvm_build_ret(ctx, ctx->return_value);1023return true;1024}10251026static bool si_should_optimize_less(struct ac_llvm_compiler *compiler,1027struct si_shader_selector *sel)1028{1029if (!compiler->low_opt_passes)1030return false;10311032/* Assume a slow CPU. */1033assert(!sel->screen->info.has_dedicated_vram && sel->screen->info.chip_class <= GFX8);10341035/* For a crazy dEQP test containing 2597 memory opcodes, mostly1036* buffer stores. */1037return sel->info.stage == MESA_SHADER_COMPUTE && sel->info.num_memory_stores > 1000;1038}10391040static void si_optimize_vs_outputs(struct si_shader_context *ctx)1041{1042struct si_shader *shader = ctx->shader;1043struct si_shader_info *info = &shader->selector->info;1044unsigned skip_vs_optim_mask = 0;10451046if ((ctx->stage != MESA_SHADER_VERTEX && ctx->stage != MESA_SHADER_TESS_EVAL) ||1047shader->key.as_ls || shader->key.as_es)1048return;10491050/* Optimizing these outputs is not possible, since they might be overriden1051* at runtime with S_028644_PT_SPRITE_TEX. */1052for (int i = 0; i < info->num_outputs; i++) {1053if (info->output_semantic[i] == VARYING_SLOT_PNTC ||1054(info->output_semantic[i] >= VARYING_SLOT_TEX0 &&1055info->output_semantic[i] <= VARYING_SLOT_TEX7)) {1056skip_vs_optim_mask |= 1u << shader->info.vs_output_param_offset[i];1057}1058}10591060ac_optimize_vs_outputs(&ctx->ac, ctx->main_fn, shader->info.vs_output_param_offset,1061info->num_outputs, skip_vs_optim_mask,1062&shader->info.nr_param_exports);1063}10641065bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compiler,1066struct si_shader *shader, struct pipe_debug_callback *debug,1067struct nir_shader *nir, bool free_nir)1068{1069struct si_shader_selector *sel = shader->selector;1070struct si_shader_context ctx;10711072si_llvm_context_init(&ctx, sscreen, compiler, si_get_shader_wave_size(shader));10731074LLVMValueRef ngg_cull_main_fn = NULL;1075if (shader->key.opt.ngg_culling) {1076if (!si_llvm_translate_nir(&ctx, shader, nir, false, true)) {1077si_llvm_dispose(&ctx);1078return false;1079}1080ngg_cull_main_fn = ctx.main_fn;1081ctx.main_fn = NULL;1082}10831084if (!si_llvm_translate_nir(&ctx, shader, nir, free_nir, false)) {1085si_llvm_dispose(&ctx);1086return false;1087}10881089if (shader->is_monolithic && ctx.stage == MESA_SHADER_VERTEX) {1090LLVMValueRef parts[4];1091unsigned num_parts = 0;1092bool first_is_prolog = false;1093LLVMValueRef main_fn = ctx.main_fn;10941095if (ngg_cull_main_fn) {1096if (si_vs_needs_prolog(sel, &shader->key.part.vs.prolog, &shader->key, true)) {1097union si_shader_part_key prolog_key;1098si_get_vs_prolog_key(&sel->info, shader->info.num_input_sgprs, true,1099&shader->key.part.vs.prolog, shader, &prolog_key);1100prolog_key.vs_prolog.is_monolithic = true;1101si_llvm_build_vs_prolog(&ctx, &prolog_key);1102parts[num_parts++] = ctx.main_fn;1103first_is_prolog = true;1104}1105parts[num_parts++] = ngg_cull_main_fn;1106}11071108if (si_vs_needs_prolog(sel, &shader->key.part.vs.prolog, &shader->key, false)) {1109union si_shader_part_key prolog_key;1110si_get_vs_prolog_key(&sel->info, shader->info.num_input_sgprs, false,1111&shader->key.part.vs.prolog, shader, &prolog_key);1112prolog_key.vs_prolog.is_monolithic = true;1113si_llvm_build_vs_prolog(&ctx, &prolog_key);1114parts[num_parts++] = ctx.main_fn;1115if (num_parts == 1)1116first_is_prolog = true;1117}1118parts[num_parts++] = main_fn;11191120si_build_wrapper_function(&ctx, parts, num_parts, first_is_prolog ? 1 : 0, 0, false);11211122if (ctx.shader->key.opt.vs_as_prim_discard_cs)1123si_build_prim_discard_compute_shader(&ctx);1124} else if (shader->is_monolithic && ctx.stage == MESA_SHADER_TESS_EVAL && ngg_cull_main_fn) {1125LLVMValueRef parts[3], prolog, main_fn = ctx.main_fn;11261127/* We reuse the VS prolog code for TES just to load the input VGPRs from LDS. */1128union si_shader_part_key prolog_key;1129memset(&prolog_key, 0, sizeof(prolog_key));1130prolog_key.vs_prolog.num_input_sgprs = shader->info.num_input_sgprs;1131prolog_key.vs_prolog.num_merged_next_stage_vgprs = 5;1132prolog_key.vs_prolog.as_ngg = 1;1133prolog_key.vs_prolog.load_vgprs_after_culling = 1;1134prolog_key.vs_prolog.is_monolithic = true;1135si_llvm_build_vs_prolog(&ctx, &prolog_key);1136prolog = ctx.main_fn;11371138parts[0] = ngg_cull_main_fn;1139parts[1] = prolog;1140parts[2] = main_fn;11411142si_build_wrapper_function(&ctx, parts, 3, 0, 0, false);1143} else if (shader->is_monolithic && ctx.stage == MESA_SHADER_TESS_CTRL) {1144if (sscreen->info.chip_class >= GFX9) {1145struct si_shader_selector *ls = shader->key.part.tcs.ls;1146LLVMValueRef parts[4];1147bool vs_needs_prolog =1148si_vs_needs_prolog(ls, &shader->key.part.tcs.ls_prolog, &shader->key, false);11491150/* TCS main part */1151parts[2] = ctx.main_fn;11521153/* TCS epilog */1154union si_shader_part_key tcs_epilog_key;1155memset(&tcs_epilog_key, 0, sizeof(tcs_epilog_key));1156tcs_epilog_key.tcs_epilog.states = shader->key.part.tcs.epilog;1157si_llvm_build_tcs_epilog(&ctx, &tcs_epilog_key);1158parts[3] = ctx.main_fn;11591160/* VS as LS main part */1161ctx.next_shader_sel = ctx.shader->selector;1162nir = si_get_nir_shader(ls, NULL, &free_nir);1163struct si_shader shader_ls = {};1164shader_ls.selector = ls;1165shader_ls.key.as_ls = 1;1166shader_ls.key.mono = shader->key.mono;1167shader_ls.key.opt = shader->key.opt;1168shader_ls.is_monolithic = true;11691170if (!si_llvm_translate_nir(&ctx, &shader_ls, nir, free_nir, false)) {1171si_llvm_dispose(&ctx);1172return false;1173}1174shader->info.uses_instanceid |= ls->info.uses_instanceid;1175parts[1] = ctx.main_fn;11761177/* LS prolog */1178if (vs_needs_prolog) {1179union si_shader_part_key vs_prolog_key;1180si_get_vs_prolog_key(&ls->info, shader_ls.info.num_input_sgprs, false,1181&shader->key.part.tcs.ls_prolog, shader, &vs_prolog_key);1182vs_prolog_key.vs_prolog.is_monolithic = true;1183si_llvm_build_vs_prolog(&ctx, &vs_prolog_key);1184parts[0] = ctx.main_fn;1185}11861187/* Reset the shader context. */1188ctx.shader = shader;1189ctx.stage = MESA_SHADER_TESS_CTRL;11901191si_build_wrapper_function(&ctx, parts + !vs_needs_prolog, 4 - !vs_needs_prolog,1192vs_needs_prolog, vs_needs_prolog ? 2 : 1,1193shader->key.opt.same_patch_vertices);1194} else {1195LLVMValueRef parts[2];1196union si_shader_part_key epilog_key;11971198parts[0] = ctx.main_fn;11991200memset(&epilog_key, 0, sizeof(epilog_key));1201epilog_key.tcs_epilog.states = shader->key.part.tcs.epilog;1202si_llvm_build_tcs_epilog(&ctx, &epilog_key);1203parts[1] = ctx.main_fn;12041205si_build_wrapper_function(&ctx, parts, 2, 0, 0, false);1206}1207} else if (shader->is_monolithic && ctx.stage == MESA_SHADER_GEOMETRY) {1208if (ctx.screen->info.chip_class >= GFX9) {1209struct si_shader_selector *es = shader->key.part.gs.es;1210LLVMValueRef es_prolog = NULL;1211LLVMValueRef es_main = NULL;1212LLVMValueRef gs_prolog = NULL;1213LLVMValueRef gs_main = ctx.main_fn;12141215/* GS prolog */1216union si_shader_part_key gs_prolog_key;1217memset(&gs_prolog_key, 0, sizeof(gs_prolog_key));1218gs_prolog_key.gs_prolog.states = shader->key.part.gs.prolog;1219gs_prolog_key.gs_prolog.as_ngg = shader->key.as_ngg;1220si_llvm_build_gs_prolog(&ctx, &gs_prolog_key);1221gs_prolog = ctx.main_fn;12221223/* ES main part */1224nir = si_get_nir_shader(es, NULL, &free_nir);1225struct si_shader shader_es = {};1226shader_es.selector = es;1227shader_es.key.as_es = 1;1228shader_es.key.as_ngg = shader->key.as_ngg;1229shader_es.key.mono = shader->key.mono;1230shader_es.key.opt = shader->key.opt;1231shader_es.is_monolithic = true;12321233if (!si_llvm_translate_nir(&ctx, &shader_es, nir, free_nir, false)) {1234si_llvm_dispose(&ctx);1235return false;1236}1237shader->info.uses_instanceid |= es->info.uses_instanceid;1238es_main = ctx.main_fn;12391240/* ES prolog */1241if (es->info.stage == MESA_SHADER_VERTEX &&1242si_vs_needs_prolog(es, &shader->key.part.gs.vs_prolog, &shader->key, false)) {1243union si_shader_part_key vs_prolog_key;1244si_get_vs_prolog_key(&es->info, shader_es.info.num_input_sgprs, false,1245&shader->key.part.gs.vs_prolog, shader, &vs_prolog_key);1246vs_prolog_key.vs_prolog.is_monolithic = true;1247si_llvm_build_vs_prolog(&ctx, &vs_prolog_key);1248es_prolog = ctx.main_fn;1249}12501251/* Reset the shader context. */1252ctx.shader = shader;1253ctx.stage = MESA_SHADER_GEOMETRY;12541255/* Prepare the array of shader parts. */1256LLVMValueRef parts[4];1257unsigned num_parts = 0, main_part, next_first_part;12581259if (es_prolog)1260parts[num_parts++] = es_prolog;12611262parts[main_part = num_parts++] = es_main;1263parts[next_first_part = num_parts++] = gs_prolog;1264parts[num_parts++] = gs_main;12651266si_build_wrapper_function(&ctx, parts, num_parts, main_part, next_first_part, false);1267} else {1268LLVMValueRef parts[2];1269union si_shader_part_key prolog_key;12701271parts[1] = ctx.main_fn;12721273memset(&prolog_key, 0, sizeof(prolog_key));1274prolog_key.gs_prolog.states = shader->key.part.gs.prolog;1275si_llvm_build_gs_prolog(&ctx, &prolog_key);1276parts[0] = ctx.main_fn;12771278si_build_wrapper_function(&ctx, parts, 2, 1, 0, false);1279}1280} else if (shader->is_monolithic && ctx.stage == MESA_SHADER_FRAGMENT) {1281si_llvm_build_monolithic_ps(&ctx, shader);1282}12831284si_llvm_optimize_module(&ctx);12851286/* Post-optimization transformations and analysis. */1287si_optimize_vs_outputs(&ctx);12881289if ((debug && debug->debug_message) || si_can_dump_shader(sscreen, ctx.stage)) {1290ctx.shader->info.private_mem_vgprs = ac_count_scratch_private_memory(ctx.main_fn);1291}12921293/* Make sure the input is a pointer and not integer followed by inttoptr. */1294if (!shader->key.opt.vs_as_prim_discard_cs)1295assert(LLVMGetTypeKind(LLVMTypeOf(LLVMGetParam(ctx.main_fn, 0))) == LLVMPointerTypeKind);12961297/* Compile to bytecode. */1298if (!si_compile_llvm(sscreen, &shader->binary, &shader->config, compiler, &ctx.ac, debug,1299ctx.stage, si_get_shader_name(shader),1300si_should_optimize_less(compiler, shader->selector))) {1301si_llvm_dispose(&ctx);1302fprintf(stderr, "LLVM failed to compile shader\n");1303return false;1304}13051306si_llvm_dispose(&ctx);1307return true;1308}130913101311