1 // 2 // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. 3 // Copyright (C) 2012-2013 LunarG, Inc. 4 // Copyright (C) 2017 ARM Limited. 5 // Copyright (C) 2015-2018 Google, Inc. 6 // 7 // All rights reserved. 8 // 9 // Redistribution and use in source and binary forms, with or without 10 // modification, are permitted provided that the following conditions 11 // are met: 12 // 13 // Redistributions of source code must retain the above copyright 14 // notice, this list of conditions and the following disclaimer. 15 // 16 // Redistributions in binary form must reproduce the above 17 // copyright notice, this list of conditions and the following 18 // disclaimer in the documentation and/or other materials provided 19 // with the distribution. 20 // 21 // Neither the name of 3Dlabs Inc. Ltd. nor the names of its 22 // contributors may be used to endorse or promote products derived 23 // from this software without specific prior written permission. 24 // 25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 28 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 29 // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 30 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 31 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 32 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 33 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 35 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 // POSSIBILITY OF SUCH DAMAGE. 37 // 38 #ifndef _VERSIONS_INCLUDED_ 39 #define _VERSIONS_INCLUDED_ 40 41 // 42 // Help manage multiple profiles, versions, extensions etc. 43 // 44 45 // 46 // Profiles are set up for masking operations, so queries can be done on multiple 47 // profiles at the same time. 48 // 49 // Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible 50 // defects from mixing the two different forms. 51 // 52 typedef enum { 53 EBadProfile = 0, 54 ENoProfile = (1 << 0), // only for desktop, before profiles showed up 55 ECoreProfile = (1 << 1), 56 ECompatibilityProfile = (1 << 2), 57 EEsProfile = (1 << 3) 58 } EProfile; 59 60 namespace glslang { 61 62 // 63 // Map from profile enum to externally readable text name. 64 // 65 inline const char* ProfileName(EProfile profile) 66 { 67 switch (profile) { 68 case ENoProfile: return "none"; 69 case ECoreProfile: return "core"; 70 case ECompatibilityProfile: return "compatibility"; 71 case EEsProfile: return "es"; 72 default: return "unknown profile"; 73 } 74 } 75 76 // 77 // What source rules, validation rules, target language, etc. are needed 78 // desired for SPIR-V? 79 // 80 // 0 means a target or rule set is not enabled (ignore rules from that entity). 81 // Non-0 means to apply semantic rules arising from that version of its rule set. 82 // The union of all requested rule sets will be applied. 83 // 84 struct SpvVersion { 85 SpvVersion() : spv(0), vulkanGlsl(0), vulkan(0), openGl(0) {} 86 unsigned int spv; // the version of SPIR-V to target, as defined by "word 1" of the SPIR-V binary header 87 int vulkanGlsl; // the version of GLSL semantics for Vulkan, from GL_KHR_vulkan_glsl, for "#define VULKAN XXX" 88 int vulkan; // the version of Vulkan, for which SPIR-V execution environment rules to use 89 int openGl; // the version of GLSL semantics for OpenGL, from GL_ARB_gl_spirv, for "#define GL_SPIRV XXX" 90 }; 91 92 // 93 // The behaviors from the GLSL "#extension extension_name : behavior" 94 // 95 typedef enum { 96 EBhMissing = 0, 97 EBhRequire, 98 EBhEnable, 99 EBhWarn, 100 EBhDisable, 101 EBhDisablePartial // use as initial state of an extension that is only partially implemented 102 } TExtensionBehavior; 103 104 // 105 // Symbolic names for extensions. Strings may be directly used when calling the 106 // functions, but better to have the compiler do spelling checks. 107 // 108 const char* const E_GL_OES_texture_3D = "GL_OES_texture_3D"; 109 const char* const E_GL_OES_standard_derivatives = "GL_OES_standard_derivatives"; 110 const char* const E_GL_EXT_frag_depth = "GL_EXT_frag_depth"; 111 const char* const E_GL_OES_EGL_image_external = "GL_OES_EGL_image_external"; 112 const char* const E_GL_OES_EGL_image_external_essl3 = "GL_OES_EGL_image_external_essl3"; 113 const char* const E_GL_EXT_shader_texture_lod = "GL_EXT_shader_texture_lod"; 114 const char* const E_GL_EXT_shadow_samplers = "GL_EXT_shadow_samplers"; 115 116 const char* const E_GL_ARB_texture_rectangle = "GL_ARB_texture_rectangle"; 117 const char* const E_GL_3DL_array_objects = "GL_3DL_array_objects"; 118 const char* const E_GL_ARB_shading_language_420pack = "GL_ARB_shading_language_420pack"; 119 const char* const E_GL_ARB_texture_gather = "GL_ARB_texture_gather"; 120 const char* const E_GL_ARB_gpu_shader5 = "GL_ARB_gpu_shader5"; 121 const char* const E_GL_ARB_separate_shader_objects = "GL_ARB_separate_shader_objects"; 122 const char* const E_GL_ARB_compute_shader = "GL_ARB_compute_shader"; 123 const char* const E_GL_ARB_tessellation_shader = "GL_ARB_tessellation_shader"; 124 const char* const E_GL_ARB_enhanced_layouts = "GL_ARB_enhanced_layouts"; 125 const char* const E_GL_ARB_texture_cube_map_array = "GL_ARB_texture_cube_map_array"; 126 const char* const E_GL_ARB_shader_texture_lod = "GL_ARB_shader_texture_lod"; 127 const char* const E_GL_ARB_explicit_attrib_location = "GL_ARB_explicit_attrib_location"; 128 const char* const E_GL_ARB_shader_image_load_store = "GL_ARB_shader_image_load_store"; 129 const char* const E_GL_ARB_shader_atomic_counters = "GL_ARB_shader_atomic_counters"; 130 const char* const E_GL_ARB_shader_draw_parameters = "GL_ARB_shader_draw_parameters"; 131 const char* const E_GL_ARB_shader_group_vote = "GL_ARB_shader_group_vote"; 132 const char* const E_GL_ARB_derivative_control = "GL_ARB_derivative_control"; 133 const char* const E_GL_ARB_shader_texture_image_samples = "GL_ARB_shader_texture_image_samples"; 134 const char* const E_GL_ARB_viewport_array = "GL_ARB_viewport_array"; 135 const char* const E_GL_ARB_gpu_shader_int64 = "GL_ARB_gpu_shader_int64"; 136 const char* const E_GL_ARB_shader_ballot = "GL_ARB_shader_ballot"; 137 const char* const E_GL_ARB_sparse_texture2 = "GL_ARB_sparse_texture2"; 138 const char* const E_GL_ARB_sparse_texture_clamp = "GL_ARB_sparse_texture_clamp"; 139 const char* const E_GL_ARB_shader_stencil_export = "GL_ARB_shader_stencil_export"; 140 // const char* const E_GL_ARB_cull_distance = "GL_ARB_cull_distance"; // present for 4.5, but need extension control over block members 141 const char* const E_GL_ARB_post_depth_coverage = "GL_ARB_post_depth_coverage"; 142 const char* const E_GL_ARB_shader_viewport_layer_array = "GL_ARB_shader_viewport_layer_array"; 143 144 const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic"; 145 const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote"; 146 const char* const E_GL_KHR_shader_subgroup_arithmetic = "GL_KHR_shader_subgroup_arithmetic"; 147 const char* const E_GL_KHR_shader_subgroup_ballot = "GL_KHR_shader_subgroup_ballot"; 148 const char* const E_GL_KHR_shader_subgroup_shuffle = "GL_KHR_shader_subgroup_shuffle"; 149 const char* const E_GL_KHR_shader_subgroup_shuffle_relative = "GL_KHR_shader_subgroup_shuffle_relative"; 150 const char* const E_GL_KHR_shader_subgroup_clustered = "GL_KHR_shader_subgroup_clustered"; 151 const char* const E_GL_KHR_shader_subgroup_quad = "GL_KHR_shader_subgroup_quad"; 152 const char* const E_GL_KHR_memory_scope_semantics = "GL_KHR_memory_scope_semantics"; 153 154 const char* const E_GL_EXT_shader_atomic_int64 = "GL_EXT_shader_atomic_int64"; 155 156 const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers"; 157 const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted"; 158 159 const char* const E_GL_EXT_shader_16bit_storage = "GL_EXT_shader_16bit_storage"; 160 const char* const E_GL_EXT_shader_8bit_storage = "GL_EXT_shader_8bit_storage"; 161 162 163 // EXT extensions 164 const char* const E_GL_EXT_device_group = "GL_EXT_device_group"; 165 const char* const E_GL_EXT_multiview = "GL_EXT_multiview"; 166 const char* const E_GL_EXT_post_depth_coverage = "GL_EXT_post_depth_coverage"; 167 const char* const E_GL_EXT_control_flow_attributes = "GL_EXT_control_flow_attributes"; 168 const char* const E_GL_EXT_nonuniform_qualifier = "GL_EXT_nonuniform_qualifier"; 169 const char* const E_GL_EXT_samplerless_texture_functions = "GL_EXT_samplerless_texture_functions"; 170 const char* const E_GL_EXT_scalar_block_layout = "GL_EXT_scalar_block_layout"; 171 const char* const E_GL_EXT_fragment_invocation_density = "GL_EXT_fragment_invocation_density"; 172 const char* const E_GL_EXT_buffer_reference = "GL_EXT_buffer_reference"; 173 174 // Arrays of extensions for the above viewportEXTs duplications 175 176 const char* const post_depth_coverageEXTs[] = { E_GL_ARB_post_depth_coverage, E_GL_EXT_post_depth_coverage }; 177 const int Num_post_depth_coverageEXTs = sizeof(post_depth_coverageEXTs) / sizeof(post_depth_coverageEXTs[0]); 178 179 // OVR extensions 180 const char* const E_GL_OVR_multiview = "GL_OVR_multiview"; 181 const char* const E_GL_OVR_multiview2 = "GL_OVR_multiview2"; 182 183 const char* const OVR_multiview_EXTs[] = { E_GL_OVR_multiview, E_GL_OVR_multiview2 }; 184 const int Num_OVR_multiview_EXTs = sizeof(OVR_multiview_EXTs) / sizeof(OVR_multiview_EXTs[0]); 185 186 // #line and #include 187 const char* const E_GL_GOOGLE_cpp_style_line_directive = "GL_GOOGLE_cpp_style_line_directive"; 188 const char* const E_GL_GOOGLE_include_directive = "GL_GOOGLE_include_directive"; 189 190 #ifdef AMD_EXTENSIONS 191 const char* const E_GL_AMD_shader_ballot = "GL_AMD_shader_ballot"; 192 const char* const E_GL_AMD_shader_trinary_minmax = "GL_AMD_shader_trinary_minmax"; 193 const char* const E_GL_AMD_shader_explicit_vertex_parameter = "GL_AMD_shader_explicit_vertex_parameter"; 194 const char* const E_GL_AMD_gcn_shader = "GL_AMD_gcn_shader"; 195 const char* const E_GL_AMD_gpu_shader_half_float = "GL_AMD_gpu_shader_half_float"; 196 const char* const E_GL_AMD_texture_gather_bias_lod = "GL_AMD_texture_gather_bias_lod"; 197 const char* const E_GL_AMD_gpu_shader_int16 = "GL_AMD_gpu_shader_int16"; 198 const char* const E_GL_AMD_shader_image_load_store_lod = "GL_AMD_shader_image_load_store_lod"; 199 const char* const E_GL_AMD_shader_fragment_mask = "GL_AMD_shader_fragment_mask"; 200 const char* const E_GL_AMD_gpu_shader_half_float_fetch = "GL_AMD_gpu_shader_half_float_fetch"; 201 #endif 202 203 #ifdef NV_EXTENSIONS 204 205 const char* const E_GL_NV_sample_mask_override_coverage = "GL_NV_sample_mask_override_coverage"; 206 const char* const E_SPV_NV_geometry_shader_passthrough = "GL_NV_geometry_shader_passthrough"; 207 const char* const E_GL_NV_viewport_array2 = "GL_NV_viewport_array2"; 208 const char* const E_GL_NV_stereo_view_rendering = "GL_NV_stereo_view_rendering"; 209 const char* const E_GL_NVX_multiview_per_view_attributes = "GL_NVX_multiview_per_view_attributes"; 210 const char* const E_GL_NV_shader_atomic_int64 = "GL_NV_shader_atomic_int64"; 211 const char* const E_GL_NV_conservative_raster_underestimation = "GL_NV_conservative_raster_underestimation"; 212 const char* const E_GL_NV_shader_noperspective_interpolation = "GL_NV_shader_noperspective_interpolation"; 213 const char* const E_GL_NV_shader_subgroup_partitioned = "GL_NV_shader_subgroup_partitioned"; 214 const char* const E_GL_NV_shading_rate_image = "GL_NV_shading_rate_image"; 215 const char* const E_GL_NV_ray_tracing = "GL_NV_ray_tracing"; 216 const char* const E_GL_NV_fragment_shader_barycentric = "GL_NV_fragment_shader_barycentric"; 217 const char* const E_GL_NV_compute_shader_derivatives = "GL_NV_compute_shader_derivatives"; 218 const char* const E_GL_NV_shader_texture_footprint = "GL_NV_shader_texture_footprint"; 219 const char* const E_GL_NV_mesh_shader = "GL_NV_mesh_shader"; 220 221 // Arrays of extensions for the above viewportEXTs duplications 222 223 const char* const viewportEXTs[] = { E_GL_ARB_shader_viewport_layer_array, E_GL_NV_viewport_array2 }; 224 const int Num_viewportEXTs = sizeof(viewportEXTs) / sizeof(viewportEXTs[0]); 225 #endif 226 227 // AEP 228 const char* const E_GL_ANDROID_extension_pack_es31a = "GL_ANDROID_extension_pack_es31a"; 229 const char* const E_GL_KHR_blend_equation_advanced = "GL_KHR_blend_equation_advanced"; 230 const char* const E_GL_OES_sample_variables = "GL_OES_sample_variables"; 231 const char* const E_GL_OES_shader_image_atomic = "GL_OES_shader_image_atomic"; 232 const char* const E_GL_OES_shader_multisample_interpolation = "GL_OES_shader_multisample_interpolation"; 233 const char* const E_GL_OES_texture_storage_multisample_2d_array = "GL_OES_texture_storage_multisample_2d_array"; 234 const char* const E_GL_EXT_geometry_shader = "GL_EXT_geometry_shader"; 235 const char* const E_GL_EXT_geometry_point_size = "GL_EXT_geometry_point_size"; 236 const char* const E_GL_EXT_gpu_shader5 = "GL_EXT_gpu_shader5"; 237 const char* const E_GL_EXT_primitive_bounding_box = "GL_EXT_primitive_bounding_box"; 238 const char* const E_GL_EXT_shader_io_blocks = "GL_EXT_shader_io_blocks"; 239 const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessellation_shader"; 240 const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size"; 241 const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer"; 242 const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array"; 243 244 // OES matching AEP 245 const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader"; 246 const char* const E_GL_OES_geometry_point_size = "GL_OES_geometry_point_size"; 247 const char* const E_GL_OES_gpu_shader5 = "GL_OES_gpu_shader5"; 248 const char* const E_GL_OES_primitive_bounding_box = "GL_OES_primitive_bounding_box"; 249 const char* const E_GL_OES_shader_io_blocks = "GL_OES_shader_io_blocks"; 250 const char* const E_GL_OES_tessellation_shader = "GL_OES_tessellation_shader"; 251 const char* const E_GL_OES_tessellation_point_size = "GL_OES_tessellation_point_size"; 252 const char* const E_GL_OES_texture_buffer = "GL_OES_texture_buffer"; 253 const char* const E_GL_OES_texture_cube_map_array = "GL_OES_texture_cube_map_array"; 254 255 // KHX 256 const char* const E_GL_EXT_shader_explicit_arithmetic_types = "GL_EXT_shader_explicit_arithmetic_types"; 257 const char* const E_GL_EXT_shader_explicit_arithmetic_types_int8 = "GL_EXT_shader_explicit_arithmetic_types_int8"; 258 const char* const E_GL_EXT_shader_explicit_arithmetic_types_int16 = "GL_EXT_shader_explicit_arithmetic_types_int16"; 259 const char* const E_GL_EXT_shader_explicit_arithmetic_types_int32 = "GL_EXT_shader_explicit_arithmetic_types_int32"; 260 const char* const E_GL_EXT_shader_explicit_arithmetic_types_int64 = "GL_EXT_shader_explicit_arithmetic_types_int64"; 261 const char* const E_GL_EXT_shader_explicit_arithmetic_types_float16 = "GL_EXT_shader_explicit_arithmetic_types_float16"; 262 const char* const E_GL_EXT_shader_explicit_arithmetic_types_float32 = "GL_EXT_shader_explicit_arithmetic_types_float32"; 263 const char* const E_GL_EXT_shader_explicit_arithmetic_types_float64 = "GL_EXT_shader_explicit_arithmetic_types_float64"; 264 265 // Arrays of extensions for the above AEP duplications 266 267 const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader }; 268 const int Num_AEP_geometry_shader = sizeof(AEP_geometry_shader)/sizeof(AEP_geometry_shader[0]); 269 270 const char* const AEP_geometry_point_size[] = { E_GL_EXT_geometry_point_size, E_GL_OES_geometry_point_size }; 271 const int Num_AEP_geometry_point_size = sizeof(AEP_geometry_point_size)/sizeof(AEP_geometry_point_size[0]); 272 273 const char* const AEP_gpu_shader5[] = { E_GL_EXT_gpu_shader5, E_GL_OES_gpu_shader5 }; 274 const int Num_AEP_gpu_shader5 = sizeof(AEP_gpu_shader5)/sizeof(AEP_gpu_shader5[0]); 275 276 const char* const AEP_primitive_bounding_box[] = { E_GL_EXT_primitive_bounding_box, E_GL_OES_primitive_bounding_box }; 277 const int Num_AEP_primitive_bounding_box = sizeof(AEP_primitive_bounding_box)/sizeof(AEP_primitive_bounding_box[0]); 278 279 const char* const AEP_shader_io_blocks[] = { E_GL_EXT_shader_io_blocks, E_GL_OES_shader_io_blocks }; 280 const int Num_AEP_shader_io_blocks = sizeof(AEP_shader_io_blocks)/sizeof(AEP_shader_io_blocks[0]); 281 282 const char* const AEP_tessellation_shader[] = { E_GL_EXT_tessellation_shader, E_GL_OES_tessellation_shader }; 283 const int Num_AEP_tessellation_shader = sizeof(AEP_tessellation_shader)/sizeof(AEP_tessellation_shader[0]); 284 285 const char* const AEP_tessellation_point_size[] = { E_GL_EXT_tessellation_point_size, E_GL_OES_tessellation_point_size }; 286 const int Num_AEP_tessellation_point_size = sizeof(AEP_tessellation_point_size)/sizeof(AEP_tessellation_point_size[0]); 287 288 const char* const AEP_texture_buffer[] = { E_GL_EXT_texture_buffer, E_GL_OES_texture_buffer }; 289 const int Num_AEP_texture_buffer = sizeof(AEP_texture_buffer)/sizeof(AEP_texture_buffer[0]); 290 291 const char* const AEP_texture_cube_map_array[] = { E_GL_EXT_texture_cube_map_array, E_GL_OES_texture_cube_map_array }; 292 const int Num_AEP_texture_cube_map_array = sizeof(AEP_texture_cube_map_array)/sizeof(AEP_texture_cube_map_array[0]); 293 294 } // end namespace glslang 295 296 #endif // _VERSIONS_INCLUDED_ 297