1 /*
2  * Copyright 2017 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * on the rights to use, copy, modify, merge, publish, distribute, sub
8  * license, and/or sell copies of the Software, and to permit persons to whom
9  * the Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 
24 #ifndef AC_SHADER_ABI_H
25 #define AC_SHADER_ABI_H
26 
27 #include "ac_shader_args.h"
28 #include "compiler/shader_enums.h"
29 #include <llvm-c/Core.h>
30 
31 #include <assert.h>
32 
33 #define AC_LLVM_MAX_OUTPUTS (VARYING_SLOT_VAR31 + 1)
34 
35 #define AC_MAX_INLINE_PUSH_CONSTS 8
36 
37 enum ac_descriptor_type
38 {
39    AC_DESC_IMAGE,
40    AC_DESC_FMASK,
41    AC_DESC_SAMPLER,
42    AC_DESC_BUFFER,
43    AC_DESC_PLANE_0,
44    AC_DESC_PLANE_1,
45    AC_DESC_PLANE_2,
46 };
47 
48 /* Document the shader ABI during compilation. This is what allows radeonsi and
49  * radv to share a compiler backend.
50  */
51 struct ac_shader_abi {
52    LLVMValueRef outputs[AC_LLVM_MAX_OUTPUTS * 4];
53 
54    /* These input registers sometimes need to be fixed up. */
55    LLVMValueRef vertex_id;
56    LLVMValueRef instance_id;
57    LLVMValueRef persp_centroid, linear_centroid;
58    LLVMValueRef color0, color1;
59    LLVMValueRef user_data;
60 
61    /* Varying -> attribute number mapping. Also NIR-only */
62    unsigned fs_input_attr_indices[MAX_VARYING];
63 
64    void (*export_vertex)(struct ac_shader_abi *abi);
65 
66    void (*emit_outputs)(struct ac_shader_abi *abi);
67 
68    void (*emit_vertex)(struct ac_shader_abi *abi, unsigned stream, LLVMValueRef *addrs);
69 
70    void (*emit_primitive)(struct ac_shader_abi *abi, unsigned stream);
71 
72    void (*emit_vertex_with_counter)(struct ac_shader_abi *abi, unsigned stream,
73                                     LLVMValueRef vertexidx, LLVMValueRef *addrs);
74 
75    LLVMValueRef (*load_inputs)(struct ac_shader_abi *abi,
76                                unsigned driver_location, unsigned component,
77                                unsigned num_components, unsigned vertex_index,
78                                LLVMTypeRef type);
79 
80    LLVMValueRef (*load_tess_varyings)(struct ac_shader_abi *abi, LLVMTypeRef type,
81                                       LLVMValueRef vertex_index, LLVMValueRef param_index,
82                                       unsigned driver_location, unsigned component,
83                                       unsigned num_components,
84                                       bool load_inputs, bool vertex_index_is_invoc_id);
85 
86    void (*store_tcs_outputs)(struct ac_shader_abi *abi,
87                              LLVMValueRef vertex_index, LLVMValueRef param_index,
88                              LLVMValueRef src, unsigned writemask,
89                              unsigned component, unsigned location, unsigned driver_location);
90 
91    LLVMValueRef (*load_patch_vertices_in)(struct ac_shader_abi *abi);
92 
93    LLVMValueRef (*load_ring_tess_offchip)(struct ac_shader_abi *abi);
94 
95    LLVMValueRef (*load_ring_tess_factors)(struct ac_shader_abi *abi);
96 
97    LLVMValueRef (*load_ring_esgs)(struct ac_shader_abi *abi);
98 
99    LLVMValueRef (*load_tess_level)(struct ac_shader_abi *abi, unsigned varying_id,
100                                    bool load_default_state);
101 
102    LLVMValueRef (*load_ubo)(struct ac_shader_abi *abi,
103                             unsigned desc_set, unsigned binding,
104                             bool valid_binding, LLVMValueRef index);
105 
106    /**
107     * Load the descriptor for the given buffer.
108     *
109     * \param buffer the buffer as presented in NIR: this is the descriptor
110     *               in Vulkan, and the buffer index in OpenGL/Gallium
111     * \param write whether buffer contents will be written
112     * \param non_uniform whether the buffer descriptor is not assumed to be uniform
113     */
114    LLVMValueRef (*load_ssbo)(struct ac_shader_abi *abi, LLVMValueRef buffer, bool write, bool non_uniform);
115 
116    /**
117     * Load a descriptor associated to a sampler.
118     *
119     * \param descriptor_set the descriptor set index (only for Vulkan)
120     * \param base_index the base index of the sampler variable
121     * \param constant_index constant part of an array index (or 0, if the
122     *                       sampler variable is not an array)
123     * \param index non-constant part of an array index (may be NULL)
124     * \param desc_type the type of descriptor to load
125     * \param image whether the descriptor is loaded for an image operation
126     */
127    LLVMValueRef (*load_sampler_desc)(struct ac_shader_abi *abi, unsigned descriptor_set,
128                                      unsigned base_index, unsigned constant_index,
129                                      LLVMValueRef index, enum ac_descriptor_type desc_type,
130                                      bool image, bool write, bool bindless);
131 
132    /**
133     * Load a Vulkan-specific resource.
134     *
135     * \param index resource index
136     * \param desc_set descriptor set
137     * \param binding descriptor set binding
138     */
139    LLVMValueRef (*load_resource)(struct ac_shader_abi *abi, LLVMValueRef index, unsigned desc_set,
140                                  unsigned binding);
141 
142    LLVMValueRef (*load_sample_position)(struct ac_shader_abi *abi, LLVMValueRef sample_id);
143 
144    LLVMValueRef (*load_local_group_size)(struct ac_shader_abi *abi);
145 
146    LLVMValueRef (*load_sample_mask_in)(struct ac_shader_abi *abi);
147 
148    LLVMValueRef (*load_base_vertex)(struct ac_shader_abi *abi, bool non_indexed_is_zero);
149 
150    LLVMValueRef (*emit_fbfetch)(struct ac_shader_abi *abi);
151 
152    /* Whether to clamp the shadow reference value to [0,1]on GFX8. Radeonsi currently
153     * uses it due to promoting D16 to D32, but radv needs it off. */
154    bool clamp_shadow_reference;
155    bool interp_at_sample_force_center;
156 
157    /* Whether bounds checks are required */
158    bool robust_buffer_access;
159 
160    /* Check for Inf interpolation coeff */
161    bool kill_ps_if_inf_interp;
162 
163    /* Whether undef values must be converted to zero */
164    bool convert_undef_to_zero;
165 
166    /* Clamp div by 0 (so it won't produce NaN) */
167    bool clamp_div_by_zero;
168 
169    /* Whether gl_FragCoord.z should be adjusted for VRS due to a hw bug on
170     * some GFX10.3 chips.
171     */
172    bool adjust_frag_coord_z;
173 };
174 
175 #endif /* AC_SHADER_ABI_H */
176