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