• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
32 extern "C" {
33 #endif
34 
35 struct spirv_supported_capabilities {
36    bool float64;
37    bool image_ms_array;
38    bool tessellation;
39    bool draw_parameters;
40    bool image_read_without_format;
41    bool image_write_without_format;
42    bool int64;
43    bool multiview;
44    bool variable_pointers;
45    bool storage_16bit;
46 };
47 
48 typedef struct shader_info {
49    const char *name;
50 
51    /* Descriptive name provided by the client; may be NULL */
52    const char *label;
53 
54    /** The shader stage, such as MESA_SHADER_VERTEX. */
55    gl_shader_stage stage;
56 
57    /* Number of textures used by this shader */
58    unsigned num_textures;
59    /* Number of uniform buffers used by this shader */
60    unsigned num_ubos;
61    /* Number of atomic buffers used by this shader */
62    unsigned num_abos;
63    /* Number of shader storage buffers used by this shader */
64    unsigned num_ssbos;
65    /* Number of images used by this shader */
66    unsigned num_images;
67 
68    /* Which inputs are actually read */
69    uint64_t inputs_read;
70    /* Which inputs are actually read and are double */
71    uint64_t double_inputs_read;
72    /* Which outputs are actually written */
73    uint64_t outputs_written;
74    /* Which outputs are actually read */
75    uint64_t outputs_read;
76    /* Which system values are actually read */
77    uint64_t system_values_read;
78 
79    /* Which patch inputs are actually read */
80    uint32_t patch_inputs_read;
81    /* Which patch outputs are actually written */
82    uint32_t patch_outputs_written;
83    /* Which patch outputs are read */
84    uint32_t patch_outputs_read;
85 
86    /* Whether or not this shader ever uses textureGather() */
87    bool uses_texture_gather;
88 
89    /** Bitfield of which textures are used by texelFetch() */
90    uint32_t textures_used_by_txf;
91 
92    /**
93     * True if this shader uses the fddx/fddy opcodes.
94     *
95     * Note that this does not include the "fine" and "coarse" variants.
96     */
97    bool uses_fddx_fddy;
98 
99    /* The size of the gl_ClipDistance[] array, if declared. */
100    unsigned clip_distance_array_size;
101 
102    /* The size of the gl_CullDistance[] array, if declared. */
103    unsigned cull_distance_array_size;
104 
105    /* Whether or not separate shader objects were used */
106    bool separate_shader;
107 
108    /** Was this shader linked with any transform feedback varyings? */
109    bool has_transform_feedback_varyings;
110 
111    union {
112       struct {
113          /** The number of vertices recieves per input primitive */
114          unsigned vertices_in;
115 
116          /** The output primitive type (GL enum value) */
117          unsigned output_primitive;
118 
119          /** The input primitive type (GL enum value) */
120          unsigned input_primitive;
121 
122          /** The maximum number of vertices the geometry shader might write. */
123          unsigned vertices_out;
124 
125          /** 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS */
126          unsigned invocations;
127 
128          /** Whether or not this shader uses EndPrimitive */
129          bool uses_end_primitive;
130 
131          /** Whether or not this shader uses non-zero streams */
132          bool uses_streams;
133       } gs;
134 
135       struct {
136          bool uses_discard;
137 
138          /**
139           * Whether any inputs are declared with the "sample" qualifier.
140           */
141          bool uses_sample_qualifier;
142 
143          /**
144           * Whether early fragment tests are enabled as defined by
145           * ARB_shader_image_load_store.
146           */
147          bool early_fragment_tests;
148 
149          /**
150           * Defined by INTEL_conservative_rasterization.
151           */
152          bool inner_coverage;
153 
154          bool post_depth_coverage;
155 
156          /** gl_FragDepth layout for ARB_conservative_depth. */
157          enum gl_frag_depth_layout depth_layout;
158       } fs;
159 
160       struct {
161          unsigned local_size[3];
162 
163          bool local_size_variable;
164 
165          /**
166           * Size of shared variables accessed by the compute shader.
167           */
168          unsigned shared_size;
169       } cs;
170 
171       /* Applies to both TCS and TES. */
172       struct {
173          /** The number of vertices in the TCS output patch. */
174          unsigned tcs_vertices_out;
175 
176          uint32_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */
177          enum gl_tess_spacing spacing;
178          /** Is the vertex order counterclockwise? */
179          bool ccw;
180          bool point_mode;
181       } tess;
182    };
183 } shader_info;
184 
185 #ifdef __cplusplus
186 }
187 #endif
188 
189 #endif /* SHADER_INFO_H */
190