
According to the GLSL spec, the second parameter to #line should be an integer source string number and __FILE__ will be substituted with the integer source string number currently processed. This patch extends the syntax of #line and __FILE__. Now #line accepts as the second parameter a filename string quoted by double quotation marks. And if such a #line is set, __FILE__ will be substituted with the currently set filename string. The implementation is done via introducing a new extension GL_GOOGLE_cpp_style_line_directive using the extension framework. The purpose is to support cpp-style #line directives, which is required by #include.
177 lines
9.4 KiB
C++
177 lines
9.4 KiB
C++
//
|
|
//Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
//Copyright (C) 2012-2013 LunarG, Inc.
|
|
//
|
|
//All rights reserved.
|
|
//
|
|
//Redistribution and use in source and binary forms, with or without
|
|
//modification, are permitted provided that the following conditions
|
|
//are met:
|
|
//
|
|
// Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
//
|
|
// Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following
|
|
// disclaimer in the documentation and/or other materials provided
|
|
// with the distribution.
|
|
//
|
|
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
// contributors may be used to endorse or promote products derived
|
|
// from this software without specific prior written permission.
|
|
//
|
|
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
//POSSIBILITY OF SUCH DAMAGE.
|
|
//
|
|
#ifndef _VERSIONS_INCLUDED_
|
|
#define _VERSIONS_INCLUDED_
|
|
|
|
//
|
|
// Help manage multiple profiles, versions, extensions etc.
|
|
//
|
|
|
|
//
|
|
// Profiles are set up for masking operations, so queries can be done on multiple
|
|
// profiles at the same time.
|
|
//
|
|
// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
|
|
// defects from mixing the two different forms.
|
|
//
|
|
typedef enum {
|
|
EBadProfile = 0,
|
|
ENoProfile = (1 << 0), // only for desktop, before profiles showed up
|
|
ECoreProfile = (1 << 1),
|
|
ECompatibilityProfile = (1 << 2),
|
|
EEsProfile = (1 << 3)
|
|
} EProfile;
|
|
|
|
namespace glslang {
|
|
|
|
//
|
|
// Map from profile enum to externally readable text name.
|
|
//
|
|
inline const char* ProfileName(EProfile profile)
|
|
{
|
|
switch (profile) {
|
|
case ENoProfile: return "none";
|
|
case ECoreProfile: return "core";
|
|
case ECompatibilityProfile: return "compatibility";
|
|
case EEsProfile: return "es";
|
|
default: return "unknown profile";
|
|
}
|
|
}
|
|
|
|
//
|
|
// The behaviors from the GLSL "#extension extension_name : behavior"
|
|
//
|
|
typedef enum {
|
|
EBhMissing = 0,
|
|
EBhRequire,
|
|
EBhEnable,
|
|
EBhWarn,
|
|
EBhDisable,
|
|
EBhDisablePartial // use as initial state of an extension that is only partially implemented
|
|
} TExtensionBehavior;
|
|
|
|
//
|
|
// Symbolic names for extensions. Strings may be directly used when calling the
|
|
// functions, but better to have the compiler do spelling checks.
|
|
//
|
|
const char* const E_GL_OES_texture_3D = "GL_OES_texture_3D";
|
|
const char* const E_GL_OES_standard_derivatives = "GL_OES_standard_derivatives";
|
|
const char* const E_GL_EXT_frag_depth = "GL_EXT_frag_depth";
|
|
const char* const E_GL_OES_EGL_image_external = "GL_OES_EGL_image_external";
|
|
const char* const E_GL_EXT_shader_texture_lod = "GL_EXT_shader_texture_lod";
|
|
|
|
const char* const E_GL_ARB_texture_rectangle = "GL_ARB_texture_rectangle";
|
|
const char* const E_GL_3DL_array_objects = "GL_3DL_array_objects";
|
|
const char* const E_GL_ARB_shading_language_420pack = "GL_ARB_shading_language_420pack";
|
|
const char* const E_GL_ARB_texture_gather = "GL_ARB_texture_gather";
|
|
const char* const E_GL_ARB_gpu_shader5 = "GL_ARB_gpu_shader5";
|
|
const char* const E_GL_ARB_separate_shader_objects = "GL_ARB_separate_shader_objects";
|
|
const char* const E_GL_ARB_compute_shader = "GL_ARB_compute_shader";
|
|
const char* const E_GL_ARB_tessellation_shader = "GL_ARB_tessellation_shader";
|
|
const char* const E_GL_ARB_enhanced_layouts = "GL_ARB_enhanced_layouts";
|
|
const char* const E_GL_ARB_texture_cube_map_array = "GL_ARB_texture_cube_map_array";
|
|
const char* const E_GL_ARB_shader_texture_lod = "GL_ARB_shader_texture_lod";
|
|
const char* const E_GL_ARB_explicit_attrib_location = "GL_ARB_explicit_attrib_location";
|
|
const char* const E_GL_ARB_shader_image_load_store = "GL_ARB_shader_image_load_store";
|
|
const char* const E_GL_ARB_shader_atomic_counters = "GL_ARB_shader_atomic_counters";
|
|
const char* const E_GL_ARB_derivative_control = "GL_ARB_derivative_control";
|
|
const char* const E_GL_ARB_shader_texture_image_samples = "GL_ARB_shader_texture_image_samples";
|
|
const char* const E_GL_ARB_viewport_array = "GL_ARB_viewport_array";
|
|
//const char* const E_GL_ARB_cull_distance = "GL_ARB_cull_distance"; // present for 4.5, but need extension control over block members
|
|
|
|
// AEP
|
|
const char* const E_GL_ANDROID_extension_pack_es31a = "GL_ANDROID_extension_pack_es31a";
|
|
const char* const E_GL_KHR_blend_equation_advanced = "GL_KHR_blend_equation_advanced";
|
|
const char* const E_GL_OES_sample_variables = "GL_OES_sample_variables";
|
|
const char* const E_GL_OES_shader_image_atomic = "GL_OES_shader_image_atomic";
|
|
const char* const E_GL_OES_shader_multisample_interpolation = "GL_OES_shader_multisample_interpolation";
|
|
const char* const E_GL_OES_texture_storage_multisample_2d_array = "GL_OES_texture_storage_multisample_2d_array";
|
|
const char* const E_GL_EXT_geometry_shader = "GL_EXT_geometry_shader";
|
|
const char* const E_GL_EXT_geometry_point_size = "GL_EXT_geometry_point_size";
|
|
const char* const E_GL_EXT_gpu_shader5 = "GL_EXT_gpu_shader5";
|
|
const char* const E_GL_EXT_primitive_bounding_box = "GL_EXT_primitive_bounding_box";
|
|
const char* const E_GL_EXT_shader_io_blocks = "GL_EXT_shader_io_blocks";
|
|
const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessellation_shader";
|
|
const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size";
|
|
const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer";
|
|
const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array";
|
|
|
|
const char* const E_GL_GOOGLE_cpp_style_line_directive = "GL_GOOGLE_cpp_style_line_directive";
|
|
|
|
// OES matching AEP
|
|
const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";
|
|
const char* const E_GL_OES_geometry_point_size = "GL_OES_geometry_point_size";
|
|
const char* const E_GL_OES_gpu_shader5 = "GL_OES_gpu_shader5";
|
|
const char* const E_GL_OES_primitive_bounding_box = "GL_OES_primitive_bounding_box";
|
|
const char* const E_GL_OES_shader_io_blocks = "GL_OES_shader_io_blocks";
|
|
const char* const E_GL_OES_tessellation_shader = "GL_OES_tessellation_shader";
|
|
const char* const E_GL_OES_tessellation_point_size = "GL_OES_tessellation_point_size";
|
|
const char* const E_GL_OES_texture_buffer = "GL_OES_texture_buffer";
|
|
const char* const E_GL_OES_texture_cube_map_array = "GL_OES_texture_cube_map_array";
|
|
|
|
// Arrays of extensions for the above AEP duplications
|
|
|
|
const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader };
|
|
const int Num_AEP_geometry_shader = sizeof(AEP_geometry_shader)/sizeof(AEP_geometry_shader[0]);
|
|
|
|
const char* const AEP_geometry_point_size[] = { E_GL_EXT_geometry_point_size, E_GL_OES_geometry_point_size };
|
|
const int Num_AEP_geometry_point_size = sizeof(AEP_geometry_point_size)/sizeof(AEP_geometry_point_size[0]);
|
|
|
|
const char* const AEP_gpu_shader5[] = { E_GL_EXT_gpu_shader5, E_GL_OES_gpu_shader5 };
|
|
const int Num_AEP_gpu_shader5 = sizeof(AEP_gpu_shader5)/sizeof(AEP_gpu_shader5[0]);
|
|
|
|
const char* const AEP_primitive_bounding_box[] = { E_GL_EXT_primitive_bounding_box, E_GL_OES_primitive_bounding_box };
|
|
const int Num_AEP_primitive_bounding_box = sizeof(AEP_primitive_bounding_box)/sizeof(AEP_primitive_bounding_box[0]);
|
|
|
|
const char* const AEP_shader_io_blocks[] = { E_GL_EXT_shader_io_blocks, E_GL_OES_shader_io_blocks };
|
|
const int Num_AEP_shader_io_blocks = sizeof(AEP_shader_io_blocks)/sizeof(AEP_shader_io_blocks[0]);
|
|
|
|
const char* const AEP_tessellation_shader[] = { E_GL_EXT_tessellation_shader, E_GL_OES_tessellation_shader };
|
|
const int Num_AEP_tessellation_shader = sizeof(AEP_tessellation_shader)/sizeof(AEP_tessellation_shader[0]);
|
|
|
|
const char* const AEP_tessellation_point_size[] = { E_GL_EXT_tessellation_point_size, E_GL_OES_tessellation_point_size };
|
|
const int Num_AEP_tessellation_point_size = sizeof(AEP_tessellation_point_size)/sizeof(AEP_tessellation_point_size[0]);
|
|
|
|
const char* const AEP_texture_buffer[] = { E_GL_EXT_texture_buffer, E_GL_OES_texture_buffer };
|
|
const int Num_AEP_texture_buffer = sizeof(AEP_texture_buffer)/sizeof(AEP_texture_buffer[0]);
|
|
|
|
const char* const AEP_texture_cube_map_array[] = { E_GL_EXT_texture_cube_map_array, E_GL_OES_texture_cube_map_array };
|
|
const int Num_AEP_texture_cube_map_array = sizeof(AEP_texture_cube_map_array)/sizeof(AEP_texture_cube_map_array[0]);
|
|
|
|
} // end namespace glslang
|
|
|
|
#endif // _VERSIONS_INCLUDED_
|