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