Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/amd/llvm/ac_shader_abi.h
7355 views
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, bool vertex_index_is_invoc_id);
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_ring_tess_offchip)(struct ac_shader_abi *abi);
101
102
LLVMValueRef (*load_ring_tess_factors)(struct ac_shader_abi *abi);
103
104
LLVMValueRef (*load_ring_esgs)(struct ac_shader_abi *abi);
105
106
LLVMValueRef (*load_tess_level)(struct ac_shader_abi *abi, unsigned varying_id,
107
bool load_default_state);
108
109
LLVMValueRef (*load_ubo)(struct ac_shader_abi *abi,
110
unsigned desc_set, unsigned binding,
111
bool valid_binding, LLVMValueRef index);
112
113
/**
114
* Load the descriptor for the given buffer.
115
*
116
* \param buffer the buffer as presented in NIR: this is the descriptor
117
* in Vulkan, and the buffer index in OpenGL/Gallium
118
* \param write whether buffer contents will be written
119
* \param non_uniform whether the buffer descriptor is not assumed to be uniform
120
*/
121
LLVMValueRef (*load_ssbo)(struct ac_shader_abi *abi, LLVMValueRef buffer, bool write, bool non_uniform);
122
123
/**
124
* Load a descriptor associated to a sampler.
125
*
126
* \param descriptor_set the descriptor set index (only for Vulkan)
127
* \param base_index the base index of the sampler variable
128
* \param constant_index constant part of an array index (or 0, if the
129
* sampler variable is not an array)
130
* \param index non-constant part of an array index (may be NULL)
131
* \param desc_type the type of descriptor to load
132
* \param image whether the descriptor is loaded for an image operation
133
*/
134
LLVMValueRef (*load_sampler_desc)(struct ac_shader_abi *abi, unsigned descriptor_set,
135
unsigned base_index, unsigned constant_index,
136
LLVMValueRef index, enum ac_descriptor_type desc_type,
137
bool image, bool write, bool bindless);
138
139
/**
140
* Load a Vulkan-specific resource.
141
*
142
* \param index resource index
143
* \param desc_set descriptor set
144
* \param binding descriptor set binding
145
*/
146
LLVMValueRef (*load_resource)(struct ac_shader_abi *abi, LLVMValueRef index, unsigned desc_set,
147
unsigned binding);
148
149
LLVMValueRef (*load_sample_position)(struct ac_shader_abi *abi, LLVMValueRef sample_id);
150
151
LLVMValueRef (*load_local_group_size)(struct ac_shader_abi *abi);
152
153
LLVMValueRef (*load_sample_mask_in)(struct ac_shader_abi *abi);
154
155
LLVMValueRef (*load_base_vertex)(struct ac_shader_abi *abi, bool non_indexed_is_zero);
156
157
LLVMValueRef (*emit_fbfetch)(struct ac_shader_abi *abi);
158
159
/* Whether to clamp the shadow reference value to [0,1]on GFX8. Radeonsi currently
160
* uses it due to promoting D16 to D32, but radv needs it off. */
161
bool clamp_shadow_reference;
162
bool interp_at_sample_force_center;
163
164
/* Whether bounds checks are required */
165
bool robust_buffer_access;
166
167
/* Check for Inf interpolation coeff */
168
bool kill_ps_if_inf_interp;
169
170
/* Whether undef values must be converted to zero */
171
bool convert_undef_to_zero;
172
173
/* Clamp div by 0 (so it won't produce NaN) */
174
bool clamp_div_by_zero;
175
176
/* Whether gl_FragCoord.z should be adjusted for VRS due to a hw bug on
177
* some GFX10.3 chips.
178
*/
179
bool adjust_frag_coord_z;
180
};
181
182
#endif /* AC_SHADER_ABI_H */
183
184