• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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    /* For VS and PS: pre-loaded shader inputs.
62     *
63     * Currently only used for NIR shaders; indexed by variables'
64     * driver_location.
65     */
66    LLVMValueRef *inputs;
67 
68    /* Varying -> attribute number mapping. Also NIR-only */
69    unsigned fs_input_attr_indices[MAX_VARYING];
70 
71    void (*emit_outputs)(struct ac_shader_abi *abi, unsigned max_outputs, LLVMValueRef *addrs);
72 
73    void (*emit_vertex)(struct ac_shader_abi *abi, unsigned stream, LLVMValueRef *addrs);
74 
75    void (*emit_primitive)(struct ac_shader_abi *abi, unsigned stream);
76 
77    void (*emit_vertex_with_counter)(struct ac_shader_abi *abi, unsigned stream,
78                                     LLVMValueRef vertexidx, LLVMValueRef *addrs);
79 
80    LLVMValueRef (*load_inputs)(struct ac_shader_abi *abi,
81                                unsigned driver_location, unsigned component,
82                                unsigned num_components, unsigned vertex_index,
83                                LLVMTypeRef type);
84 
85    LLVMValueRef (*load_tess_varyings)(struct ac_shader_abi *abi, LLVMTypeRef type,
86                                       LLVMValueRef vertex_index, LLVMValueRef param_index,
87                                       unsigned driver_location, unsigned component,
88                                       unsigned num_components,
89                                       bool load_inputs);
90 
91    void (*store_tcs_outputs)(struct ac_shader_abi *abi,
92                              LLVMValueRef vertex_index, LLVMValueRef param_index,
93                              LLVMValueRef src, unsigned writemask,
94                              unsigned component, unsigned location, unsigned driver_location);
95 
96    LLVMValueRef (*load_tess_coord)(struct ac_shader_abi *abi);
97 
98    LLVMValueRef (*load_patch_vertices_in)(struct ac_shader_abi *abi);
99 
100    LLVMValueRef (*load_tess_level)(struct ac_shader_abi *abi, unsigned varying_id,
101                                    bool load_default_state);
102 
103    LLVMValueRef (*load_ubo)(struct ac_shader_abi *abi,
104                             unsigned desc_set, unsigned binding,
105                             bool valid_binding, LLVMValueRef index);
106 
107    /**
108     * Load the descriptor for the given buffer.
109     *
110     * \param buffer the buffer as presented in NIR: this is the descriptor
111     *               in Vulkan, and the buffer index in OpenGL/Gallium
112     * \param write whether buffer contents will be written
113     */
114    LLVMValueRef (*load_ssbo)(struct ac_shader_abi *abi, LLVMValueRef buffer, bool write);
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);
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 
170 #endif /* AC_SHADER_ABI_H */
171