shader_info.h revision b8e80941
1/*
2 * Copyright © 2016 Intel Corporation
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 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 */
24
25#ifndef SHADER_INFO_H
26#define SHADER_INFO_H
27
28#include "shader_enums.h"
29#include <stdint.h>
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35struct spirv_supported_capabilities {
36   bool address;
37   bool atomic_storage;
38   bool derivative_group;
39   bool descriptor_array_dynamic_indexing;
40   bool descriptor_array_non_uniform_indexing;
41   bool descriptor_indexing;
42   bool device_group;
43   bool draw_parameters;
44   bool float64;
45   bool geometry_streams;
46   bool gcn_shader;
47   bool image_ms_array;
48   bool image_read_without_format;
49   bool image_write_without_format;
50   bool int8;
51   bool int16;
52   bool int64;
53   bool int64_atomics;
54   bool kernel;
55   bool min_lod;
56   bool multiview;
57   bool physical_storage_buffer_address;
58   bool post_depth_coverage;
59   bool runtime_descriptor_array;
60   bool shader_viewport_index_layer;
61   bool stencil_export;
62   bool storage_8bit;
63   bool storage_16bit;
64   bool storage_image_ms;
65   bool subgroup_arithmetic;
66   bool subgroup_ballot;
67   bool subgroup_basic;
68   bool subgroup_quad;
69   bool subgroup_shuffle;
70   bool subgroup_vote;
71   bool tessellation;
72   bool transform_feedback;
73   bool trinary_minmax;
74   bool variable_pointers;
75   bool float16;
76};
77
78typedef struct shader_info {
79   const char *name;
80
81   /* Descriptive name provided by the client; may be NULL */
82   const char *label;
83
84   /** The shader stage, such as MESA_SHADER_VERTEX. */
85   gl_shader_stage stage;
86
87   /** The shader stage in a non SSO linked program that follows this stage,
88     * such as MESA_SHADER_FRAGMENT.
89     */
90   gl_shader_stage next_stage;
91
92   /* Number of textures used by this shader */
93   unsigned num_textures;
94   /* Number of uniform buffers used by this shader */
95   unsigned num_ubos;
96   /* Number of atomic buffers used by this shader */
97   unsigned num_abos;
98   /* Number of shader storage buffers used by this shader */
99   unsigned num_ssbos;
100   /* Number of images used by this shader */
101   unsigned num_images;
102
103   /* Which inputs are actually read */
104   uint64_t inputs_read;
105   /* Which outputs are actually written */
106   uint64_t outputs_written;
107   /* Which outputs are actually read */
108   uint64_t outputs_read;
109   /* Which system values are actually read */
110   uint64_t system_values_read;
111
112   /* Which patch inputs are actually read */
113   uint32_t patch_inputs_read;
114   /* Which patch outputs are actually written */
115   uint32_t patch_outputs_written;
116   /* Which patch outputs are read */
117   uint32_t patch_outputs_read;
118
119   /* Whether or not this shader ever uses textureGather() */
120   bool uses_texture_gather;
121
122   /** Bitfield of which textures are used */
123   uint32_t textures_used;
124
125   /** Bitfield of which textures are used by texelFetch() */
126   uint32_t textures_used_by_txf;
127
128   /**
129    * True if this shader uses the fddx/fddy opcodes.
130    *
131    * Note that this does not include the "fine" and "coarse" variants.
132    */
133   bool uses_fddx_fddy;
134
135   /**
136    * True if this shader uses 64-bit ALU operations
137    */
138   bool uses_64bit;
139
140   /* The size of the gl_ClipDistance[] array, if declared. */
141   unsigned clip_distance_array_size;
142
143   /* The size of the gl_CullDistance[] array, if declared. */
144   unsigned cull_distance_array_size;
145
146   /* Whether or not separate shader objects were used */
147   bool separate_shader;
148
149   /** Was this shader linked with any transform feedback varyings? */
150   bool has_transform_feedback_varyings;
151
152   union {
153      struct {
154         /* Which inputs are doubles */
155         uint64_t double_inputs;
156
157         /* True if the shader writes position in window space coordinates pre-transform */
158         bool window_space_position;
159      } vs;
160
161      struct {
162         /** The number of vertices recieves per input primitive */
163         unsigned vertices_in;
164
165         /** The output primitive type (GL enum value) */
166         unsigned output_primitive;
167
168         /** The input primitive type (GL enum value) */
169         unsigned input_primitive;
170
171         /** The maximum number of vertices the geometry shader might write. */
172         unsigned vertices_out;
173
174         /** 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS */
175         unsigned invocations;
176
177         /** Whether or not this shader uses EndPrimitive */
178         bool uses_end_primitive;
179
180         /** Whether or not this shader uses non-zero streams */
181         bool uses_streams;
182      } gs;
183
184      struct {
185         bool uses_discard;
186
187         /**
188          * Whether any inputs are declared with the "sample" qualifier.
189          */
190         bool uses_sample_qualifier;
191
192         /**
193          * Whether early fragment tests are enabled as defined by
194          * ARB_shader_image_load_store.
195          */
196         bool early_fragment_tests;
197
198         /**
199          * Defined by INTEL_conservative_rasterization.
200          */
201         bool inner_coverage;
202
203         bool post_depth_coverage;
204
205         /**
206          * \name ARB_fragment_coord_conventions
207          * @{
208          */
209         bool pixel_center_integer;
210         bool origin_upper_left;
211         /*@}*/
212
213         bool pixel_interlock_ordered;
214         bool pixel_interlock_unordered;
215         bool sample_interlock_ordered;
216         bool sample_interlock_unordered;
217
218         /**
219          * Flags whether NIR's base types on the FS color outputs should be
220          * ignored.
221          *
222          * GLSL requires that fragment shader output base types match the
223          * render target's base types for the behavior to be defined.  From
224          * the GL 4.6 spec:
225          *
226          *     "If the values written by the fragment shader do not match the
227          *      format(s) of the corresponding color buffer(s), the result is
228          *      undefined."
229          *
230          * However, for NIR shaders translated from TGSI, we don't have the
231          * output types any more, so the driver will need to do whatever
232          * fixups are necessary to handle effectively untyped data being
233          * output from the FS.
234          */
235         bool untyped_color_outputs;
236
237         /** gl_FragDepth layout for ARB_conservative_depth. */
238         enum gl_frag_depth_layout depth_layout;
239      } fs;
240
241      struct {
242         unsigned local_size[3];
243
244         bool local_size_variable;
245
246         /**
247          * Size of shared variables accessed by the compute shader.
248          */
249         unsigned shared_size;
250
251
252         /**
253          * pointer size is:
254          *   AddressingModelLogical:    0    (default)
255          *   AddressingModelPhysical32: 32
256          *   AddressingModelPhysical64: 64
257          */
258         unsigned ptr_size;
259
260         /*
261          * Arrangement of invocations used to calculate derivatives in a compute
262          * shader.  From NV_compute_shader_derivatives.
263          */
264         enum gl_derivative_group derivative_group;
265      } cs;
266
267      /* Applies to both TCS and TES. */
268      struct {
269         /** The number of vertices in the TCS output patch. */
270         unsigned tcs_vertices_out;
271
272         uint32_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */
273         enum gl_tess_spacing spacing;
274         /** Is the vertex order counterclockwise? */
275         bool ccw;
276         bool point_mode;
277      } tess;
278   };
279} shader_info;
280
281#ifdef __cplusplus
282}
283#endif
284
285#endif /* SHADER_INFO_H */
286