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