Home | History | Annotate | Download | only in MachineIndependent
      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