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