@ -67,12 +67,12 @@
namespace Magnum { namespace GL {
namespace Magnum { namespace GL {
const std : : vector < Extension > & Extension : : extensions ( Version version ) {
namespace {
# define _extension(vendor, extension) \
# define _extension(vendor, extension) \
{ Extensions : : vendor : : extension : : Index , Extensions : : vendor : : extension : : requiredVersion ( ) , Extensions : : vendor : : extension : : coreVersion ( ) , Extensions : : vendor : : extension : : string ( ) }
{ Extensions : : vendor : : extension : : Index , Extensions : : vendor : : extension : : requiredVersion ( ) , Extensions : : vendor : : extension : : coreVersion ( ) , Extensions : : vendor : : extension : : string ( ) }
static const std : : vector < Extension > empty ;
# ifndef MAGNUM_TARGET_GLES
# ifndef MAGNUM_TARGET_GLES
static const std : : vector < Extension > extensions {
constexpr Extension ExtensionList [ ] {
_extension ( AMD , transform_feedback3_lines_triangles ) ,
_extension ( AMD , transform_feedback3_lines_triangles ) ,
_extension ( AMD , vertex_shader_layer ) ,
_extension ( AMD , vertex_shader_layer ) ,
_extension ( AMD , shader_trinary_minmax ) ,
_extension ( AMD , shader_trinary_minmax ) ,
@ -99,7 +99,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( KHR , texture_compression_astc_hdr ) ,
_extension ( KHR , texture_compression_astc_hdr ) ,
_extension ( KHR , blend_equation_advanced ) ,
_extension ( KHR , blend_equation_advanced ) ,
_extension ( KHR , blend_equation_advanced_coherent ) } ;
_extension ( KHR , blend_equation_advanced_coherent ) } ;
static const std : : vector < Extension > extensions300 {
constexpr Extension ExtensionList300 [ ] {
_extension ( ARB , map_buffer_range ) ,
_extension ( ARB , map_buffer_range ) ,
_extension ( ARB , color_buffer_float ) ,
_extension ( ARB , color_buffer_float ) ,
_extension ( ARB , half_float_pixel ) ,
_extension ( ARB , half_float_pixel ) ,
@ -121,7 +121,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( MAGNUM , shader_vertex_id ) ,
_extension ( MAGNUM , shader_vertex_id ) ,
_extension ( NV , depth_buffer_float ) ,
_extension ( NV , depth_buffer_float ) ,
_extension ( NV , conditional_render ) } ;
_extension ( NV , conditional_render ) } ;
static const std : : vector < Extension > extensions310 {
constexpr Extension ExtensionList310 [ ] {
_extension ( ARB , texture_rectangle ) ,
_extension ( ARB , texture_rectangle ) ,
_extension ( ARB , draw_instanced ) ,
_extension ( ARB , draw_instanced ) ,
_extension ( ARB , texture_buffer_object ) ,
_extension ( ARB , texture_buffer_object ) ,
@ -129,7 +129,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , copy_buffer ) ,
_extension ( ARB , copy_buffer ) ,
_extension ( EXT , texture_snorm ) ,
_extension ( EXT , texture_snorm ) ,
_extension ( NV , primitive_restart ) } ;
_extension ( NV , primitive_restart ) } ;
static const std : : vector < Extension > extensions320 {
constexpr Extension ExtensionList320 [ ] {
_extension ( ARB , geometry_shader4 ) ,
_extension ( ARB , geometry_shader4 ) ,
_extension ( ARB , depth_clamp ) ,
_extension ( ARB , depth_clamp ) ,
_extension ( ARB , draw_elements_base_vertex ) ,
_extension ( ARB , draw_elements_base_vertex ) ,
@ -139,7 +139,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , sync ) ,
_extension ( ARB , sync ) ,
_extension ( ARB , texture_multisample ) ,
_extension ( ARB , texture_multisample ) ,
_extension ( ARB , vertex_array_bgra ) } ;
_extension ( ARB , vertex_array_bgra ) } ;
static const std : : vector < Extension > extensions330 {
constexpr Extension ExtensionList330 [ ] {
_extension ( ARB , instanced_arrays ) ,
_extension ( ARB , instanced_arrays ) ,
_extension ( ARB , blend_func_extended ) ,
_extension ( ARB , blend_func_extended ) ,
_extension ( ARB , explicit_attrib_location ) ,
_extension ( ARB , explicit_attrib_location ) ,
@ -150,7 +150,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , texture_swizzle ) ,
_extension ( ARB , texture_swizzle ) ,
_extension ( ARB , timer_query ) ,
_extension ( ARB , timer_query ) ,
_extension ( ARB , vertex_type_2_10_10_10_rev ) } ;
_extension ( ARB , vertex_type_2_10_10_10_rev ) } ;
static const std : : vector < Extension > extensions400 {
constexpr Extension ExtensionList400 [ ] {
_extension ( ARB , draw_buffers_blend ) ,
_extension ( ARB , draw_buffers_blend ) ,
_extension ( ARB , sample_shading ) ,
_extension ( ARB , sample_shading ) ,
_extension ( ARB , texture_cube_map_array ) ,
_extension ( ARB , texture_cube_map_array ) ,
@ -164,14 +164,14 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , texture_buffer_object_rgb32 ) ,
_extension ( ARB , texture_buffer_object_rgb32 ) ,
_extension ( ARB , transform_feedback2 ) ,
_extension ( ARB , transform_feedback2 ) ,
_extension ( ARB , transform_feedback3 ) } ;
_extension ( ARB , transform_feedback3 ) } ;
static const std : : vector < Extension > extensions410 {
constexpr Extension ExtensionList410 [ ] {
_extension ( ARB , ES2_compatibility ) ,
_extension ( ARB , ES2_compatibility ) ,
_extension ( ARB , get_program_binary ) ,
_extension ( ARB , get_program_binary ) ,
_extension ( ARB , separate_shader_objects ) ,
_extension ( ARB , separate_shader_objects ) ,
_extension ( ARB , shader_precision ) ,
_extension ( ARB , shader_precision ) ,
_extension ( ARB , vertex_attrib_64bit ) ,
_extension ( ARB , vertex_attrib_64bit ) ,
_extension ( ARB , viewport_array ) } ;
_extension ( ARB , viewport_array ) } ;
static const std : : vector < Extension > extensions420 {
constexpr Extension ExtensionList420 [ ] {
_extension ( ARB , texture_compression_bptc ) ,
_extension ( ARB , texture_compression_bptc ) ,
_extension ( ARB , base_instance ) ,
_extension ( ARB , base_instance ) ,
_extension ( ARB , shading_language_420pack ) ,
_extension ( ARB , shading_language_420pack ) ,
@ -185,7 +185,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
/* Mentioned in GLSL 4.20 specs as newly added */
/* Mentioned in GLSL 4.20 specs as newly added */
_extension ( ARB , shading_language_packing ) ,
_extension ( ARB , shading_language_packing ) ,
_extension ( ARB , texture_storage ) } ;
_extension ( ARB , texture_storage ) } ;
static const std : : vector < Extension > extensions430 {
constexpr Extension ExtensionList430 [ ] {
_extension ( ARB , arrays_of_arrays ) ,
_extension ( ARB , arrays_of_arrays ) ,
_extension ( ARB , ES3_compatibility ) ,
_extension ( ARB , ES3_compatibility ) ,
_extension ( ARB , clear_buffer_object ) ,
_extension ( ARB , clear_buffer_object ) ,
@ -208,7 +208,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , texture_view ) ,
_extension ( ARB , texture_view ) ,
_extension ( ARB , vertex_attrib_binding ) ,
_extension ( ARB , vertex_attrib_binding ) ,
_extension ( KHR , debug ) } ;
_extension ( KHR , debug ) } ;
static const std : : vector < Extension > extensions440 {
constexpr Extension ExtensionList440 [ ] {
_extension ( ARB , buffer_storage ) ,
_extension ( ARB , buffer_storage ) ,
_extension ( ARB , clear_texture ) ,
_extension ( ARB , clear_texture ) ,
_extension ( ARB , enhanced_layouts ) ,
_extension ( ARB , enhanced_layouts ) ,
@ -217,7 +217,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , texture_mirror_clamp_to_edge ) ,
_extension ( ARB , texture_mirror_clamp_to_edge ) ,
_extension ( ARB , texture_stencil8 ) ,
_extension ( ARB , texture_stencil8 ) ,
_extension ( ARB , vertex_type_10f_11f_11f_rev ) } ;
_extension ( ARB , vertex_type_10f_11f_11f_rev ) } ;
static const std : : vector < Extension > extensions450 {
constexpr Extension ExtensionList450 [ ] {
_extension ( ARB , ES3_1_compatibility ) ,
_extension ( ARB , ES3_1_compatibility ) ,
_extension ( ARB , clip_control ) ,
_extension ( ARB , clip_control ) ,
_extension ( ARB , conditional_render_inverted ) ,
_extension ( ARB , conditional_render_inverted ) ,
@ -229,7 +229,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , texture_barrier ) ,
_extension ( ARB , texture_barrier ) ,
_extension ( KHR , context_flush_control ) ,
_extension ( KHR , context_flush_control ) ,
_extension ( KHR , robustness ) } ;
_extension ( KHR , robustness ) } ;
static const std : : vector < Extension > extensions460 {
constexpr Extension ExtensionList460 [ ] {
_extension ( ARB , indirect_parameters ) ,
_extension ( ARB , indirect_parameters ) ,
_extension ( ARB , shader_draw_parameters ) ,
_extension ( ARB , shader_draw_parameters ) ,
_extension ( ARB , shader_group_vote ) ,
_extension ( ARB , shader_group_vote ) ,
@ -242,13 +242,13 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( ARB , texture_filter_anisotropic ) ,
_extension ( ARB , texture_filter_anisotropic ) ,
_extension ( KHR , no_error ) } ;
_extension ( KHR , no_error ) } ;
# elif defined(MAGNUM_TARGET_WEBGL)
# elif defined(MAGNUM_TARGET_WEBGL)
static const std : : vector < Extension > extensions {
constexpr Extension ExtensionList [ ] {
_extension ( EXT , texture_filter_anisotropic ) ,
_extension ( EXT , texture_filter_anisotropic ) ,
_extension ( EXT , disjoint_timer_query ) ,
_extension ( EXT , disjoint_timer_query ) ,
_extension ( EXT , color_buffer_float ) ,
_extension ( EXT , color_buffer_float ) ,
_extension ( OES , texture_float_linear ) ,
_extension ( OES , texture_float_linear ) ,
_extension ( WEBGL , compressed_texture_s3tc ) } ;
_extension ( WEBGL , compressed_texture_s3tc ) } ;
static const std : : vector < Extension > extensionsES300 {
constexpr Extension ExtensionListES300 [ ] {
# ifdef MAGNUM_TARGET_GLES2
# ifdef MAGNUM_TARGET_GLES2
_extension ( ANGLE , instanced_arrays ) ,
_extension ( ANGLE , instanced_arrays ) ,
_extension ( EXT , color_buffer_half_float ) ,
_extension ( EXT , color_buffer_half_float ) ,
@ -271,7 +271,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
# endif
# endif
} ;
} ;
# else
# else
static const std : : vector < Extension > extensions {
constexpr Extension ExtensionList [ ] {
# ifndef MAGNUM_TARGET_GLES2
# ifndef MAGNUM_TARGET_GLES2
_extension ( ANDROID , extension_pack_es31a ) ,
_extension ( ANDROID , extension_pack_es31a ) ,
# endif
# endif
@ -314,7 +314,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( OES , stencil1 ) ,
_extension ( OES , stencil1 ) ,
_extension ( OES , stencil4 ) ,
_extension ( OES , stencil4 ) ,
_extension ( OES , texture_float_linear ) } ;
_extension ( OES , texture_float_linear ) } ;
static const std : : vector < Extension > extensionsES300 {
constexpr Extension ExtensionListES300 [ ] {
# ifdef MAGNUM_TARGET_GLES2
# ifdef MAGNUM_TARGET_GLES2
_extension ( ANGLE , framebuffer_blit ) ,
_extension ( ANGLE , framebuffer_blit ) ,
_extension ( ANGLE , framebuffer_multisample ) ,
_extension ( ANGLE , framebuffer_multisample ) ,
@ -368,7 +368,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension ( OES , surfaceless_context )
_extension ( OES , surfaceless_context )
# endif
# endif
} ;
} ;
static const std : : vector < Extension > extensionsES320 {
constexpr Extension ExtensionListES320 [ ] {
_extension ( EXT , color_buffer_half_float ) ,
_extension ( EXT , color_buffer_half_float ) ,
# ifndef MAGNUM_TARGET_GLES2
# ifndef MAGNUM_TARGET_GLES2
_extension ( EXT , color_buffer_float ) ,
_extension ( EXT , color_buffer_float ) ,
@ -406,31 +406,35 @@ const std::vector<Extension>& Extension::extensions(Version version) {
# endif
# endif
# undef _extension
# undef _extension
}
Containers : : ArrayView < const Extension > Extension : : extensions ( Version version ) {
switch ( version ) {
switch ( version ) {
case Version : : None : return extensions ;
/* GCC 4.8 needs an explicit cast */
case Version : : None : return Containers : : arrayView ( ExtensionList ) ;
# ifndef MAGNUM_TARGET_GLES
# ifndef MAGNUM_TARGET_GLES
case Version : : GL210 : return empty ;
case Version : : GL210 : return { } ;
case Version : : GL300 : return extensions300 ;
case Version : : GL300 : return Contain ers : : arrayView ( E xtensionLi st 300) ;
case Version : : GL310 : return extensions310 ;
case Version : : GL310 : return Contain ers : : arrayView ( E xtensionLi st 310) ;
case Version : : GL320 : return extensions320 ;
case Version : : GL320 : return Contain ers : : arrayView ( E xtensionLi st 320) ;
case Version : : GL330 : return extensions330 ;
case Version : : GL330 : return Contain ers : : arrayView ( E xtensionLi st 330) ;
case Version : : GL400 : return extensions400 ;
case Version : : GL400 : return Contain ers : : arrayView ( E xtensionLi st 400) ;
case Version : : GL410 : return extensions410 ;
case Version : : GL410 : return Contain ers : : arrayView ( E xtensionLi st 410) ;
case Version : : GL420 : return extensions420 ;
case Version : : GL420 : return Contain ers : : arrayView ( E xtensionLi st 420) ;
case Version : : GL430 : return extensions430 ;
case Version : : GL430 : return Contain ers : : arrayView ( E xtensionLi st 430) ;
case Version : : GL440 : return extensions440 ;
case Version : : GL440 : return Contain ers : : arrayView ( E xtensionLi st 440) ;
case Version : : GL450 : return extensions450 ;
case Version : : GL450 : return Contain ers : : arrayView ( E xtensionLi st 450) ;
case Version : : GL460 : return extensions460 ;
case Version : : GL460 : return Contain ers : : arrayView ( E xtensionLi st 460) ;
case Version : : GLES200 :
case Version : : GLES200 :
case Version : : GLES300 :
case Version : : GLES300 :
case Version : : GLES310 :
case Version : : GLES310 :
case Version : : GLES320 : return empty ;
case Version : : GLES320 : return { } ;
# else
# else
case Version : : GLES200 : return empty ;
case Version : : GLES200 : return { } ;
case Version : : GLES300 : return extensionsES300 ;
case Version : : GLES300 : return Contain ers : : arrayView ( E xtensionLi st ES300) ;
# ifndef MAGNUM_TARGET_WEBGL
# ifndef MAGNUM_TARGET_WEBGL
case Version : : GLES310 : return empty ;
case Version : : GLES310 : return { } ;
case Version : : GLES320 : return extensionsES320 ;
case Version : : GLES320 : return Contain ers : : arrayView ( E xtensionLi st ES320) ;
# endif
# endif
# endif
# endif
}
}