summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/tgsi/tgsi_scan.h
blob: 0f872b00220d19a92969d278cc259a01620a8069 (plain)
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
/**************************************************************************
 * 
 * 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 "pipe/p_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
{
   uint num_tokens;

   ubyte num_inputs;
   ubyte num_outputs;
   ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
   ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
   ubyte input_interpolate[PIPE_MAX_SHADER_INPUTS];
   ubyte input_interpolate_loc[PIPE_MAX_SHADER_INPUTS];
   ubyte input_usage_mask[PIPE_MAX_SHADER_INPUTS];
   ubyte input_cylindrical_wrap[PIPE_MAX_SHADER_INPUTS];
   ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
   ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
   ubyte output_usagemask[PIPE_MAX_SHADER_OUTPUTS];
   ubyte output_streams[PIPE_MAX_SHADER_OUTPUTS];

   ubyte num_system_values;
   ubyte system_value_semantic_name[PIPE_MAX_SHADER_INPUTS];

   ubyte processor;

   uint file_mask[TGSI_FILE_COUNT];  /**< bitmask of declared registers */
   uint 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 */
   ubyte sampler_targets[PIPE_MAX_SHADER_SAMPLER_VIEWS];  /**< TGSI_TEXTURE_x values */
   ubyte sampler_type[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_RETURN_TYPE_x */
   ubyte num_stream_output_components[4];

   ubyte input_array_first[PIPE_MAX_SHADER_INPUTS];
   ubyte input_array_last[PIPE_MAX_SHADER_INPUTS];
   ubyte output_array_first[PIPE_MAX_SHADER_OUTPUTS];
   ubyte output_array_last[PIPE_MAX_SHADER_OUTPUTS];
   unsigned array_max[TGSI_FILE_COUNT];  /**< highest index array per register file */

   uint immediate_count; /**< number of immediates declared */
   uint num_instructions;
   uint num_memory_instructions; /**< sampler, buffer, and image instructions */

   uint opcode_count[TGSI_OPCODE_LAST];  /**< opcode histogram */

   /**
    * If a tessellation control shader reads outputs, this describes which ones.
    */
   boolean reads_pervertex_outputs;
   boolean reads_perpatch_outputs;
   boolean reads_tessfactor_outputs;

   ubyte colors_read; /**< which color components are read by the FS */
   ubyte colors_written;
   boolean reads_position; /**< does fragment shader read position? */
   boolean reads_z; /**< does fragment shader read depth? */
   boolean reads_samplemask; /**< does fragment shader read sample mask? */
   boolean reads_tess_factors; /**< If TES reads TESSINNER or TESSOUTER */
   boolean writes_z;  /**< does fragment shader write Z value? */
   boolean writes_stencil; /**< does fragment shader write stencil value? */
   boolean writes_samplemask; /**< does fragment shader write sample mask? */
   boolean writes_edgeflag; /**< vertex shader outputs edgeflag */
   boolean uses_kill;  /**< KILL or KILL_IF instruction used? */
   boolean uses_persp_center;
   boolean uses_persp_centroid;
   boolean uses_persp_sample;
   boolean uses_linear_center;
   boolean uses_linear_centroid;
   boolean uses_linear_sample;
   boolean uses_persp_opcode_interp_centroid;
   boolean uses_persp_opcode_interp_offset;
   boolean uses_persp_opcode_interp_sample;
   boolean uses_linear_opcode_interp_centroid;
   boolean uses_linear_opcode_interp_offset;
   boolean uses_linear_opcode_interp_sample;
   boolean uses_instanceid;
   boolean uses_vertexid;
   boolean uses_vertexid_nobase;
   boolean uses_basevertex;
   boolean uses_primid;
   boolean uses_frontface;
   boolean uses_invocationid;
   boolean uses_thread_id[3];
   boolean uses_block_id[3];
   boolean uses_block_size;
   boolean uses_grid_size;
   boolean writes_position;
   boolean writes_psize;
   boolean writes_clipvertex;
   boolean writes_primid;
   boolean writes_viewport_index;
   boolean writes_layer;
   boolean writes_memory; /**< contains stores or atomics to buffers or images */
   boolean is_msaa_sampler[PIPE_MAX_SAMPLERS];
   boolean uses_doubles; /**< uses any of the double instructions */
   boolean uses_derivatives;
   boolean uses_bindless_samplers;
   boolean uses_bindless_images;
   unsigned clipdist_writemask;
   unsigned culldist_writemask;
   unsigned num_written_culldistance;
   unsigned num_written_clipdistance;

   unsigned images_declared; /**< bitmask of declared images */
   /**
    * Bitmask indicating which declared image is a buffer.
    */
   unsigned images_buffers;
   unsigned images_load; /**< bitmask of images using loads */
   unsigned images_store; /**< bitmask of images using stores */
   unsigned images_atomic; /**< bitmask of images using atomics */
   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 */
   /**
    * 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 indirect_files_read;
   unsigned indirect_files_written;
   unsigned dim_indirect_files; /**< shader resource indexing */
   unsigned const_buffers_indirect; /**< const buffers using indirect addressing */

   unsigned properties[TGSI_PROPERTY_COUNT]; /* index with TGSI_PROPERTY_ */

   /**
    * Max nesting limit of loops/if's
    */
   unsigned max_depth;
};

struct tgsi_array_info
{
   /** Whether an array with this ID was declared. */
   bool declared;

   /** The OR of all writemasks used to write to this array. */
   ubyte writemask;

   /** The range with which the array was declared. */
   struct tgsi_declaration_range range;
};

struct tgsi_tessctrl_info
{
   /** Whether all codepaths write tess factors in all invocations. */
   bool tessfactors_are_def_in_all_invocs;
};

extern void
tgsi_scan_shader(const struct tgsi_token *tokens,
                 struct tgsi_shader_info *info);

void
tgsi_scan_arrays(const struct tgsi_token *tokens,
                 unsigned file,
                 unsigned max_array_id,
                 struct tgsi_array_info *arrays);

void
tgsi_scan_tess_ctrl(const struct tgsi_token *tokens,
                    const struct tgsi_shader_info *info,
                    struct tgsi_tessctrl_info *out);

static inline bool
tgsi_is_bindless_image_file(unsigned file)
{
   return file != TGSI_FILE_IMAGE &&
          file != TGSI_FILE_MEMORY &&
          file != TGSI_FILE_BUFFER;
}

#ifdef __cplusplus
} // extern "C"
#endif

#endif /* TGSI_SCAN_H */