1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
/**************************************************************************
*
* Copyright 2008 VMware, Inc.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
#ifndef TGSI_SCAN_H
#define TGSI_SCAN_H
#include "util/compiler.h"
#include "pipe/p_state.h"
#include "pipe/p_shader_tokens.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Shader summary info
*/
struct tgsi_shader_info
{
uint8_t num_inputs;
uint8_t num_outputs;
uint8_t input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
uint8_t input_semantic_index[PIPE_MAX_SHADER_INPUTS];
uint8_t input_interpolate[PIPE_MAX_SHADER_INPUTS];
uint8_t input_interpolate_loc[PIPE_MAX_SHADER_INPUTS];
uint8_t input_usage_mask[PIPE_MAX_SHADER_INPUTS];
uint8_t output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
uint8_t output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
uint8_t output_usagemask[PIPE_MAX_SHADER_OUTPUTS];
uint8_t output_streams[PIPE_MAX_SHADER_OUTPUTS];
uint8_t num_system_values;
uint8_t system_value_semantic_name[PIPE_MAX_SHADER_INPUTS];
uint8_t processor;
uint32_t file_mask[TGSI_FILE_COUNT]; /**< bitmask of declared registers */
unsigned file_count[TGSI_FILE_COUNT]; /**< number of declared registers */
int file_max[TGSI_FILE_COUNT]; /**< highest index of declared registers */
int const_file_max[PIPE_MAX_CONSTANT_BUFFERS];
unsigned const_buffers_declared; /**< bitmask of declared const buffers */
unsigned samplers_declared; /**< bitmask of declared samplers */
uint8_t sampler_targets[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_TEXTURE_x values */
uint8_t sampler_type[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_RETURN_TYPE_x */
uint8_t num_stream_output_components[4];
uint8_t input_array_first[PIPE_MAX_SHADER_INPUTS];
uint8_t output_array_first[PIPE_MAX_SHADER_OUTPUTS];
unsigned immediate_count; /**< number of immediates declared */
unsigned num_instructions;
unsigned opcode_count[TGSI_OPCODE_LAST]; /**< opcode histogram */
/**
* If a tessellation control shader reads outputs, this describes which ones.
*/
bool reads_pervertex_outputs;
bool reads_perpatch_outputs;
bool reads_tessfactor_outputs;
bool reads_z; /**< does fragment shader read depth? */
bool writes_z; /**< does fragment shader write Z value? */
bool writes_stencil; /**< does fragment shader write stencil value? */
bool writes_samplemask; /**< does fragment shader write sample mask? */
bool writes_edgeflag; /**< vertex shader outputs edgeflag */
bool uses_kill; /**< KILL or KILL_IF instruction used? */
bool uses_instanceid;
bool uses_vertexid;
bool uses_vertexid_nobase;
bool uses_basevertex;
bool uses_primid;
bool uses_frontface;
bool uses_invocationid;
bool uses_grid_size;
bool writes_position;
bool writes_psize;
bool writes_clipvertex;
bool writes_viewport_index;
bool writes_layer;
bool writes_memory; /**< contains stores or atomics to buffers or images */
bool uses_fbfetch;
unsigned num_written_culldistance;
unsigned num_written_clipdistance;
unsigned images_declared; /**< bitmask of declared images */
unsigned msaa_images_declared; /**< bitmask of declared MSAA images */
/**
* Bitmask indicating which declared image is a buffer.
*/
unsigned images_buffers;
unsigned shader_buffers_declared; /**< bitmask of declared shader buffers */
unsigned shader_buffers_load; /**< bitmask of shader buffers using loads */
unsigned shader_buffers_store; /**< bitmask of shader buffers using stores */
unsigned shader_buffers_atomic; /**< bitmask of shader buffers using atomics */
unsigned hw_atomic_declared; /**< bitmask of declared atomic_counter */
/**
* Bitmask indicating which register files are accessed with
* indirect addressing. The bits are (1 << TGSI_FILE_x), etc.
*/
unsigned indirect_files;
/**
* Bitmask indicating which register files are read / written with
* indirect addressing. The bits are (1 << TGSI_FILE_x).
*/
unsigned dim_indirect_files; /**< shader resource indexing */
unsigned properties[TGSI_PROPERTY_COUNT]; /* index with TGSI_PROPERTY_ */
};
extern void
tgsi_scan_shader(const struct tgsi_token *tokens,
struct tgsi_shader_info *info);
static inline bool
tgsi_is_bindless_image_file(enum tgsi_file_type file)
{
return file != TGSI_FILE_IMAGE &&
file != TGSI_FILE_MEMORY &&
file != TGSI_FILE_BUFFER &&
file != TGSI_FILE_CONSTBUF &&
file != TGSI_FILE_HW_ATOMIC;
}
#ifdef __cplusplus
} // extern "C"
#endif
#endif /* TGSI_SCAN_H */
|