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