Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/auxiliary/tgsi/tgsi_scan.h
4565 views
1
/**************************************************************************
2
*
3
* Copyright 2008 VMware, Inc.
4
* All Rights Reserved.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
13
*
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
16
* of the Software.
17
*
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*
26
**************************************************************************/
27
28
#ifndef TGSI_SCAN_H
29
#define TGSI_SCAN_H
30
31
32
#include "pipe/p_compiler.h"
33
#include "pipe/p_state.h"
34
#include "pipe/p_shader_tokens.h"
35
36
#ifdef __cplusplus
37
extern "C" {
38
#endif
39
40
/**
41
* Shader summary info
42
*/
43
struct tgsi_shader_info
44
{
45
uint num_tokens;
46
47
ubyte num_inputs;
48
ubyte num_outputs;
49
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
50
ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
51
ubyte input_interpolate[PIPE_MAX_SHADER_INPUTS];
52
ubyte input_interpolate_loc[PIPE_MAX_SHADER_INPUTS];
53
ubyte input_usage_mask[PIPE_MAX_SHADER_INPUTS];
54
ubyte input_cylindrical_wrap[PIPE_MAX_SHADER_INPUTS];
55
ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
56
ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
57
ubyte output_usagemask[PIPE_MAX_SHADER_OUTPUTS];
58
ubyte output_streams[PIPE_MAX_SHADER_OUTPUTS];
59
60
ubyte num_system_values;
61
ubyte system_value_semantic_name[PIPE_MAX_SHADER_INPUTS];
62
63
ubyte processor;
64
65
uint file_mask[TGSI_FILE_COUNT]; /**< bitmask of declared registers */
66
uint file_count[TGSI_FILE_COUNT]; /**< number of declared registers */
67
int file_max[TGSI_FILE_COUNT]; /**< highest index of declared registers */
68
int const_file_max[PIPE_MAX_CONSTANT_BUFFERS];
69
unsigned const_buffers_declared; /**< bitmask of declared const buffers */
70
unsigned samplers_declared; /**< bitmask of declared samplers */
71
ubyte sampler_targets[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_TEXTURE_x values */
72
ubyte sampler_type[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_RETURN_TYPE_x */
73
ubyte num_stream_output_components[4];
74
75
ubyte input_array_first[PIPE_MAX_SHADER_INPUTS];
76
ubyte input_array_last[PIPE_MAX_SHADER_INPUTS];
77
ubyte output_array_first[PIPE_MAX_SHADER_OUTPUTS];
78
ubyte output_array_last[PIPE_MAX_SHADER_OUTPUTS];
79
unsigned array_max[TGSI_FILE_COUNT]; /**< highest index array per register file */
80
81
uint immediate_count; /**< number of immediates declared */
82
uint num_instructions;
83
uint num_memory_instructions; /**< sampler, buffer, and image instructions */
84
85
uint opcode_count[TGSI_OPCODE_LAST]; /**< opcode histogram */
86
87
/**
88
* If a tessellation control shader reads outputs, this describes which ones.
89
*/
90
boolean reads_pervertex_outputs;
91
boolean reads_perpatch_outputs;
92
boolean reads_tessfactor_outputs;
93
94
ubyte colors_read; /**< which color components are read by the FS */
95
ubyte colors_written;
96
boolean reads_position; /**< does fragment shader read position? */
97
boolean reads_z; /**< does fragment shader read depth? */
98
boolean reads_samplemask; /**< does fragment shader read sample mask? */
99
boolean reads_tess_factors; /**< If TES reads TESSINNER or TESSOUTER */
100
boolean writes_z; /**< does fragment shader write Z value? */
101
boolean writes_stencil; /**< does fragment shader write stencil value? */
102
boolean writes_samplemask; /**< does fragment shader write sample mask? */
103
boolean writes_edgeflag; /**< vertex shader outputs edgeflag */
104
boolean uses_kill; /**< KILL or KILL_IF instruction used? */
105
boolean uses_persp_center;
106
boolean uses_persp_centroid;
107
boolean uses_persp_sample;
108
boolean uses_linear_center;
109
boolean uses_linear_centroid;
110
boolean uses_linear_sample;
111
boolean uses_persp_opcode_interp_centroid;
112
boolean uses_persp_opcode_interp_offset;
113
boolean uses_persp_opcode_interp_sample;
114
boolean uses_linear_opcode_interp_centroid;
115
boolean uses_linear_opcode_interp_offset;
116
boolean uses_linear_opcode_interp_sample;
117
boolean uses_instanceid;
118
boolean uses_vertexid;
119
boolean uses_vertexid_nobase;
120
boolean uses_basevertex;
121
boolean uses_drawid;
122
boolean uses_primid;
123
boolean uses_frontface;
124
boolean uses_invocationid;
125
boolean uses_thread_id[3];
126
boolean uses_block_id[3];
127
boolean uses_block_size;
128
boolean uses_grid_size;
129
boolean uses_subgroup_info;
130
boolean writes_position;
131
boolean writes_psize;
132
boolean writes_clipvertex;
133
boolean writes_primid;
134
boolean writes_viewport_index;
135
boolean writes_layer;
136
boolean writes_memory; /**< contains stores or atomics to buffers or images */
137
boolean uses_doubles; /**< uses any of the double instructions */
138
boolean uses_derivatives;
139
boolean uses_bindless_samplers;
140
boolean uses_bindless_images;
141
boolean uses_fbfetch;
142
unsigned clipdist_writemask;
143
unsigned culldist_writemask;
144
unsigned num_written_culldistance;
145
unsigned num_written_clipdistance;
146
147
unsigned images_declared; /**< bitmask of declared images */
148
unsigned msaa_images_declared; /**< bitmask of declared MSAA images */
149
150
/**
151
* Bitmask indicating which declared image is a buffer.
152
*/
153
unsigned images_buffers;
154
unsigned images_load; /**< bitmask of images using loads */
155
unsigned images_store; /**< bitmask of images using stores */
156
unsigned images_atomic; /**< bitmask of images using atomics */
157
unsigned shader_buffers_declared; /**< bitmask of declared shader buffers */
158
unsigned shader_buffers_load; /**< bitmask of shader buffers using loads */
159
unsigned shader_buffers_store; /**< bitmask of shader buffers using stores */
160
unsigned shader_buffers_atomic; /**< bitmask of shader buffers using atomics */
161
bool uses_bindless_buffer_load;
162
bool uses_bindless_buffer_store;
163
bool uses_bindless_buffer_atomic;
164
bool uses_bindless_image_load;
165
bool uses_bindless_image_store;
166
bool uses_bindless_image_atomic;
167
168
/**
169
* Bitmask indicating which register files are accessed with
170
* indirect addressing. The bits are (1 << TGSI_FILE_x), etc.
171
*/
172
unsigned indirect_files;
173
/**
174
* Bitmask indicating which register files are read / written with
175
* indirect addressing. The bits are (1 << TGSI_FILE_x).
176
*/
177
unsigned indirect_files_read;
178
unsigned indirect_files_written;
179
unsigned dim_indirect_files; /**< shader resource indexing */
180
unsigned const_buffers_indirect; /**< const buffers using indirect addressing */
181
182
unsigned properties[TGSI_PROPERTY_COUNT]; /* index with TGSI_PROPERTY_ */
183
184
/**
185
* Max nesting limit of loops/if's
186
*/
187
unsigned max_depth;
188
};
189
190
struct tgsi_array_info
191
{
192
/** Whether an array with this ID was declared. */
193
bool declared;
194
195
/** The OR of all writemasks used to write to this array. */
196
ubyte writemask;
197
198
/** The range with which the array was declared. */
199
struct tgsi_declaration_range range;
200
};
201
202
struct tgsi_tessctrl_info
203
{
204
/** Whether all codepaths write tess factors in all invocations. */
205
bool tessfactors_are_def_in_all_invocs;
206
};
207
208
extern void
209
tgsi_scan_shader(const struct tgsi_token *tokens,
210
struct tgsi_shader_info *info);
211
212
void
213
tgsi_scan_arrays(const struct tgsi_token *tokens,
214
unsigned file,
215
unsigned max_array_id,
216
struct tgsi_array_info *arrays);
217
218
void
219
tgsi_scan_tess_ctrl(const struct tgsi_token *tokens,
220
const struct tgsi_shader_info *info,
221
struct tgsi_tessctrl_info *out);
222
223
static inline bool
224
tgsi_is_bindless_image_file(unsigned file)
225
{
226
return file != TGSI_FILE_IMAGE &&
227
file != TGSI_FILE_MEMORY &&
228
file != TGSI_FILE_BUFFER &&
229
file != TGSI_FILE_CONSTBUF &&
230
file != TGSI_FILE_HW_ATOMIC;
231
}
232
233
#ifdef __cplusplus
234
} // extern "C"
235
#endif
236
237
#endif /* TGSI_SCAN_H */
238
239