xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/radeonsi/si_shader_llvm.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2016 Advanced Micro Devices, Inc.
3  *
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #ifndef SI_SHADER_LLVM_H
8 #define SI_SHADER_LLVM_H
9 
10 #include "ac_shader_abi.h"
11 #include "ac_llvm_build.h"
12 #include "si_shader.h"
13 
14 struct si_shader_args;
15 
16 struct si_shader_context {
17    struct ac_llvm_context ac;
18    struct si_shader *shader;
19    struct si_screen *screen;
20 
21    gl_shader_stage stage;
22 
23    /* For clamping the non-constant index in resource indexing: */
24    unsigned num_const_buffers;
25    unsigned num_shader_buffers;
26    unsigned num_images;
27    unsigned num_samplers;
28 
29    struct si_shader_args *args;
30    struct ac_shader_abi abi;
31 
32    LLVMBasicBlockRef merged_wrap_if_entry_block;
33    int merged_wrap_if_label;
34 
35    struct ac_llvm_pointer main_fn;
36    LLVMTypeRef return_type;
37 
38    struct ac_llvm_compiler *compiler;
39 
40    LLVMValueRef gs_ngg_emit;
41    struct ac_llvm_pointer gs_ngg_scratch;
42    LLVMValueRef return_value;
43 };
44 
si_shader_context_from_abi(struct ac_shader_abi * abi)45 static inline struct si_shader_context *si_shader_context_from_abi(struct ac_shader_abi *abi)
46 {
47    return container_of(abi, struct si_shader_context, abi);
48 }
49 
50 /* si_shader_llvm.c */
51 bool si_compile_llvm(struct si_screen *sscreen, struct si_shader_binary *binary,
52                      struct ac_shader_config *conf, struct ac_llvm_compiler *compiler,
53                      struct ac_llvm_context *ac, struct util_debug_callback *debug,
54                      gl_shader_stage stage, const char *name, bool less_optimized);
55 void si_llvm_context_init(struct si_shader_context *ctx, struct si_screen *sscreen,
56                           struct ac_llvm_compiler *compiler, unsigned wave_size,
57                           bool exports_color_null, bool exports_mrtz,
58                           enum ac_float_mode float_mode);
59 void si_llvm_create_func(struct si_shader_context *ctx, const char *name, LLVMTypeRef *return_types,
60                          unsigned num_return_elems, unsigned max_workgroup_size);
61 void si_llvm_create_main_func(struct si_shader_context *ctx);
62 void si_llvm_optimize_module(struct si_shader_context *ctx);
63 void si_llvm_dispose(struct si_shader_context *ctx);
64 LLVMValueRef si_buffer_load_const(struct si_shader_context *ctx, LLVMValueRef resource,
65                                   LLVMValueRef offset);
66 void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret);
67 LLVMValueRef si_insert_input_ret(struct si_shader_context *ctx, LLVMValueRef ret,
68                                  struct ac_arg param, unsigned return_index);
69 LLVMValueRef si_insert_input_ret_float(struct si_shader_context *ctx, LLVMValueRef ret,
70                                        struct ac_arg param, unsigned return_index);
71 LLVMValueRef si_insert_input_ptr(struct si_shader_context *ctx, LLVMValueRef ret,
72                                  struct ac_arg param, unsigned return_index);
73 LLVMValueRef si_prolog_get_internal_binding_slot(struct si_shader_context *ctx, unsigned slot);
74 LLVMValueRef si_unpack_param(struct si_shader_context *ctx, struct ac_arg param, unsigned rshift,
75                              unsigned bitwidth);
76 
77 /* si_shader_llvm_gs.c */
78 LLVMValueRef si_is_es_thread(struct si_shader_context *ctx);
79 LLVMValueRef si_is_gs_thread(struct si_shader_context *ctx);
80 void si_llvm_es_build_end(struct si_shader_context *ctx);
81 void si_llvm_gs_build_end(struct si_shader_context *ctx);
82 
83 /* si_shader_llvm_tess.c */
84 void si_llvm_ls_build_end(struct si_shader_context *ctx);
85 void si_llvm_tcs_build_end(struct si_shader_context *ctx);
86 void si_llvm_init_tcs_callbacks(struct si_shader_context *ctx);
87 
88 /* si_shader_llvm_ps.c */
89 void si_llvm_build_ps_prolog(struct si_shader_context *ctx, union si_shader_part_key *key);
90 void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part_key *key);
91 void si_llvm_ps_build_end(struct si_shader_context *ctx);
92 
93 #endif
94