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