• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Advanced Micro Devices, Inc.
3  *
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #include "ac_nir.h"
8 #include "ac_nir_to_llvm.h"
9 #include "ac_rtld.h"
10 #include "si_pipe.h"
11 #include "si_shader_internal.h"
12 #include "si_shader_llvm.h"
13 #include "sid.h"
14 #include "util/u_memory.h"
15 #include "util/u_prim.h"
16 
17 struct si_llvm_diagnostics {
18    struct util_debug_callback *debug;
19    unsigned retval;
20 };
21 
si_diagnostic_handler(LLVMDiagnosticInfoRef di,void * context)22 static void si_diagnostic_handler(LLVMDiagnosticInfoRef di, void *context)
23 {
24    struct si_llvm_diagnostics *diag = (struct si_llvm_diagnostics *)context;
25    LLVMDiagnosticSeverity severity = LLVMGetDiagInfoSeverity(di);
26    const char *severity_str = NULL;
27 
28    switch (severity) {
29    case LLVMDSError:
30       severity_str = "error";
31       break;
32    case LLVMDSWarning:
33       severity_str = "warning";
34       break;
35    case LLVMDSRemark:
36    case LLVMDSNote:
37    default:
38       return;
39    }
40 
41    char *description = LLVMGetDiagInfoDescription(di);
42 
43    util_debug_message(diag->debug, SHADER_INFO, "LLVM diagnostic (%s): %s", severity_str,
44                       description);
45 
46    if (severity == LLVMDSError) {
47       diag->retval = 1;
48       fprintf(stderr, "LLVM triggered Diagnostic Handler: %s\n", description);
49    }
50 
51    LLVMDisposeMessage(description);
52 }
53 
si_compile_llvm(struct si_screen * sscreen,struct si_shader_binary * binary,struct ac_shader_config * conf,struct ac_llvm_compiler * compiler,struct ac_llvm_context * ac,struct util_debug_callback * debug,gl_shader_stage stage,const char * name)54 static bool si_compile_llvm(struct si_screen *sscreen, struct si_shader_binary *binary,
55                             struct ac_shader_config *conf, struct ac_llvm_compiler *compiler,
56                             struct ac_llvm_context *ac, struct util_debug_callback *debug,
57                             gl_shader_stage stage, const char *name)
58 {
59    unsigned count = p_atomic_inc_return(&sscreen->num_compilations);
60 
61    if (si_can_dump_shader(sscreen, stage, SI_DUMP_LLVM_IR)) {
62       fprintf(stderr, "radeonsi: Compiling shader %d\n", count);
63 
64       fprintf(stderr, "%s LLVM IR:\n\n", name);
65       ac_dump_module(ac->module);
66       fprintf(stderr, "\n");
67    }
68 
69    if (sscreen->record_llvm_ir) {
70       char *ir = LLVMPrintModuleToString(ac->module);
71       binary->llvm_ir_string = strdup(ir);
72       LLVMDisposeMessage(ir);
73    }
74 
75    if (!si_replace_shader(count, binary)) {
76       struct ac_backend_optimizer *beo = compiler->beo;
77 
78       struct si_llvm_diagnostics diag = {debug};
79       LLVMContextSetDiagnosticHandler(ac->context, si_diagnostic_handler, &diag);
80 
81       if (!ac_compile_module_to_elf(beo, ac->module, (char **)&binary->code_buffer,
82                                     &binary->code_size))
83          diag.retval = 1;
84 
85       if (diag.retval != 0) {
86          util_debug_message(debug, SHADER_INFO, "LLVM compilation failed");
87          return false;
88       }
89 
90       binary->type = SI_SHADER_BINARY_ELF;
91    }
92 
93    struct ac_rtld_binary rtld;
94    if (!ac_rtld_open(&rtld, (struct ac_rtld_open_info){
95                                .info = &sscreen->info,
96                                .shader_type = stage,
97                                .wave_size = ac->wave_size,
98                                .num_parts = 1,
99                                .elf_ptrs = &binary->code_buffer,
100                                .elf_sizes = &binary->code_size}))
101       return false;
102 
103    bool ok = ac_rtld_read_config(&sscreen->info, &rtld, conf);
104    ac_rtld_close(&rtld);
105    return ok;
106 }
107 
si_llvm_context_init(struct si_shader_context * ctx,struct si_screen * sscreen,struct ac_llvm_compiler * compiler,unsigned wave_size,bool exports_color_null,bool exports_mrtz,enum ac_float_mode float_mode)108 static void si_llvm_context_init(struct si_shader_context *ctx, struct si_screen *sscreen,
109                                  struct ac_llvm_compiler *compiler, unsigned wave_size,
110                                  bool exports_color_null, bool exports_mrtz,
111                                  enum ac_float_mode float_mode)
112 {
113    memset(ctx, 0, sizeof(*ctx));
114    ctx->screen = sscreen;
115    ctx->compiler = compiler;
116 
117    ac_llvm_context_init(&ctx->ac, compiler, &sscreen->info, float_mode,
118                         wave_size, 64, exports_color_null, exports_mrtz);
119 }
120 
si_llvm_create_func(struct si_shader_context * ctx,const char * name,LLVMTypeRef * return_types,unsigned num_return_elems,unsigned max_workgroup_size)121 void si_llvm_create_func(struct si_shader_context *ctx, const char *name, LLVMTypeRef *return_types,
122                          unsigned num_return_elems, unsigned max_workgroup_size)
123 {
124    LLVMTypeRef ret_type;
125    enum ac_llvm_calling_convention call_conv;
126 
127    if (num_return_elems)
128       ret_type = LLVMStructTypeInContext(ctx->ac.context, return_types, num_return_elems, true);
129    else
130       ret_type = ctx->ac.voidt;
131 
132    gl_shader_stage real_stage = ctx->stage;
133 
134    /* LS is merged into HS (TCS), and ES is merged into GS. */
135    if (ctx->screen->info.gfx_level >= GFX9 && ctx->stage <= MESA_SHADER_GEOMETRY) {
136       if (ctx->shader->key.ge.as_ls)
137          real_stage = MESA_SHADER_TESS_CTRL;
138       else if (ctx->shader->key.ge.as_es || ctx->shader->key.ge.as_ngg)
139          real_stage = MESA_SHADER_GEOMETRY;
140    }
141 
142    switch (real_stage) {
143    case MESA_SHADER_VERTEX:
144    case MESA_SHADER_TESS_EVAL:
145       call_conv = AC_LLVM_AMDGPU_VS;
146       break;
147    case MESA_SHADER_TESS_CTRL:
148       call_conv = AC_LLVM_AMDGPU_HS;
149       break;
150    case MESA_SHADER_GEOMETRY:
151       call_conv = AC_LLVM_AMDGPU_GS;
152       break;
153    case MESA_SHADER_FRAGMENT:
154       call_conv = AC_LLVM_AMDGPU_PS;
155       break;
156    case MESA_SHADER_COMPUTE:
157    case MESA_SHADER_KERNEL:
158       call_conv = AC_LLVM_AMDGPU_CS;
159       break;
160    default:
161       unreachable("Unhandle shader type");
162    }
163 
164    /* Setup the function */
165    ctx->return_type = ret_type;
166    ctx->main_fn = ac_build_main(&ctx->args->ac, &ctx->ac, call_conv, name, ret_type, ctx->ac.module);
167    ctx->return_value = LLVMGetUndef(ctx->return_type);
168 
169    if (ctx->screen->info.address32_hi) {
170       ac_llvm_add_target_dep_function_attr(ctx->main_fn.value, "amdgpu-32bit-address-high-bits",
171                                            ctx->screen->info.address32_hi);
172    }
173 
174    if (ctx->screen->info.gfx_level < GFX12 && ctx->stage <= MESA_SHADER_GEOMETRY &&
175        ctx->shader->key.ge.as_ngg && si_shader_uses_streamout(ctx->shader))
176       ac_llvm_add_target_dep_function_attr(ctx->main_fn.value, "amdgpu-gds-size", 256);
177 
178    ac_llvm_set_workgroup_size(ctx->main_fn.value, max_workgroup_size);
179    ac_llvm_set_target_features(ctx->main_fn.value, &ctx->ac, false);
180 }
181 
si_llvm_create_main_func(struct si_shader_context * ctx)182 static void si_llvm_create_main_func(struct si_shader_context *ctx)
183 {
184    struct si_shader *shader = ctx->shader;
185    LLVMTypeRef returns[AC_MAX_ARGS];
186    unsigned i;
187 
188    for (i = 0; i < ctx->args->ac.num_sgprs_returned; i++)
189       returns[i] = ctx->ac.i32; /* SGPR */
190    for (; i < ctx->args->ac.return_count; i++)
191       returns[i] = ctx->ac.f32; /* VGPR */
192 
193    si_llvm_create_func(ctx, "main", returns, ctx->args->ac.return_count,
194                        si_get_max_workgroup_size(shader));
195 
196    /* Reserve register locations for VGPR inputs the PS prolog may need. */
197    if (ctx->stage == MESA_SHADER_FRAGMENT && !ctx->shader->is_monolithic) {
198       ac_llvm_add_target_dep_function_attr(
199          ctx->main_fn.value, "InitialPSInputAddr", SI_SPI_PS_INPUT_ADDR_FOR_PROLOG);
200    }
201 
202 
203    if (ctx->stage <= MESA_SHADER_GEOMETRY &&
204        (shader->key.ge.as_ls || ctx->stage == MESA_SHADER_TESS_CTRL)) {
205       /* The LSHS size is not known until draw time, so we append it
206        * at the end of whatever LDS use there may be in the rest of
207        * the shader (currently none, unless LLVM decides to do its
208        * own LDS-based lowering).
209        */
210       ctx->ac.lds = (struct ac_llvm_pointer) {
211          .value = LLVMAddGlobalInAddressSpace(ctx->ac.module, LLVMArrayType(ctx->ac.i32, 0),
212                                                 "__lds_end", AC_ADDR_SPACE_LDS),
213          .pointee_type = LLVMArrayType(ctx->ac.i32, 0)
214       };
215       LLVMSetAlignment(ctx->ac.lds.value, 256);
216    }
217 }
218 
si_llvm_optimize_module(struct si_shader_context * ctx)219 static void si_llvm_optimize_module(struct si_shader_context *ctx)
220 {
221    /* Dump LLVM IR before any optimization passes */
222    if (si_can_dump_shader(ctx->screen, ctx->stage, SI_DUMP_INIT_LLVM_IR))
223       ac_dump_module(ctx->ac.module);
224 
225    /* Run the pass */
226    ac_llvm_optimize_module(ctx->compiler->meo, ctx->ac.module);
227 }
228 
si_llvm_dispose(struct si_shader_context * ctx)229 static void si_llvm_dispose(struct si_shader_context *ctx)
230 {
231    LLVMDisposeModule(ctx->ac.module);
232    LLVMContextDispose(ctx->ac.context);
233    ac_llvm_context_dispose(&ctx->ac);
234 }
235 
236 /**
237  * Load a dword from a constant buffer.
238  */
si_buffer_load_const(struct si_shader_context * ctx,LLVMValueRef resource,LLVMValueRef offset)239 LLVMValueRef si_buffer_load_const(struct si_shader_context *ctx, LLVMValueRef resource,
240                                   LLVMValueRef offset)
241 {
242    return ac_build_buffer_load(&ctx->ac, resource, 1, NULL, offset, NULL, ctx->ac.f32,
243                                0, true, true);
244 }
245 
si_llvm_build_ret(struct si_shader_context * ctx,LLVMValueRef ret)246 void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret)
247 {
248    if (LLVMGetTypeKind(LLVMTypeOf(ret)) == LLVMVoidTypeKind)
249       LLVMBuildRetVoid(ctx->ac.builder);
250    else
251       LLVMBuildRet(ctx->ac.builder, ret);
252 }
253 
si_insert_input_ret(struct si_shader_context * ctx,LLVMValueRef ret,struct ac_arg param,unsigned return_index)254 LLVMValueRef si_insert_input_ret(struct si_shader_context *ctx, LLVMValueRef ret,
255                                  struct ac_arg param, unsigned return_index)
256 {
257    return LLVMBuildInsertValue(ctx->ac.builder, ret, ac_get_arg(&ctx->ac, param), return_index, "");
258 }
259 
si_insert_input_ret_float(struct si_shader_context * ctx,LLVMValueRef ret,struct ac_arg param,unsigned return_index)260 LLVMValueRef si_insert_input_ret_float(struct si_shader_context *ctx, LLVMValueRef ret,
261                                        struct ac_arg param, unsigned return_index)
262 {
263    LLVMBuilderRef builder = ctx->ac.builder;
264    LLVMValueRef p = ac_get_arg(&ctx->ac, param);
265 
266    return LLVMBuildInsertValue(builder, ret, ac_to_float(&ctx->ac, p), return_index, "");
267 }
268 
si_insert_input_ptr(struct si_shader_context * ctx,LLVMValueRef ret,struct ac_arg param,unsigned return_index)269 LLVMValueRef si_insert_input_ptr(struct si_shader_context *ctx, LLVMValueRef ret,
270                                  struct ac_arg param, unsigned return_index)
271 {
272    LLVMBuilderRef builder = ctx->ac.builder;
273    LLVMValueRef ptr = ac_get_arg(&ctx->ac, param);
274    ptr = LLVMBuildPtrToInt(builder, ptr, ctx->ac.i32, "");
275    return LLVMBuildInsertValue(builder, ret, ptr, return_index, "");
276 }
277 
si_prolog_get_internal_binding_slot(struct si_shader_context * ctx,unsigned slot)278 LLVMValueRef si_prolog_get_internal_binding_slot(struct si_shader_context *ctx, unsigned slot)
279 {
280    LLVMValueRef list = LLVMBuildIntToPtr(
281       ctx->ac.builder, ac_get_arg(&ctx->ac, ctx->args->internal_bindings),
282       ac_array_in_const32_addr_space(ctx->ac.v4i32), "");
283    LLVMValueRef index = LLVMConstInt(ctx->ac.i32, slot, 0);
284 
285    return ac_build_load_to_sgpr(&ctx->ac,
286                                 (struct ac_llvm_pointer) { .t = ctx->ac.v4i32, .v = list },
287                                 index);
288 }
289 
290 /* Ensure that the esgs ring is declared.
291  *
292  * We declare it with 64KB alignment as a hint that the
293  * pointer value will always be 0.
294  */
si_llvm_declare_lds_esgs_ring(struct si_shader_context * ctx)295 static void si_llvm_declare_lds_esgs_ring(struct si_shader_context *ctx)
296 {
297    if (ctx->ac.lds.value)
298       return;
299 
300    assert(!LLVMGetNamedGlobal(ctx->ac.module, "esgs_ring"));
301 
302    LLVMValueRef esgs_ring =
303       LLVMAddGlobalInAddressSpace(ctx->ac.module, LLVMArrayType(ctx->ac.i32, 0),
304                                   "esgs_ring", AC_ADDR_SPACE_LDS);
305    LLVMSetLinkage(esgs_ring, LLVMExternalLinkage);
306    LLVMSetAlignment(esgs_ring, 64 * 1024);
307 
308    ctx->ac.lds.value = esgs_ring;
309    ctx->ac.lds.pointee_type = ctx->ac.i32;
310 }
311 
si_init_exec_from_input(struct si_shader_context * ctx,struct ac_arg param,unsigned bitoffset)312 static void si_init_exec_from_input(struct si_shader_context *ctx, struct ac_arg param,
313                                     unsigned bitoffset)
314 {
315    LLVMValueRef args[] = {
316       ac_get_arg(&ctx->ac, param),
317       LLVMConstInt(ctx->ac.i32, bitoffset, 0),
318    };
319    ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.init.exec.from.input", ctx->ac.voidt, args, 2, 0);
320 }
321 
322 /**
323  * Get the value of a shader input parameter and extract a bitfield.
324  */
unpack_llvm_param(struct si_shader_context * ctx,LLVMValueRef value,unsigned rshift,unsigned bitwidth)325 static LLVMValueRef unpack_llvm_param(struct si_shader_context *ctx, LLVMValueRef value,
326                                       unsigned rshift, unsigned bitwidth)
327 {
328    if (LLVMGetTypeKind(LLVMTypeOf(value)) == LLVMFloatTypeKind)
329       value = ac_to_integer(&ctx->ac, value);
330 
331    if (rshift)
332       value = LLVMBuildLShr(ctx->ac.builder, value, LLVMConstInt(ctx->ac.i32, rshift, 0), "");
333 
334    if (rshift + bitwidth < 32) {
335       unsigned mask = (1 << bitwidth) - 1;
336       value = LLVMBuildAnd(ctx->ac.builder, value, LLVMConstInt(ctx->ac.i32, mask, 0), "");
337    }
338 
339    return value;
340 }
341 
si_unpack_param(struct si_shader_context * ctx,struct ac_arg param,unsigned rshift,unsigned bitwidth)342 LLVMValueRef si_unpack_param(struct si_shader_context *ctx, struct ac_arg param, unsigned rshift,
343                              unsigned bitwidth)
344 {
345    LLVMValueRef value = ac_get_arg(&ctx->ac, param);
346 
347    return unpack_llvm_param(ctx, value, rshift, bitwidth);
348 }
349 
si_llvm_declare_compute_memory(struct si_shader_context * ctx)350 static void si_llvm_declare_compute_memory(struct si_shader_context *ctx)
351 {
352    struct si_shader_selector *sel = ctx->shader->selector;
353    unsigned lds_size = sel->info.base.shared_size;
354 
355    LLVMTypeRef i8p = LLVMPointerType(ctx->ac.i8, AC_ADDR_SPACE_LDS);
356    LLVMValueRef var;
357 
358    assert(!ctx->ac.lds.value);
359 
360    LLVMTypeRef type = LLVMArrayType(ctx->ac.i8, lds_size);
361    var = LLVMAddGlobalInAddressSpace(ctx->ac.module, type,
362                                      "compute_lds", AC_ADDR_SPACE_LDS);
363    LLVMSetAlignment(var, 64 * 1024);
364 
365    ctx->ac.lds = (struct ac_llvm_pointer) {
366       .value = LLVMBuildBitCast(ctx->ac.builder, var, i8p, ""),
367       .pointee_type = type,
368    };
369 }
370 
371 /**
372  * Given two parts (LS/HS or ES/GS) of a merged shader, build a wrapper function that
373  * runs them in sequence to form a monolithic shader.
374  */
si_build_wrapper_function(struct si_shader_context * ctx,struct ac_llvm_pointer parts[2],bool same_thread_count)375 static void si_build_wrapper_function(struct si_shader_context *ctx,
376                                       struct ac_llvm_pointer parts[2],
377                                       bool same_thread_count)
378 {
379    LLVMBuilderRef builder = ctx->ac.builder;
380 
381    for (unsigned i = 0; i < 2; ++i) {
382       ac_add_function_attr(ctx->ac.context, parts[i].value, -1, "alwaysinline");
383       LLVMSetLinkage(parts[i].value, LLVMPrivateLinkage);
384    }
385 
386    si_llvm_create_func(ctx, "wrapper", NULL, 0, si_get_max_workgroup_size(ctx->shader));
387 
388    if (same_thread_count) {
389       si_init_exec_from_input(ctx, ctx->args->ac.merged_wave_info, 0);
390    } else {
391       ac_init_exec_full_mask(&ctx->ac);
392 
393       LLVMValueRef count = ac_get_arg(&ctx->ac, ctx->args->ac.merged_wave_info);
394       count = LLVMBuildAnd(builder, count, LLVMConstInt(ctx->ac.i32, 0x7f, 0), "");
395 
396       LLVMValueRef ena = LLVMBuildICmp(builder, LLVMIntULT, ac_get_thread_id(&ctx->ac), count, "");
397       ac_build_ifcc(&ctx->ac, ena, 6506);
398    }
399 
400    LLVMValueRef params[AC_MAX_ARGS];
401    unsigned num_params = LLVMCountParams(ctx->main_fn.value);
402    LLVMGetParams(ctx->main_fn.value, params);
403 
404    /* wrapper function has same parameter as first part shader */
405    LLVMValueRef ret =
406       ac_build_call(&ctx->ac, parts[0].pointee_type, parts[0].value, params, num_params);
407 
408    if (same_thread_count) {
409       LLVMTypeRef type = LLVMTypeOf(ret);
410       assert(LLVMGetTypeKind(type) == LLVMStructTypeKind);
411 
412       /* output of first part shader is the input of the second part */
413       num_params = LLVMCountStructElementTypes(type);
414       assert(num_params == LLVMCountParams(parts[1].value));
415 
416       for (unsigned i = 0; i < num_params; i++) {
417          params[i] = LLVMBuildExtractValue(builder, ret, i, "");
418 
419          /* Convert return value to same type as next shader's input param. */
420          LLVMTypeRef ret_type = LLVMTypeOf(params[i]);
421          LLVMTypeRef param_type = LLVMTypeOf(LLVMGetParam(parts[1].value, i));
422          assert(ac_get_type_size(ret_type) == 4);
423          assert(ac_get_type_size(param_type) == 4);
424 
425          if (ret_type != param_type) {
426             if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) {
427                assert(LLVMGetPointerAddressSpace(param_type) == AC_ADDR_SPACE_CONST_32BIT);
428                assert(ret_type == ctx->ac.i32);
429 
430                params[i] = LLVMBuildIntToPtr(builder, params[i], param_type, "");
431             } else {
432                params[i] = LLVMBuildBitCast(builder, params[i], param_type, "");
433             }
434          }
435       }
436    } else {
437       ac_build_endif(&ctx->ac, 6506);
438 
439       if (ctx->stage == MESA_SHADER_TESS_CTRL) {
440          LLVMValueRef count = ac_get_arg(&ctx->ac, ctx->args->ac.merged_wave_info);
441          count = LLVMBuildLShr(builder, count, LLVMConstInt(ctx->ac.i32, 8, 0), "");
442          count = LLVMBuildAnd(builder, count, LLVMConstInt(ctx->ac.i32, 0x7f, 0), "");
443 
444          LLVMValueRef ena = LLVMBuildICmp(builder, LLVMIntULT, ac_get_thread_id(&ctx->ac), count, "");
445          ac_build_ifcc(&ctx->ac, ena, 6507);
446       }
447 
448       /* The second half of the merged shader should use
449        * the inputs from the toplevel (wrapper) function,
450        * not the return value from the last call.
451        *
452        * That's because the last call was executed condi-
453        * tionally, so we can't consume it in the main
454        * block.
455        */
456 
457       /* Second part params are same as the preceeding params of the first part. */
458       num_params = LLVMCountParams(parts[1].value);
459    }
460 
461    ac_build_call(&ctx->ac, parts[1].pointee_type, parts[1].value, params, num_params);
462 
463    /* Close the conditional wrapping the second shader. */
464    if (ctx->stage == MESA_SHADER_TESS_CTRL && !same_thread_count)
465       ac_build_endif(&ctx->ac, 6507);
466 
467    LLVMBuildRetVoid(builder);
468 }
469 
si_llvm_load_intrinsic(struct ac_shader_abi * abi,nir_intrinsic_instr * intrin)470 static LLVMValueRef si_llvm_load_intrinsic(struct ac_shader_abi *abi, nir_intrinsic_instr *intrin)
471 {
472    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
473 
474    switch (intrin->intrinsic) {
475    case nir_intrinsic_load_lds_ngg_scratch_base_amd:
476       return LLVMBuildPtrToInt(ctx->ac.builder, ctx->gs_ngg_scratch.value, ctx->ac.i32, "");
477 
478    case nir_intrinsic_load_lds_ngg_gs_out_vertex_base_amd:
479       return LLVMBuildPtrToInt(ctx->ac.builder, ctx->gs_ngg_emit, ctx->ac.i32, "");
480 
481    default:
482       return NULL;
483    }
484 }
485 
si_llvm_load_sampler_desc(struct ac_shader_abi * abi,LLVMValueRef index,enum ac_descriptor_type desc_type)486 static LLVMValueRef si_llvm_load_sampler_desc(struct ac_shader_abi *abi, LLVMValueRef index,
487                                               enum ac_descriptor_type desc_type)
488 {
489    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
490    LLVMBuilderRef builder = ctx->ac.builder;
491 
492    if (index && LLVMTypeOf(index) == ctx->ac.i32) {
493       bool is_vec4 = false;
494 
495       switch (desc_type) {
496       case AC_DESC_IMAGE:
497          /* The image is at [0:7]. */
498          index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->ac.i32, 2, 0), "");
499          break;
500       case AC_DESC_BUFFER:
501          /* The buffer is in [4:7]. */
502          index = ac_build_imad(&ctx->ac, index, LLVMConstInt(ctx->ac.i32, 4, 0), ctx->ac.i32_1);
503          is_vec4 = true;
504          break;
505       case AC_DESC_FMASK:
506          /* The FMASK is at [8:15]. */
507          assert(ctx->screen->info.gfx_level < GFX11);
508          index = ac_build_imad(&ctx->ac, index, LLVMConstInt(ctx->ac.i32, 2, 0), ctx->ac.i32_1);
509          break;
510       case AC_DESC_SAMPLER:
511          /* The sampler state is at [12:15]. */
512          index = ac_build_imad(&ctx->ac, index, LLVMConstInt(ctx->ac.i32, 4, 0),
513                                LLVMConstInt(ctx->ac.i32, 3, 0));
514          is_vec4 = true;
515          break;
516       default:
517          unreachable("invalid desc");
518       }
519 
520       struct ac_llvm_pointer list = {
521          .value = ac_get_arg(&ctx->ac, ctx->args->samplers_and_images),
522          .pointee_type = is_vec4 ? ctx->ac.v4i32 : ctx->ac.v8i32,
523       };
524 
525       return ac_build_load_to_sgpr(&ctx->ac, list, index);
526    }
527 
528    return index;
529 }
530 
si_llvm_translate_nir(struct si_shader_context * ctx,struct si_shader * shader,struct nir_shader * nir,bool free_nir)531 static bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shader,
532                                   struct nir_shader *nir, bool free_nir)
533 {
534    struct si_shader_selector *sel = shader->selector;
535    const struct si_shader_info *info = &sel->info;
536 
537    ctx->shader = shader;
538    ctx->stage = shader->is_gs_copy_shader ? MESA_SHADER_VERTEX : nir->info.stage;
539 
540    ctx->abi.intrinsic_load = si_llvm_load_intrinsic;
541    ctx->abi.load_sampler_desc = si_llvm_load_sampler_desc;
542 
543    si_llvm_create_main_func(ctx);
544 
545    switch (ctx->stage) {
546    case MESA_SHADER_VERTEX:
547       break;
548 
549    case MESA_SHADER_TESS_CTRL:
550       si_llvm_init_tcs_callbacks(ctx);
551       break;
552 
553    case MESA_SHADER_GEOMETRY:
554       if (ctx->shader->key.ge.as_ngg) {
555          LLVMTypeRef ai32 = LLVMArrayType(ctx->ac.i32, gfx10_ngg_get_scratch_dw_size(shader));
556          ctx->gs_ngg_scratch = (struct ac_llvm_pointer) {
557             .value = LLVMAddGlobalInAddressSpace(ctx->ac.module, ai32, "ngg_scratch", AC_ADDR_SPACE_LDS),
558             .pointee_type = ai32
559          };
560          LLVMSetInitializer(ctx->gs_ngg_scratch.value, LLVMGetUndef(ai32));
561          LLVMSetAlignment(ctx->gs_ngg_scratch.value, 8);
562 
563          ctx->gs_ngg_emit = LLVMAddGlobalInAddressSpace(
564             ctx->ac.module, LLVMArrayType(ctx->ac.i32, 0), "ngg_emit", AC_ADDR_SPACE_LDS);
565          LLVMSetLinkage(ctx->gs_ngg_emit, LLVMExternalLinkage);
566          LLVMSetAlignment(ctx->gs_ngg_emit, 4);
567       }
568       break;
569 
570    case MESA_SHADER_FRAGMENT: {
571       ctx->abi.kill_ps_if_inf_interp =
572          ctx->screen->options.no_infinite_interp &&
573          (ctx->shader->selector->info.uses_persp_center ||
574           ctx->shader->selector->info.uses_persp_centroid ||
575           ctx->shader->selector->info.uses_persp_sample);
576       break;
577    }
578 
579    case MESA_SHADER_COMPUTE:
580    case MESA_SHADER_KERNEL:
581       if (ctx->shader->selector->info.base.shared_size)
582          si_llvm_declare_compute_memory(ctx);
583       break;
584 
585    default:
586       break;
587    }
588 
589    bool is_merged_esgs_stage =
590       ctx->screen->info.gfx_level >= GFX9 && ctx->stage <= MESA_SHADER_GEOMETRY &&
591       (ctx->shader->key.ge.as_es || ctx->stage == MESA_SHADER_GEOMETRY);
592 
593    bool is_nogs_ngg_stage =
594       (ctx->stage == MESA_SHADER_VERTEX || ctx->stage == MESA_SHADER_TESS_EVAL) &&
595       shader->key.ge.as_ngg && !shader->key.ge.as_es;
596 
597    /* Declare the ESGS ring as an explicit LDS symbol.
598     * When NGG VS/TES, unconditionally declare for streamout and vertex compaction.
599     * Whether space is actually allocated is determined during linking / PM4 creation.
600     */
601    if (is_merged_esgs_stage || is_nogs_ngg_stage)
602       si_llvm_declare_lds_esgs_ring(ctx);
603 
604    /* This is really only needed when streamout and / or vertex
605     * compaction is enabled.
606     */
607    if (is_nogs_ngg_stage &&
608        (si_shader_uses_streamout(shader) || si_shader_culling_enabled(shader))) {
609       LLVMTypeRef asi32 = LLVMArrayType(ctx->ac.i32, gfx10_ngg_get_scratch_dw_size(shader));
610       ctx->gs_ngg_scratch = (struct ac_llvm_pointer) {
611          .value = LLVMAddGlobalInAddressSpace(ctx->ac.module, asi32, "ngg_scratch",
612                                               AC_ADDR_SPACE_LDS),
613          .pointee_type = asi32
614       };
615       LLVMSetInitializer(ctx->gs_ngg_scratch.value, LLVMGetUndef(asi32));
616       LLVMSetAlignment(ctx->gs_ngg_scratch.value, 8);
617    }
618 
619    /* For merged shaders (VS-TCS, VS-GS, TES-GS): */
620    if (ctx->screen->info.gfx_level >= GFX9 && si_is_merged_shader(shader)) {
621       /* Set EXEC = ~0 before the first shader. For monolithic shaders, the wrapper
622        * function does this.
623        */
624       if (ctx->stage == MESA_SHADER_TESS_EVAL) {
625          /* TES has only 1 shader part, therefore it doesn't use the wrapper function. */
626          if (!shader->is_monolithic || !shader->key.ge.as_es)
627             ac_init_exec_full_mask(&ctx->ac);
628       } else if (ctx->stage == MESA_SHADER_VERTEX) {
629          if (shader->is_monolithic) {
630             /* Only mono VS with TCS/GS present has wrapper function. */
631             if (!shader->key.ge.as_ls && !shader->key.ge.as_es)
632                ac_init_exec_full_mask(&ctx->ac);
633          } else {
634             ac_init_exec_full_mask(&ctx->ac);
635          }
636       }
637 
638       /* NGG VS and NGG TES: nir ngg lowering send gs_alloc_req at the beginning when culling
639        * is disabled, but GFX10 may hang if not all waves are launched before gs_alloc_req.
640        * We work around this HW bug by inserting a barrier before gs_alloc_req.
641        */
642       if (ctx->screen->info.gfx_level == GFX10 &&
643           (ctx->stage == MESA_SHADER_VERTEX || ctx->stage == MESA_SHADER_TESS_EVAL) &&
644           shader->key.ge.as_ngg && !shader->key.ge.as_es && !si_shader_culling_enabled(shader))
645          ac_build_s_barrier(&ctx->ac, ctx->stage);
646 
647       LLVMValueRef thread_enabled = NULL;
648 
649       if ((ctx->stage == MESA_SHADER_GEOMETRY && !shader->key.ge.as_ngg) ||
650           (ctx->stage == MESA_SHADER_TESS_CTRL && !shader->is_monolithic)) {
651          /* Wrap both shaders in an if statement according to the number of enabled threads
652           * there. For monolithic TCS, the if statement is inserted by the wrapper function,
653           * not here. For NGG GS, the if statement is inserted by nir lowering.
654           */
655          thread_enabled = si_is_gs_thread(ctx); /* 2nd shader: thread enabled bool */
656       } else if ((shader->key.ge.as_ls || shader->key.ge.as_es) && !shader->is_monolithic) {
657          /* For monolithic LS (VS before TCS) and ES (VS before GS and TES before GS),
658           * the if statement is inserted by the wrapper function.
659           */
660          thread_enabled = si_is_es_thread(ctx); /* 1st shader: thread enabled bool */
661       }
662 
663       if (thread_enabled) {
664          ac_build_ifcc(&ctx->ac, thread_enabled, SI_MERGED_WRAP_IF_LABEL);
665       }
666 
667       /* Execute a barrier before the second shader in
668        * a merged shader.
669        *
670        * Execute the barrier inside the conditional block,
671        * so that empty waves can jump directly to s_endpgm,
672        * which will also signal the barrier.
673        *
674        * This is possible in gfx9, because an empty wave for the second shader does not insert
675        * any ending. With NGG, empty waves may still be required to export data (e.g. GS output
676        * vertices), so we cannot let them exit early.
677        *
678        * If the shader is TCS and the TCS epilog is present
679        * and contains a barrier, it will wait there and then
680        * reach s_endpgm.
681        */
682       if (ctx->stage == MESA_SHADER_TESS_CTRL) {
683          /* We need the barrier only if TCS inputs are read from LDS. */
684          if (!shader->key.ge.opt.same_patch_vertices ||
685              shader->selector->info.tcs_inputs_via_lds) {
686             ac_build_waitcnt(&ctx->ac, AC_WAIT_DS);
687 
688             /* If both input and output patches are wholly in one wave, we don't need a barrier.
689              * That's true when both VS and TCS have the same number of patch vertices and
690              * the wave size is a multiple of the number of patch vertices.
691              */
692             if (!shader->key.ge.opt.same_patch_vertices ||
693                 ctx->ac.wave_size % nir->info.tess.tcs_vertices_out != 0)
694                ac_build_s_barrier(&ctx->ac, ctx->stage);
695          }
696       } else if (ctx->stage == MESA_SHADER_GEOMETRY) {
697          ac_build_waitcnt(&ctx->ac, AC_WAIT_DS);
698          ac_build_s_barrier(&ctx->ac, ctx->stage);
699       }
700    }
701 
702    ctx->abi.clamp_shadow_reference = true;
703    ctx->abi.robust_buffer_access = true;
704    ctx->abi.load_grid_size_from_user_sgpr = true;
705    ctx->abi.clamp_div_by_zero = ctx->screen->options.clamp_div_by_zero ||
706                                 info->options & SI_PROFILE_CLAMP_DIV_BY_ZERO;
707    ctx->abi.disable_aniso_single_level = true;
708 
709    bool ls_need_output =
710       ctx->stage == MESA_SHADER_VERTEX && shader->key.ge.as_ls &&
711       shader->key.ge.opt.same_patch_vertices;
712 
713    bool ps_need_output = ctx->stage == MESA_SHADER_FRAGMENT;
714 
715    if (ls_need_output || ps_need_output) {
716       for (unsigned i = 0; i < info->num_outputs; i++) {
717          LLVMTypeRef type = ctx->ac.f32;
718 
719          /* Only FS uses unpacked f16. Other stages pack 16-bit outputs into low and high bits of f32. */
720          if (nir->info.stage == MESA_SHADER_FRAGMENT &&
721              nir_alu_type_get_type_size(ctx->shader->selector->info.output_type[i]) == 16)
722             type = ctx->ac.f16;
723 
724          for (unsigned j = 0; j < 4; j++) {
725             ctx->abi.outputs[i * 4 + j] = ac_build_alloca_undef(&ctx->ac, type, "");
726             ctx->abi.is_16bit[i * 4 + j] = type == ctx->ac.f16;
727          }
728       }
729    }
730 
731    if (!ac_nir_translate(&ctx->ac, &ctx->abi, &ctx->args->ac, nir))
732       return false;
733 
734    switch (ctx->stage) {
735    case MESA_SHADER_VERTEX:
736       if (shader->key.ge.as_ls)
737          si_llvm_ls_build_end(ctx);
738       else if (shader->key.ge.as_es)
739          si_llvm_es_build_end(ctx);
740       break;
741 
742    case MESA_SHADER_TESS_CTRL:
743       if (!shader->is_monolithic)
744          si_llvm_tcs_build_end(ctx);
745       break;
746 
747    case MESA_SHADER_TESS_EVAL:
748       if (ctx->shader->key.ge.as_es)
749          si_llvm_es_build_end(ctx);
750       break;
751 
752    case MESA_SHADER_GEOMETRY:
753       if (!ctx->shader->key.ge.as_ngg)
754          si_llvm_gs_build_end(ctx);
755       break;
756 
757    case MESA_SHADER_FRAGMENT:
758       if (!shader->is_monolithic)
759          si_llvm_ps_build_end(ctx);
760       break;
761 
762    default:
763       break;
764    }
765 
766    si_llvm_build_ret(ctx, ctx->return_value);
767 
768    if (free_nir)
769       ralloc_free(nir);
770    return true;
771 }
772 
si_llvm_compile_shader(struct si_screen * sscreen,struct ac_llvm_compiler * compiler,struct si_shader * shader,struct si_shader_args * args,struct util_debug_callback * debug,struct nir_shader * nir)773 bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compiler,
774                             struct si_shader *shader, struct si_shader_args *args,
775                             struct util_debug_callback *debug, struct nir_shader *nir)
776 {
777    struct si_shader_selector *sel = shader->selector;
778    struct si_shader_context ctx;
779    enum ac_float_mode float_mode = nir->info.stage == MESA_SHADER_KERNEL ?
780                                        AC_FLOAT_MODE_DEFAULT : AC_FLOAT_MODE_DEFAULT_OPENGL;
781    bool exports_color_null = false;
782    bool exports_mrtz = false;
783 
784    if (nir->info.stage == MESA_SHADER_FRAGMENT) {
785       exports_color_null = sel->info.colors_written;
786       exports_mrtz = shader->ps.writes_z || shader->ps.writes_stencil ||
787                      shader->ps.writes_samplemask ||
788                      shader->key.ps.part.epilog.alpha_to_coverage_via_mrtz;
789       if (!exports_mrtz && !exports_color_null)
790          exports_color_null = si_shader_uses_discard(shader) || sscreen->info.gfx_level < GFX10;
791    }
792 
793    si_llvm_context_init(&ctx, sscreen, compiler, shader->wave_size, exports_color_null, exports_mrtz,
794                         float_mode);
795    ctx.args = args;
796 
797    if (!si_llvm_translate_nir(&ctx, shader, nir, false)) {
798       si_llvm_dispose(&ctx);
799       return false;
800    }
801 
802    /* For merged shader stage. */
803    if (shader->is_monolithic && sscreen->info.gfx_level >= GFX9 &&
804        (nir->info.stage == MESA_SHADER_TESS_CTRL || nir->info.stage == MESA_SHADER_GEOMETRY)) {
805       /* LS or ES shader. */
806       struct si_shader prev_shader = {};
807 
808       bool free_nir;
809       nir_shader *prev_nir = si_get_prev_stage_nir_shader(shader, &prev_shader, ctx.args, &free_nir);
810 
811       struct ac_llvm_pointer parts[2];
812       parts[1] = ctx.main_fn;
813 
814       if (!si_llvm_translate_nir(&ctx, &prev_shader, prev_nir, free_nir)) {
815          si_llvm_dispose(&ctx);
816          return false;
817       }
818 
819       parts[0] = ctx.main_fn;
820 
821       /* Reset the shader context. */
822       ctx.shader = shader;
823       ctx.stage = nir->info.stage;
824 
825       bool same_thread_count = shader->key.ge.opt.same_patch_vertices;
826       si_build_wrapper_function(&ctx, parts, same_thread_count);
827    }
828 
829    si_llvm_optimize_module(&ctx);
830 
831    /* Make sure the input is a pointer and not integer followed by inttoptr. */
832    assert(LLVMGetTypeKind(LLVMTypeOf(LLVMGetParam(ctx.main_fn.value, 0))) == LLVMPointerTypeKind);
833 
834    /* Compile to bytecode. */
835    if (!si_compile_llvm(sscreen, &shader->binary, &shader->config, compiler, &ctx.ac, debug,
836                         nir->info.stage, si_get_shader_name(shader))) {
837       si_llvm_dispose(&ctx);
838       fprintf(stderr, "LLVM failed to compile shader\n");
839       return false;
840    }
841 
842    si_llvm_dispose(&ctx);
843    return true;
844 }
845 
si_llvm_build_shader_part(struct si_screen * sscreen,gl_shader_stage stage,bool prolog,struct ac_llvm_compiler * compiler,struct util_debug_callback * debug,const char * name,struct si_shader_part * result)846 bool si_llvm_build_shader_part(struct si_screen *sscreen, gl_shader_stage stage,
847                                bool prolog, struct ac_llvm_compiler *compiler,
848                                struct util_debug_callback *debug, const char *name,
849                                struct si_shader_part *result)
850 {
851    union si_shader_part_key *key = &result->key;
852 
853    struct si_shader_selector sel = {};
854    sel.screen = sscreen;
855 
856    struct si_shader shader = {};
857    shader.selector = &sel;
858    bool wave32 = false;
859    bool exports_color_null = false;
860    bool exports_mrtz = false;
861 
862    switch (stage) {
863    case MESA_SHADER_FRAGMENT:
864       if (prolog) {
865          shader.key.ps.part.prolog = key->ps_prolog.states;
866          wave32 = key->ps_prolog.wave32;
867          exports_color_null = key->ps_prolog.states.poly_stipple;
868       } else {
869          shader.key.ps.part.epilog = key->ps_epilog.states;
870          wave32 = key->ps_epilog.wave32;
871          exports_color_null = key->ps_epilog.colors_written;
872          exports_mrtz = (key->ps_epilog.writes_z && !key->ps_epilog.states.kill_z) ||
873                         (key->ps_epilog.writes_stencil && !key->ps_epilog.states.kill_stencil) ||
874                         (key->ps_epilog.writes_samplemask && !key->ps_epilog.states.kill_samplemask);
875          if (!exports_mrtz && !exports_color_null)
876             exports_color_null = key->ps_epilog.uses_discard || sscreen->info.gfx_level < GFX10;
877       }
878       break;
879    default:
880       unreachable("bad shader part");
881    }
882 
883    struct si_shader_context ctx;
884    si_llvm_context_init(&ctx, sscreen, compiler, wave32 ? 32 : 64, exports_color_null, exports_mrtz,
885                         AC_FLOAT_MODE_DEFAULT_OPENGL);
886 
887    ctx.shader = &shader;
888    ctx.stage = stage;
889 
890    struct si_shader_args args;
891    ctx.args = &args;
892 
893    void (*build)(struct si_shader_context *, union si_shader_part_key *);
894 
895    switch (stage) {
896    case MESA_SHADER_FRAGMENT:
897       build = prolog ? si_llvm_build_ps_prolog : si_llvm_build_ps_epilog;
898       break;
899    default:
900       unreachable("bad shader part");
901    }
902 
903    build(&ctx, key);
904 
905    /* Compile. */
906    si_llvm_optimize_module(&ctx);
907 
908    bool ret = si_compile_llvm(sscreen, &result->binary, &result->config, compiler,
909                               &ctx.ac, debug, ctx.stage, name);
910 
911    si_llvm_dispose(&ctx);
912    return ret;
913 }
914