Browse Source

GL: manual indices for extensions.

The `#line` statement was an ugly hack and it breaks code highlighting
in KDevelop (and I guess in many other Clang-based IDEs as well). This
however means adding new extensions is a bit more annoying, but
hopefully the newly added test should aid with that. Developers guide
contains more info.
pull/205/head
Vladimír Vondruš 8 years ago
parent
commit
2a3a907c15
  1. 11
      doc/developers.dox
  2. 16
      src/Magnum/Context.h
  3. 772
      src/Magnum/Extensions.h
  4. 54
      src/Magnum/Test/ContextTest.cpp

11
doc/developers.dox

@ -484,8 +484,15 @@ in inverse --- but usually @ref developers-deprecation "deprecate first".
- to @cpp Context::tryCreate() @ce in `src/Magnum/Context.cpp`
- to specify GLSL version in `src/Magnum/Shader.cpp`
- to the list in `src/Magnum/Platform/magnum-info.cpp`
12. Add new extensions to `src/Magnum/Extensions.h`, order them by extension
ID that is mentioned in every extension spec file
- to the test in `src/Magnum/Test/ContextTest.cpp`
12. Add new extensions to `src/Magnum/Extensions.h`
- order them by extension ID that is mentioned in every extension spec
file
- update the numbering to stay monotonic and unique, round up start index
of next section to nearest ten to make the updates bearable
- in case there's a lot of new extensions, @cpp Implementation::ExtensionCount @ce
might needed to be increased
- run `ContextTest` to verify everything is still okay
13. Update existing extensions with version in which they become core (last
parameter of the `_extension()` macro)
14. Update extension list in `src/magnum/Context.cpp` according to changes in

16
src/Magnum/Context.h

@ -46,7 +46,19 @@ namespace Magnum {
namespace Implementation {
struct ContextState;
struct State;
enum: std::size_t {
ExtensionCount =
#ifndef MAGNUM_TARGET_GLES
192
#elif !defined(MAGNUM_TARGET_WEBGL)
128
#else
24
#endif
};
}
namespace Platform { class Context; }
/**
@ -642,8 +654,8 @@ class MAGNUM_EXPORT Context {
Flags _flags;
#endif
std::array<Version, 256> _extensionRequiredVersion;
std::bitset<256> _extensionStatus;
std::array<Version, Implementation::ExtensionCount> _extensionRequiredVersion;
std::bitset<Implementation::ExtensionCount> _extensionStatus;
std::vector<Extension> _supportedExtensions;
Implementation::State* _state;

772
src/Magnum/Extensions.h

@ -72,406 +72,402 @@ target_link_libraries(your-app Magnum::Magnum)
See @ref building and @ref cmake for more information.
@see @ref MAGNUM_ASSERT_EXTENSION_SUPPORTED()
@todo Manual indices for extensions, this has gaps
*/
namespace Extensions {
#ifndef DOXYGEN_GENERATING_OUTPUT
#define _extension(prefix, vendor, extension, _requiredVersion, _coreVersion) \
#define _extension(index, prefix, vendor, extension, _requiredVersion, _coreVersion) \
struct extension { \
enum: std::size_t { Index = __LINE__-1 }; \
enum: std::size_t { Index = index }; \
constexpr static Version requiredVersion() { return Version::_requiredVersion; } \
constexpr static Version coreVersion() { return Version::_coreVersion; } \
constexpr static const char* string() { return #prefix "_" #vendor "_" #extension; } \
};
/* IMPORTANT: don't forget to add new extensions also in Context.cpp */
namespace GL {
#ifndef MAGNUM_TARGET_GLES
#line 1
namespace AMD {
_extension(GL,AMD,transform_feedback3_lines_triangles, GL210, None) // #397
_extension(GL,AMD,vertex_shader_layer, GL210, None) // #417
_extension(GL,AMD,shader_trinary_minmax, GL210, None) // #428
} namespace ARB {
_extension(GL,ARB,texture_rectangle, GL210, GL310) // #38
_extension(GL,ARB,color_buffer_float, GL210, GL300) // #39
_extension(GL,ARB,half_float_pixel, GL210, GL300) // #40
_extension(GL,ARB,texture_float, GL210, GL300) // #41
_extension(GL,ARB,depth_buffer_float, GL210, GL300) // #43
_extension(GL,ARB,draw_instanced, GL210, GL310) // #44
_extension(GL,ARB,framebuffer_object, GL210, GL300) // #45
_extension(GL,ARB,framebuffer_sRGB, GL210, GL300) // #46
_extension(GL,ARB,geometry_shader4, GL210, GL320) // #47
_extension(GL,ARB,half_float_vertex, GL210, GL300) // #48
_extension(GL,ARB,instanced_arrays, GL210, GL330) // #49
_extension(GL,ARB,map_buffer_range, GL210, GL300) // #50
_extension(GL,ARB,texture_buffer_object, GL210, GL310) // #51
_extension(GL,ARB,texture_rg, GL210, GL300) // #53
_extension(GL,ARB,vertex_array_object, GL210, GL300) // #54
_extension(GL,ARB,uniform_buffer_object, GL210, GL310) // #57
_extension(GL,ARB,copy_buffer, /*?*/ GL210, GL310) // #59
_extension(GL,ARB,depth_clamp, /*?*/ GL210, GL320) // #61
_extension(GL,ARB,draw_elements_base_vertex, /*?*/ GL210, GL320) // #62
_extension(GL,ARB,fragment_coord_conventions, /*?*/ GL210, GL320) // #63
_extension(GL,ARB,provoking_vertex, /*?*/ GL210, GL320) // #64
_extension(GL,ARB,seamless_cube_map, GL210, GL320) // #65
_extension(GL,ARB,sync, GL310, GL320) // #66
_extension(GL,ARB,texture_multisample, /*?*/ GL210, GL320) // #67
_extension(GL,ARB,vertex_array_bgra, GL210, GL320) // #68
_extension(GL,ARB,draw_buffers_blend, GL210, GL400) // #69
_extension(GL,ARB,sample_shading, GL210, GL400) // #70
_extension(GL,ARB,texture_cube_map_array, /*?*/ GL210, GL400) // #71
_extension(GL,ARB,texture_gather, GL210, GL400) // #72
_extension(GL,ARB,texture_query_lod, GL210, GL400) // #73
_extension(GL,ARB,texture_compression_bptc, GL310, GL420) // #77
_extension(GL,ARB,blend_func_extended, GL210, GL330) // #78
_extension(GL,ARB,explicit_attrib_location, GL210, GL330) // #79
_extension(GL,ARB,occlusion_query2, GL210, GL330) // #80
_extension(GL,ARB,sampler_objects, GL210, GL330) // #81
_extension(GL,ARB,shader_bit_encoding, /*?*/ GL210, GL330) // #82
_extension(GL,ARB,texture_rgb10_a2ui, GL210, GL330) // #83
_extension(GL,ARB,texture_swizzle, /*?*/ GL210, GL330) // #84
_extension(GL,ARB,timer_query, /*?*/ GL210, GL330) // #85
_extension(GL,ARB,vertex_type_2_10_10_10_rev, GL210, GL330) // #86
_extension(GL,ARB,draw_indirect, GL310, GL400) // #87
_extension(GL,ARB,gpu_shader5, GL320, GL400) // #88
_extension(GL,ARB,gpu_shader_fp64, GL320, GL400) // #89
_extension(GL,ARB,shader_subroutine, GL320, GL400) // #90
_extension(GL,ARB,tessellation_shader, GL320, GL400) // #91
_extension(GL,ARB,texture_buffer_object_rgb32, /*?*/ GL210, GL400) // #92
_extension(GL,ARB,transform_feedback2, GL210, GL400) // #93
_extension(GL,ARB,transform_feedback3, GL210, GL400) // #94
_extension(GL,ARB,ES2_compatibility, /*?*/ GL210, GL410) // #95
_extension(GL,ARB,get_program_binary, GL300, GL410) // #96
_extension(GL,ARB,separate_shader_objects, GL210, GL410) // #97
_extension(GL,ARB,shader_precision, GL400, GL410) // #98
_extension(GL,ARB,vertex_attrib_64bit, GL300, GL410) // #99
_extension(GL,ARB,viewport_array, GL210, GL410) // #100
_extension(GL,ARB,robustness, GL210, None) // #105
_extension(GL,ARB,base_instance, GL210, GL420) // #107
_extension(GL,ARB,shading_language_420pack, GL300, GL420) // #108
_extension(GL,ARB,transform_feedback_instanced, GL210, GL420) // #109
_extension(GL,ARB,compressed_texture_pixel_storage, GL210, GL420) // #110
_extension(GL,ARB,conservative_depth, GL300, GL420) // #111
_extension(GL,ARB,internalformat_query, GL210, GL420) // #112
_extension(GL,ARB,map_buffer_alignment, GL210, GL420) // #113
_extension(GL,ARB,shader_atomic_counters, GL300, GL420) // #114
_extension(GL,ARB,shader_image_load_store, GL300, GL420) // #115
_extension(GL,ARB,shading_language_packing, /*?*/ GL210, GL420) // #116
_extension(GL,ARB,texture_storage, GL210, GL420) // #117
_extension(GL,ARB,arrays_of_arrays, GL210, GL430) // #120
_extension(GL,ARB,clear_buffer_object, GL210, GL430) // #121
_extension(GL,ARB,compute_shader, GL420, GL430) // #122
_extension(GL,ARB,copy_image, GL210, GL430) // #123
_extension(GL,ARB,texture_view, GL210, GL430) // #124
_extension(GL,ARB,vertex_attrib_binding, GL210, GL430) // #125
_extension(GL,ARB,robustness_isolation, GL210, None) // #126
_extension(GL,ARB,robustness_application_isolation, GL210, None) // #126
_extension(GL,ARB,robustness_share_group_isolation, GL210, None) // #126
_extension(GL,ARB,ES3_compatibility, GL330, GL430) // #127
_extension(GL,ARB,explicit_uniform_location, GL210, GL430) // #128
_extension(GL,ARB,fragment_layer_viewport, GL300, GL430) // #129
_extension(GL,ARB,framebuffer_no_attachments, GL210, GL430) // #130
_extension(GL,ARB,internalformat_query2, GL210, GL430) // #131
_extension(GL,ARB,invalidate_subdata, GL210, GL430) // #132
_extension(GL,ARB,multi_draw_indirect, GL310, GL430) // #133
_extension(GL,ARB,program_interface_query, GL210, GL430) // #134
_extension(GL,ARB,robust_buffer_access_behavior,GL210, GL430) // #135
_extension(GL,ARB,shader_image_size, GL420, GL430) // #136
_extension(GL,ARB,shader_storage_buffer_object, GL400, GL430) // #137
_extension(GL,ARB,stencil_texturing, GL210, GL430) // #138
_extension(GL,ARB,texture_buffer_range, GL210, GL430) // #139
_extension(GL,ARB,texture_query_levels, GL300, GL430) // #140
_extension(GL,ARB,texture_storage_multisample, GL210, GL430) // #141
_extension(GL,ARB,buffer_storage, /*?*/ GL430, GL440) // #144
_extension(GL,ARB,clear_texture, GL210, GL440) // #145
_extension(GL,ARB,enhanced_layouts, GL310, GL440) // #146
_extension(GL,ARB,multi_bind, GL300, GL440) // #147
_extension(GL,ARB,query_buffer_object, GL210, GL440) // #148
_extension(GL,ARB,texture_mirror_clamp_to_edge, GL210, GL440) // #149
_extension(GL,ARB,texture_stencil8, GL210, GL440) // #150
_extension(GL,ARB,vertex_type_10f_11f_11f_rev, GL300, GL440) // #151
_extension(GL,ARB,bindless_texture, GL400, None) // #152
_extension(GL,ARB,compute_variable_group_size, GL420, None) // #153
_extension(GL,ARB,indirect_parameters, GL420, GL460) // #154
_extension(GL,ARB,seamless_cubemap_per_texture, GL320, None) // #155
_extension(GL,ARB,shader_draw_parameters, GL310, GL460) // #156
_extension(GL,ARB,shader_group_vote, GL420, GL460) // #157
_extension(GL,ARB,sparse_texture, GL210, None) // #158
_extension(GL,ARB,ES3_1_compatibility, GL440, GL450) // #159
_extension(GL,ARB,clip_control, GL210, GL450) // #160
_extension(GL,ARB,conditional_render_inverted, GL300, GL450) // #161
_extension(GL,ARB,cull_distance, GL300, GL450) // #162
_extension(GL,ARB,derivative_control, GL400, GL450) // #163
_extension(GL,ARB,direct_state_access, GL210, GL450) // #164
_extension(GL,ARB,get_texture_sub_image, GL210, GL450) // #165
_extension(GL,ARB,shader_texture_image_samples, GL430, GL450) // #166
_extension(GL,ARB,texture_barrier, GL210, GL450) // #167
_extension(GL,ARB,pipeline_statistics_query, GL300, GL460) // #171
_extension(GL,ARB,sparse_buffer, GL210, None) // #172
_extension(GL,ARB,transform_feedback_overflow_query, GL300, None) // #173
_extension(GL,ARB,ES3_2_compatibility, GL450, None) // #177
_extension(GL,ARB,shader_atomic_counter_ops, GL300, GL460) // #182
_extension(GL,ARB,gl_spirv, GL330, GL460) // #190
_extension(GL,ARB,polygon_offset_clamp, GL330, GL460) // #193
_extension(GL,ARB,spirv_extensions, GL330, GL460) // #194
_extension(GL,ARB,texture_filter_anisotropic, GL210, GL460) // #195
} namespace ATI {
_extension(GL,ATI,texture_mirror_once, GL210, None) // #221
} namespace EXT {
_extension(GL,EXT,texture_filter_anisotropic, GL210, None) // #187
_extension(GL,EXT,texture_compression_s3tc, GL210, None) // #198
/* EXT_framebuffer_object, EXT_packed_depth_stencil, EXT_framebuffer_blit,
EXT_framebuffer_multisample replaced with ARB_framebuffer_object */
_extension(GL,EXT,texture_mirror_clamp, GL210, None) // #298
_extension(GL,EXT,gpu_shader4, GL210, GL300) // #326
_extension(GL,EXT,packed_float, GL210, GL300) // #328
_extension(GL,EXT,texture_array, GL210, GL300) // #329
_extension(GL,EXT,texture_compression_rgtc, GL210, GL300) // #332
_extension(GL,EXT,texture_shared_exponent, GL210, GL300) // #333
_extension(GL,EXT,draw_buffers2, GL210, GL300) // #340
_extension(GL,EXT,texture_integer, GL210, GL300) // #343
_extension(GL,EXT,transform_feedback, GL210, GL300) // #352
_extension(GL,EXT,direct_state_access, GL210, None) // #353
_extension(GL,EXT,texture_snorm, GL300, GL310) // #365
_extension(GL,EXT,texture_sRGB_decode, GL210, None) // #402
_extension(GL,EXT,shader_integer_mix, GL300, None) // #437
_extension(GL,EXT,debug_label, GL210, None) // #439
_extension(GL,EXT,debug_marker, GL210, None) // #440
} namespace GREMEDY {
_extension(GL,GREMEDY,string_marker, GL210, None) // #311
} namespace KHR {
_extension(GL,KHR,texture_compression_astc_ldr, GL210, None) // #118
_extension(GL,KHR,texture_compression_astc_hdr, GL210, None) // #118
_extension(GL,KHR,debug, GL210, GL430) // #119
_extension(GL,KHR,context_flush_control, GL210, GL450) // #168
_extension(GL,KHR,robust_buffer_access_behavior, GL320, None) // #169
_extension(GL,KHR,robustness, GL320, GL450) // #170
_extension(GL,KHR,blend_equation_advanced, GL210, None) // #174
_extension(GL,KHR,blend_equation_advanced_coherent, GL210, None) // #174
_extension(GL,KHR,no_error, GL210, None) // #175
} namespace NV {
_extension(GL,NV,primitive_restart, GL210, GL310) // #285
_extension(GL,NV,depth_buffer_float, GL210, GL300) // #334
_extension(GL,NV,conditional_render, GL210, GL300) // #346
/* NV_draw_texture not supported */ // #430
}
/* IMPORTANT: if this line is > 329 (73 + size), don't forget to update array size in Context.h */
#elif defined(MAGNUM_TARGET_WEBGL)
#line 1
namespace ANGLE {
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,ANGLE,instanced_arrays, GLES200, GLES300) // #19
#endif
} namespace EXT {
_extension(GL,EXT,texture_filter_anisotropic, GLES200, None) // #11
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,color_buffer_half_float, GLES200, None) // #14
#endif
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,sRGB, GLES200, GLES300) // #17
_extension(GL,EXT,blend_minmax, GLES200, GLES300) // #25
#endif
_extension(GL,EXT,disjoint_timer_query, GLES200, None) // #26
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,shader_texture_lod, GLES200, GLES300) // #27
#endif
_extension(GL,EXT,color_buffer_float, GLES300, None) // #31
} namespace OES {
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,OES,texture_float, GLES200, GLES300) // #1
_extension(GL,OES,texture_half_float, GLES200, GLES300) // #2
_extension(GL,OES,standard_derivatives, GLES200, GLES300) // #4
_extension(GL,OES,vertex_array_object, GLES200, GLES300) // #5
_extension(GL,OES,element_index_uint, GLES200, GLES300) // #10
#endif
_extension(GL,OES,texture_float_linear, GLES200, None) // #20
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,OES,texture_half_float_linear, GLES200, GLES300) // #21
_extension(GL,OES,fbo_render_mipmap, GLES200, GLES300) // #28
#endif
} namespace WEBGL {
_extension(GL,WEBGL,compressed_texture_s3tc, GLES200, None) // #8
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,WEBGL,depth_texture, GLES200, GLES300) // #9
_extension(GL,WEBGL,color_buffer_float, GLES200, None) // #14
_extension(GL,WEBGL,draw_buffers, GLES200, GLES300) // #18
#endif
}
#else
#line 1
namespace ANDROID {
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,ANDROID,extension_pack_es31a, GLES310, None) // #187
#endif
} namespace ANGLE {
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,ANGLE,framebuffer_blit, GLES200, GLES300) // #83
_extension(GL,ANGLE,framebuffer_multisample, GLES200, GLES300) // #84
_extension(GL,ANGLE,instanced_arrays, GLES200, GLES300) // #109
_extension(GL,ANGLE,depth_texture, GLES200, GLES300) // #138
#endif
} namespace APPLE {
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,APPLE,framebuffer_multisample, GLES200, GLES300) // #78
#endif
_extension(GL,APPLE,texture_format_BGRA8888, GLES200, None) // #79
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,APPLE,texture_max_level, GLES200, None) // #80
#endif
} namespace ARM {
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,ARM,rgba8, GLES200, GLES300) // #82
#endif
_extension(GL,ARM,shader_framebuffer_fetch, GLES200, None) // #165
_extension(GL,ARM,shader_framebuffer_fetch_depth_stencil, GLES200, None) // #166
} namespace EXT {
_extension(GL,EXT,texture_filter_anisotropic, GLES200, None) // #41
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,texture_type_2_10_10_10_REV, GLES200, GLES300) // #42
#endif
_extension(GL,EXT,texture_format_BGRA8888, GLES200, None) // #51
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,discard_framebuffer, GLES200, GLES300) // #64
_extension(GL,EXT,blend_minmax, GLES200, GLES300) // #65
#endif
_extension(GL,EXT,read_format_bgra, GLES200, None) // #66
_extension(GL,EXT,multi_draw_arrays, GLES200, None) // #67
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,shader_texture_lod, GLES200, GLES300) // #77
_extension(GL,EXT,unpack_subimage, GLES200, GLES300) // #90
#endif
_extension(GL,EXT,color_buffer_half_float, GLES200, GLES320) // #97
_extension(GL,EXT,debug_label, GLES200, None) // #98
_extension(GL,EXT,debug_marker, GLES200, None) // #99
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,occlusion_query_boolean, GLES200, GLES300) // #100
#endif
_extension(GL,EXT,separate_shader_objects, GLES200, None) // #101
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,shadow_samplers, GLES200, GLES300) // #102
_extension(GL,EXT,texture_rg, GLES200, GLES300) // #103
_extension(GL,EXT,sRGB, GLES200, GLES300) // #105
#endif
_extension(GL,EXT,multisampled_render_to_texture, GLES200, None) // #106
_extension(GL,EXT,robustness, GLES200, None) // #107
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,texture_storage, GLES200, GLES300) // #108
_extension(GL,EXT,map_buffer_range, GLES200, GLES300) // #121
#endif
_extension(GL,EXT,shader_framebuffer_fetch, GLES200, None) // #122
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,EXT,color_buffer_float, GLES300, GLES320) // #137
#endif
_extension(GL,EXT,disjoint_timer_query, GLES200, None) // #150
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,draw_buffers, GLES200, GLES300) // #151
#endif
_extension(GL,EXT,texture_sRGB_decode, GLES200, None) // #152
_extension(GL,EXT,sRGB_write_control, GLES200, None) // #153
_extension(GL,EXT,texture_compression_s3tc, GLES200, None) // #154
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,EXT,instanced_arrays, GLES200, GLES300) // #156
_extension(GL,EXT,draw_instanced, GLES200, GLES300) // #157
#endif
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,EXT,shader_integer_mix, GLES300, None) // #161
_extension(GL,EXT,copy_image, GLES300, GLES320) // #175
#endif
_extension(GL,EXT,draw_buffers_indexed, GLES200, GLES320) // #176
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,EXT,geometry_shader, GLES310, GLES320) // #177
_extension(GL,EXT,gpu_shader5, GLES310, GLES320) // #178
_extension(GL,EXT,shader_io_blocks, GLES310, GLES320) // #180
_extension(GL,EXT,tessellation_shader, GLES310, GLES320) // #181
#endif
_extension(GL,EXT,texture_border_clamp, GLES200, GLES320) // #182
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,EXT,texture_buffer, GLES310, GLES320) // #183
_extension(GL,EXT,texture_cube_map_array, GLES310, GLES320) // #184
_extension(GL,EXT,primitive_bounding_box, GLES310, GLES320) // #186
#endif
_extension(GL,EXT,polygon_offset_clamp, GLES200, None) // #252
} namespace KHR {
_extension(GL,KHR,texture_compression_astc_ldr, GLES200, GLES320) // #117
_extension(GL,KHR,texture_compression_astc_hdr, GLES200, None) // #117
_extension(GL,KHR,debug, GLES200, GLES320) // #118
_extension(GL,KHR,blend_equation_advanced, GLES200, GLES320) // #168
_extension(GL,KHR,blend_equation_advanced_coherent, GLES200, None) // #168
_extension(GL,KHR,robustness, GLES200, GLES320) // #170
_extension(GL,KHR,robust_buffer_access_behavior, GLES200, GLES320) // #189
_extension(GL,KHR,context_flush_control, GLES200, None) // #191
_extension(GL,KHR,no_error, GLES200, None) // #243
} namespace NV {
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,NV,draw_buffers, GLES200, GLES300) // #91
_extension(GL,NV,fbo_color_attachments, GLES200, GLES300) // #92
_extension(GL,NV,read_buffer, GLES200, GLES300) // #93
#endif
_extension(GL,NV,read_buffer_front, GLES200, None) // #93
_extension(GL,NV,read_depth, GLES200, None) // #94
_extension(GL,NV,read_stencil, GLES200, None) // #94
_extension(GL,NV,read_depth_stencil, GLES200, None) // #94
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,NV,pack_subimage, GLES200, GLES300) // #132
_extension(GL,NV,draw_instanced, GLES200, GLES300) // #141
_extension(GL,NV,framebuffer_blit, GLES200, GLES300) // #142
_extension(GL,NV,framebuffer_multisample, GLES200, GLES300) // #143
_extension(GL,NV,instanced_arrays, GLES200, GLES300) // #145
_extension(GL,NV,shadow_samplers_array, GLES200, GLES300) // #146
_extension(GL,NV,shadow_samplers_cube, GLES200, GLES300) // #147
#endif
_extension(GL,NV,texture_border_clamp, GLES200, None) // #149
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,NV,shader_noperspective_interpolation, GLES300, None) // #201
#endif
_extension(GL,NV,polygon_mode, GLES200, None) // #238
} namespace OES {
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,OES,depth24, GLES200, GLES300) // #24
#endif
_extension(GL,OES,depth32, GLES200, None) // #25
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,OES,element_index_uint, GLES200, GLES300) // #26
_extension(GL,OES,fbo_render_mipmap, GLES200, GLES300) // #27
#endif
_extension(GL,OES,mapbuffer, GLES200, None) // #29
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,OES,rgb8_rgba8, GLES200, GLES300) // #30
#endif
_extension(GL,OES,stencil1, GLES200, None) // #31
_extension(GL,OES,stencil4, GLES200, None) // #32
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,OES,texture_3D, GLES200, GLES300) // #34
_extension(GL,OES,texture_half_float_linear, GLES200, GLES300) // #35
#endif
_extension(GL,OES,texture_float_linear, GLES200, None) // #35
#ifdef MAGNUM_TARGET_GLES2
_extension(GL,OES,texture_half_float, GLES200, GLES300) // #36
_extension(GL,OES,texture_float, GLES200, GLES300) // #36
_extension(GL,OES,texture_npot, GLES200, GLES300) // #37
_extension(GL,OES,vertex_half_float, GLES200, GLES300) // #38
_extension(GL,OES,packed_depth_stencil, GLES200, GLES300) // #43
_extension(GL,OES,depth_texture, GLES200, GLES300) // #44
_extension(GL,OES,standard_derivatives, GLES200, GLES300) // #45
_extension(GL,OES,vertex_array_object, GLES200, GLES300) // #71
_extension(GL,OES,required_internalformat, GLES200, GLES300) // #115
_extension(GL,OES,surfaceless_context, GLES200, GLES300) // #116
#endif
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,OES,sample_shading, GLES300, GLES320) // #169
_extension(GL,OES,sample_variables, GLES300, GLES320) // #170
_extension(GL,OES,shader_image_atomic, GLES310, GLES320) // #171
_extension(GL,OES,shader_multisample_interpolation, GLES300, GLES320) // #172
#endif
_extension(GL,OES,texture_stencil8, GLES200, GLES320) // #173
#ifndef MAGNUM_TARGET_GLES2
_extension(GL,OES,texture_storage_multisample_2d_array, GLES310, GLES320) // #174
#endif
}
#ifndef MAGNUM_TARGET_GLES
namespace AMD {
_extension( 0,GL,AMD,transform_feedback3_lines_triangles, GL210, None) // #397
_extension( 1,GL,AMD,vertex_shader_layer, GL210, None) // #417
_extension( 2,GL,AMD,shader_trinary_minmax, GL210, None) // #428
} namespace ARB {
_extension( 10,GL,ARB,texture_rectangle, GL210, GL310) // #38
_extension( 11,GL,ARB,color_buffer_float, GL210, GL300) // #39
_extension( 12,GL,ARB,half_float_pixel, GL210, GL300) // #40
_extension( 13,GL,ARB,texture_float, GL210, GL300) // #41
_extension( 14,GL,ARB,depth_buffer_float, GL210, GL300) // #43
_extension( 15,GL,ARB,draw_instanced, GL210, GL310) // #44
_extension( 16,GL,ARB,framebuffer_object, GL210, GL300) // #45
_extension( 17,GL,ARB,framebuffer_sRGB, GL210, GL300) // #46
_extension( 18,GL,ARB,geometry_shader4, GL210, GL320) // #47
_extension( 19,GL,ARB,half_float_vertex, GL210, GL300) // #48
_extension( 20,GL,ARB,instanced_arrays, GL210, GL330) // #49
_extension( 21,GL,ARB,map_buffer_range, GL210, GL300) // #50
_extension( 22,GL,ARB,texture_buffer_object, GL210, GL310) // #51
_extension( 23,GL,ARB,texture_rg, GL210, GL300) // #53
_extension( 24,GL,ARB,vertex_array_object, GL210, GL300) // #54
_extension( 25,GL,ARB,uniform_buffer_object, GL210, GL310) // #57
_extension( 26,GL,ARB,copy_buffer, /*?*/ GL210, GL310) // #59
_extension( 27,GL,ARB,depth_clamp, /*?*/ GL210, GL320) // #61
_extension( 28,GL,ARB,draw_elements_base_vertex, /*?*/ GL210, GL320) // #62
_extension( 29,GL,ARB,fragment_coord_conventions, /*?*/ GL210, GL320) // #63
_extension( 30,GL,ARB,provoking_vertex, /*?*/ GL210, GL320) // #64
_extension( 31,GL,ARB,seamless_cube_map, GL210, GL320) // #65
_extension( 32,GL,ARB,sync, GL310, GL320) // #66
_extension( 33,GL,ARB,texture_multisample, /*?*/ GL210, GL320) // #67
_extension( 34,GL,ARB,vertex_array_bgra, GL210, GL320) // #68
_extension( 35,GL,ARB,draw_buffers_blend, GL210, GL400) // #69
_extension( 36,GL,ARB,sample_shading, GL210, GL400) // #70
_extension( 37,GL,ARB,texture_cube_map_array, /*?*/ GL210, GL400) // #71
_extension( 38,GL,ARB,texture_gather, GL210, GL400) // #72
_extension( 39,GL,ARB,texture_query_lod, GL210, GL400) // #73
_extension( 40,GL,ARB,texture_compression_bptc, GL310, GL420) // #77
_extension( 41,GL,ARB,blend_func_extended, GL210, GL330) // #78
_extension( 42,GL,ARB,explicit_attrib_location, GL210, GL330) // #79
_extension( 43,GL,ARB,occlusion_query2, GL210, GL330) // #80
_extension( 44,GL,ARB,sampler_objects, GL210, GL330) // #81
_extension( 45,GL,ARB,shader_bit_encoding, /*?*/ GL210, GL330) // #82
_extension( 46,GL,ARB,texture_rgb10_a2ui, GL210, GL330) // #83
_extension( 47,GL,ARB,texture_swizzle, /*?*/ GL210, GL330) // #84
_extension( 48,GL,ARB,timer_query, /*?*/ GL210, GL330) // #85
_extension( 49,GL,ARB,vertex_type_2_10_10_10_rev, GL210, GL330) // #86
_extension( 50,GL,ARB,draw_indirect, GL310, GL400) // #87
_extension( 51,GL,ARB,gpu_shader5, GL320, GL400) // #88
_extension( 52,GL,ARB,gpu_shader_fp64, GL320, GL400) // #89
_extension( 53,GL,ARB,shader_subroutine, GL320, GL400) // #90
_extension( 54,GL,ARB,tessellation_shader, GL320, GL400) // #91
_extension( 55,GL,ARB,texture_buffer_object_rgb32, /*?*/ GL210, GL400) // #92
_extension( 56,GL,ARB,transform_feedback2, GL210, GL400) // #93
_extension( 57,GL,ARB,transform_feedback3, GL210, GL400) // #94
_extension( 58,GL,ARB,ES2_compatibility, /*?*/ GL210, GL410) // #95
_extension( 59,GL,ARB,get_program_binary, GL300, GL410) // #96
_extension( 60,GL,ARB,separate_shader_objects, GL210, GL410) // #97
_extension( 61,GL,ARB,shader_precision, GL400, GL410) // #98
_extension( 62,GL,ARB,vertex_attrib_64bit, GL300, GL410) // #99
_extension( 63,GL,ARB,viewport_array, GL210, GL410) // #100
_extension( 64,GL,ARB,robustness, GL210, None) // #105
_extension( 65,GL,ARB,base_instance, GL210, GL420) // #107
_extension( 66,GL,ARB,shading_language_420pack, GL300, GL420) // #108
_extension( 67,GL,ARB,transform_feedback_instanced, GL210, GL420) // #109
_extension( 68,GL,ARB,compressed_texture_pixel_storage, GL210, GL420) // #110
_extension( 69,GL,ARB,conservative_depth, GL300, GL420) // #111
_extension( 70,GL,ARB,internalformat_query, GL210, GL420) // #112
_extension( 71,GL,ARB,map_buffer_alignment, GL210, GL420) // #113
_extension( 72,GL,ARB,shader_atomic_counters, GL300, GL420) // #114
_extension( 73,GL,ARB,shader_image_load_store, GL300, GL420) // #115
_extension( 74,GL,ARB,shading_language_packing, /*?*/ GL210, GL420) // #116
_extension( 75,GL,ARB,texture_storage, GL210, GL420) // #117
_extension( 76,GL,ARB,arrays_of_arrays, GL210, GL430) // #120
_extension( 77,GL,ARB,clear_buffer_object, GL210, GL430) // #121
_extension( 78,GL,ARB,compute_shader, GL420, GL430) // #122
_extension( 79,GL,ARB,copy_image, GL210, GL430) // #123
_extension( 80,GL,ARB,texture_view, GL210, GL430) // #124
_extension( 81,GL,ARB,vertex_attrib_binding, GL210, GL430) // #125
_extension( 82,GL,ARB,robustness_isolation, GL210, None) // #126
_extension( 83,GL,ARB,robustness_application_isolation, GL210, None) // #126
_extension( 84,GL,ARB,robustness_share_group_isolation, GL210, None) // #126
_extension( 85,GL,ARB,ES3_compatibility, GL330, GL430) // #127
_extension( 86,GL,ARB,explicit_uniform_location, GL210, GL430) // #128
_extension( 87,GL,ARB,fragment_layer_viewport, GL300, GL430) // #129
_extension( 88,GL,ARB,framebuffer_no_attachments, GL210, GL430) // #130
_extension( 89,GL,ARB,internalformat_query2, GL210, GL430) // #131
_extension( 90,GL,ARB,invalidate_subdata, GL210, GL430) // #132
_extension( 91,GL,ARB,multi_draw_indirect, GL310, GL430) // #133
_extension( 92,GL,ARB,program_interface_query, GL210, GL430) // #134
_extension( 93,GL,ARB,robust_buffer_access_behavior,GL210, GL430) // #135
_extension( 94,GL,ARB,shader_image_size, GL420, GL430) // #136
_extension( 95,GL,ARB,shader_storage_buffer_object, GL400, GL430) // #137
_extension( 96,GL,ARB,stencil_texturing, GL210, GL430) // #138
_extension( 97,GL,ARB,texture_buffer_range, GL210, GL430) // #139
_extension( 98,GL,ARB,texture_query_levels, GL300, GL430) // #140
_extension( 99,GL,ARB,texture_storage_multisample, GL210, GL430) // #141
_extension(100,GL,ARB,buffer_storage, /*?*/ GL430, GL440) // #144
_extension(101,GL,ARB,clear_texture, GL210, GL440) // #145
_extension(102,GL,ARB,enhanced_layouts, GL310, GL440) // #146
_extension(103,GL,ARB,multi_bind, GL300, GL440) // #147
_extension(104,GL,ARB,query_buffer_object, GL210, GL440) // #148
_extension(105,GL,ARB,texture_mirror_clamp_to_edge, GL210, GL440) // #149
_extension(106,GL,ARB,texture_stencil8, GL210, GL440) // #150
_extension(107,GL,ARB,vertex_type_10f_11f_11f_rev, GL300, GL440) // #151
_extension(108,GL,ARB,bindless_texture, GL400, None) // #152
_extension(109,GL,ARB,compute_variable_group_size, GL420, None) // #153
_extension(110,GL,ARB,indirect_parameters, GL420, GL460) // #154
_extension(111,GL,ARB,seamless_cubemap_per_texture, GL320, None) // #155
_extension(112,GL,ARB,shader_draw_parameters, GL310, GL460) // #156
_extension(113,GL,ARB,shader_group_vote, GL420, GL460) // #157
_extension(114,GL,ARB,sparse_texture, GL210, None) // #158
_extension(115,GL,ARB,ES3_1_compatibility, GL440, GL450) // #159
_extension(116,GL,ARB,clip_control, GL210, GL450) // #160
_extension(117,GL,ARB,conditional_render_inverted, GL300, GL450) // #161
_extension(118,GL,ARB,cull_distance, GL300, GL450) // #162
_extension(119,GL,ARB,derivative_control, GL400, GL450) // #163
_extension(120,GL,ARB,direct_state_access, GL210, GL450) // #164
_extension(121,GL,ARB,get_texture_sub_image, GL210, GL450) // #165
_extension(122,GL,ARB,shader_texture_image_samples, GL430, GL450) // #166
_extension(123,GL,ARB,texture_barrier, GL210, GL450) // #167
_extension(124,GL,ARB,pipeline_statistics_query, GL300, GL460) // #171
_extension(125,GL,ARB,sparse_buffer, GL210, None) // #172
_extension(126,GL,ARB,transform_feedback_overflow_query, GL300, None) // #173
_extension(127,GL,ARB,ES3_2_compatibility, GL450, None) // #177
_extension(128,GL,ARB,shader_atomic_counter_ops, GL300, GL460) // #182
_extension(129,GL,ARB,gl_spirv, GL330, GL460) // #190
_extension(130,GL,ARB,polygon_offset_clamp, GL330, GL460) // #193
_extension(131,GL,ARB,spirv_extensions, GL330, GL460) // #194
_extension(132,GL,ARB,texture_filter_anisotropic, GL210, GL460) // #195
} namespace ATI {
_extension(133,GL,ATI,texture_mirror_once, GL210, None) // #221
} namespace EXT {
_extension(140,GL,EXT,texture_filter_anisotropic, GL210, None) // #187
_extension(141,GL,EXT,texture_compression_s3tc, GL210, None) // #198
/* EXT_framebuffer_object, EXT_packed_depth_stencil, EXT_framebuffer_blit,
EXT_framebuffer_multisample replaced with ARB_framebuffer_object */
_extension(142,GL,EXT,texture_mirror_clamp, GL210, None) // #298
_extension(143,GL,EXT,gpu_shader4, GL210, GL300) // #326
_extension(144,GL,EXT,packed_float, GL210, GL300) // #328
_extension(145,GL,EXT,texture_array, GL210, GL300) // #329
_extension(146,GL,EXT,texture_compression_rgtc, GL210, GL300) // #332
_extension(147,GL,EXT,texture_shared_exponent, GL210, GL300) // #333
_extension(148,GL,EXT,draw_buffers2, GL210, GL300) // #340
_extension(149,GL,EXT,texture_integer, GL210, GL300) // #343
_extension(150,GL,EXT,transform_feedback, GL210, GL300) // #352
_extension(151,GL,EXT,direct_state_access, GL210, None) // #353
_extension(152,GL,EXT,texture_snorm, GL300, GL310) // #365
_extension(153,GL,EXT,texture_sRGB_decode, GL210, None) // #402
_extension(154,GL,EXT,shader_integer_mix, GL300, None) // #437
_extension(155,GL,EXT,debug_label, GL210, None) // #439
_extension(156,GL,EXT,debug_marker, GL210, None) // #440
} namespace GREMEDY {
_extension(157,GL,GREMEDY,string_marker, GL210, None) // #311
} namespace KHR {
_extension(160,GL,KHR,texture_compression_astc_ldr, GL210, None) // #118
_extension(161,GL,KHR,texture_compression_astc_hdr, GL210, None) // #118
_extension(162,GL,KHR,debug, GL210, GL430) // #119
_extension(163,GL,KHR,context_flush_control, GL210, GL450) // #168
_extension(164,GL,KHR,robust_buffer_access_behavior, GL320, None) // #169
_extension(165,GL,KHR,robustness, GL320, GL450) // #170
_extension(166,GL,KHR,blend_equation_advanced, GL210, None) // #174
_extension(167,GL,KHR,blend_equation_advanced_coherent, GL210, None) // #174
_extension(168,GL,KHR,no_error, GL210, None) // #175
} namespace NV {
_extension(169,GL,NV,primitive_restart, GL210, GL310) // #285
_extension(170,GL,NV,depth_buffer_float, GL210, GL300) // #334
_extension(171,GL,NV,conditional_render, GL210, GL300) // #346
/* NV_draw_texture not supported */ // #430
}
/* IMPORTANT: if this line is > 329 (73 + size), don't forget to update array size in Context.h */
#elif defined(MAGNUM_TARGET_WEBGL)
namespace ANGLE {
#ifdef MAGNUM_TARGET_GLES2
_extension( 1,GL,ANGLE,instanced_arrays, GLES200, GLES300) // #19
#endif
} namespace EXT {
_extension( 2,GL,EXT,texture_filter_anisotropic, GLES200, None) // #11
#ifdef MAGNUM_TARGET_GLES2
_extension( 3,GL,EXT,color_buffer_half_float, GLES200, None) // #14
#endif
#ifdef MAGNUM_TARGET_GLES2
_extension( 4,GL,EXT,sRGB, GLES200, GLES300) // #17
_extension( 5,GL,EXT,blend_minmax, GLES200, GLES300) // #25
#endif
_extension( 6,GL,EXT,disjoint_timer_query, GLES200, None) // #26
#ifdef MAGNUM_TARGET_GLES2
_extension( 7,GL,EXT,shader_texture_lod, GLES200, GLES300) // #27
#endif
_extension( 8,GL,EXT,color_buffer_float, GLES300, None) // #31
} namespace OES {
#ifdef MAGNUM_TARGET_GLES2
_extension( 9,GL,OES,texture_float, GLES200, GLES300) // #1
_extension(10,GL,OES,texture_half_float, GLES200, GLES300) // #2
_extension(11,GL,OES,standard_derivatives, GLES200, GLES300) // #4
_extension(12,GL,OES,vertex_array_object, GLES200, GLES300) // #5
_extension(13,GL,OES,element_index_uint, GLES200, GLES300) // #10
#endif
_extension(14,GL,OES,texture_float_linear, GLES200, None) // #20
#ifdef MAGNUM_TARGET_GLES2
_extension(15,GL,OES,texture_half_float_linear, GLES200, GLES300) // #21
_extension(16,GL,OES,fbo_render_mipmap, GLES200, GLES300) // #28
#endif
} namespace WEBGL {
_extension(17,GL,WEBGL,compressed_texture_s3tc, GLES200, None) // #8
#ifdef MAGNUM_TARGET_GLES2
_extension(18,GL,WEBGL,depth_texture, GLES200, GLES300) // #9
_extension(19,GL,WEBGL,color_buffer_float, GLES200, None) // #14
_extension(20,GL,WEBGL,draw_buffers, GLES200, GLES300) // #18
#endif
}
#else
namespace ANDROID {
#ifndef MAGNUM_TARGET_GLES2
_extension( 1,GL,ANDROID,extension_pack_es31a, GLES310, None) // #187
#endif
} namespace ANGLE {
#ifdef MAGNUM_TARGET_GLES2
_extension( 2,GL,ANGLE,framebuffer_blit, GLES200, GLES300) // #83
_extension( 3,GL,ANGLE,framebuffer_multisample, GLES200, GLES300) // #84
_extension( 4,GL,ANGLE,instanced_arrays, GLES200, GLES300) // #109
_extension( 5,GL,ANGLE,depth_texture, GLES200, GLES300) // #138
#endif
} namespace APPLE {
#ifdef MAGNUM_TARGET_GLES2
_extension( 6,GL,APPLE,framebuffer_multisample, GLES200, GLES300) // #78
#endif
_extension( 7,GL,APPLE,texture_format_BGRA8888, GLES200, None) // #79
#ifdef MAGNUM_TARGET_GLES2
_extension( 8,GL,APPLE,texture_max_level, GLES200, None) // #80
#endif
} namespace ARM {
#ifdef MAGNUM_TARGET_GLES2
_extension( 9,GL,ARM,rgba8, GLES200, GLES300) // #82
#endif
_extension( 10,GL,ARM,shader_framebuffer_fetch, GLES200, None) // #165
_extension( 11,GL,ARM,shader_framebuffer_fetch_depth_stencil, GLES200, None) // #166
} namespace EXT {
_extension( 20,GL,EXT,texture_filter_anisotropic, GLES200, None) // #41
#ifdef MAGNUM_TARGET_GLES2
_extension( 21,GL,EXT,texture_type_2_10_10_10_REV, GLES200, GLES300) // #42
#endif
_extension( 22,GL,EXT,texture_format_BGRA8888, GLES200, None) // #51
#ifdef MAGNUM_TARGET_GLES2
_extension( 23,GL,EXT,discard_framebuffer, GLES200, GLES300) // #64
_extension( 24,GL,EXT,blend_minmax, GLES200, GLES300) // #65
#endif
_extension( 25,GL,EXT,read_format_bgra, GLES200, None) // #66
_extension( 26,GL,EXT,multi_draw_arrays, GLES200, None) // #67
#ifdef MAGNUM_TARGET_GLES2
_extension( 27,GL,EXT,shader_texture_lod, GLES200, GLES300) // #77
_extension( 28,GL,EXT,unpack_subimage, GLES200, GLES300) // #90
#endif
_extension( 29,GL,EXT,color_buffer_half_float, GLES200, GLES320) // #97
_extension( 30,GL,EXT,debug_label, GLES200, None) // #98
_extension( 31,GL,EXT,debug_marker, GLES200, None) // #99
#ifdef MAGNUM_TARGET_GLES2
_extension( 32,GL,EXT,occlusion_query_boolean, GLES200, GLES300) // #100
#endif
_extension( 33,GL,EXT,separate_shader_objects, GLES200, None) // #101
#ifdef MAGNUM_TARGET_GLES2
_extension( 34,GL,EXT,shadow_samplers, GLES200, GLES300) // #102
_extension( 35,GL,EXT,texture_rg, GLES200, GLES300) // #103
_extension( 36,GL,EXT,sRGB, GLES200, GLES300) // #105
#endif
_extension( 37,GL,EXT,multisampled_render_to_texture, GLES200, None) // #106
_extension( 38,GL,EXT,robustness, GLES200, None) // #107
#ifdef MAGNUM_TARGET_GLES2
_extension( 39,GL,EXT,texture_storage, GLES200, GLES300) // #108
_extension( 40,GL,EXT,map_buffer_range, GLES200, GLES300) // #121
#endif
_extension( 41,GL,EXT,shader_framebuffer_fetch, GLES200, None) // #122
#ifndef MAGNUM_TARGET_GLES2
_extension( 42,GL,EXT,color_buffer_float, GLES300, GLES320) // #137
#endif
_extension( 43,GL,EXT,disjoint_timer_query, GLES200, None) // #150
#ifdef MAGNUM_TARGET_GLES2
_extension( 44,GL,EXT,draw_buffers, GLES200, GLES300) // #151
#endif
_extension( 45,GL,EXT,texture_sRGB_decode, GLES200, None) // #152
_extension( 46,GL,EXT,sRGB_write_control, GLES200, None) // #153
_extension( 47,GL,EXT,texture_compression_s3tc, GLES200, None) // #154
#ifdef MAGNUM_TARGET_GLES2
_extension( 48,GL,EXT,instanced_arrays, GLES200, GLES300) // #156
_extension( 49,GL,EXT,draw_instanced, GLES200, GLES300) // #157
#endif
#ifndef MAGNUM_TARGET_GLES2
_extension( 50,GL,EXT,shader_integer_mix, GLES300, None) // #161
_extension( 51,GL,EXT,copy_image, GLES300, GLES320) // #175
#endif
_extension( 52,GL,EXT,draw_buffers_indexed, GLES200, GLES320) // #176
#ifndef MAGNUM_TARGET_GLES2
_extension( 53,GL,EXT,geometry_shader, GLES310, GLES320) // #177
_extension( 54,GL,EXT,gpu_shader5, GLES310, GLES320) // #178
_extension( 55,GL,EXT,shader_io_blocks, GLES310, GLES320) // #180
_extension( 56,GL,EXT,tessellation_shader, GLES310, GLES320) // #181
#endif
_extension( 57,GL,EXT,texture_border_clamp, GLES200, GLES320) // #182
#ifndef MAGNUM_TARGET_GLES2
_extension( 58,GL,EXT,texture_buffer, GLES310, GLES320) // #183
_extension( 59,GL,EXT,texture_cube_map_array, GLES310, GLES320) // #184
_extension( 60,GL,EXT,primitive_bounding_box, GLES310, GLES320) // #186
#endif
_extension( 61,GL,EXT,polygon_offset_clamp, GLES200, None) // #252
} namespace KHR {
_extension( 70,GL,KHR,texture_compression_astc_ldr, GLES200, GLES320) // #117
_extension( 71,GL,KHR,texture_compression_astc_hdr, GLES200, None) // #117
_extension( 72,GL,KHR,debug, GLES200, GLES320) // #118
_extension( 73,GL,KHR,blend_equation_advanced, GLES200, GLES320) // #168
_extension( 74,GL,KHR,blend_equation_advanced_coherent, GLES200, None) // #168
_extension( 75,GL,KHR,robustness, GLES200, GLES320) // #170
_extension( 76,GL,KHR,robust_buffer_access_behavior, GLES200, GLES320) // #189
_extension( 77,GL,KHR,context_flush_control, GLES200, None) // #191
_extension( 78,GL,KHR,no_error, GLES200, None) // #243
} namespace NV {
#ifdef MAGNUM_TARGET_GLES2
_extension( 80,GL,NV,draw_buffers, GLES200, GLES300) // #91
_extension( 81,GL,NV,fbo_color_attachments, GLES200, GLES300) // #92
_extension( 82,GL,NV,read_buffer, GLES200, GLES300) // #93
#endif
_extension( 83,GL,NV,read_buffer_front, GLES200, None) // #93
_extension( 84,GL,NV,read_depth, GLES200, None) // #94
_extension( 85,GL,NV,read_stencil, GLES200, None) // #94
_extension( 86,GL,NV,read_depth_stencil, GLES200, None) // #94
#ifdef MAGNUM_TARGET_GLES2
_extension( 87,GL,NV,pack_subimage, GLES200, GLES300) // #132
_extension( 88,GL,NV,draw_instanced, GLES200, GLES300) // #141
_extension( 89,GL,NV,framebuffer_blit, GLES200, GLES300) // #142
_extension( 90,GL,NV,framebuffer_multisample, GLES200, GLES300) // #143
_extension( 91,GL,NV,instanced_arrays, GLES200, GLES300) // #145
_extension( 92,GL,NV,shadow_samplers_array, GLES200, GLES300) // #146
_extension( 93,GL,NV,shadow_samplers_cube, GLES200, GLES300) // #147
#endif
_extension( 94,GL,NV,texture_border_clamp, GLES200, None) // #149
#ifndef MAGNUM_TARGET_GLES2
_extension( 95,GL,NV,shader_noperspective_interpolation, GLES300, None) // #201
#endif
_extension( 96,GL,NV,polygon_mode, GLES200, None) // #238
} namespace OES {
#ifdef MAGNUM_TARGET_GLES2
_extension(100,GL,OES,depth24, GLES200, GLES300) // #24
#endif
_extension(101,GL,OES,depth32, GLES200, None) // #25
#ifdef MAGNUM_TARGET_GLES2
_extension(102, GL,OES,element_index_uint, GLES200, GLES300) // #26
_extension(103,GL,OES,fbo_render_mipmap, GLES200, GLES300) // #27
#endif
_extension(104,GL,OES,mapbuffer, GLES200, None) // #29
#ifdef MAGNUM_TARGET_GLES2
_extension(105,GL,OES,rgb8_rgba8, GLES200, GLES300) // #30
#endif
_extension(106,GL,OES,stencil1, GLES200, None) // #31
_extension(107,GL,OES,stencil4, GLES200, None) // #32
#ifdef MAGNUM_TARGET_GLES2
_extension(108,GL,OES,texture_3D, GLES200, GLES300) // #34
_extension(109,GL,OES,texture_half_float_linear, GLES200, GLES300) // #35
#endif
_extension(110,GL,OES,texture_float_linear, GLES200, None) // #35
#ifdef MAGNUM_TARGET_GLES2
_extension(111,GL,OES,texture_half_float, GLES200, GLES300) // #36
_extension(112,GL,OES,texture_float, GLES200, GLES300) // #36
_extension(113,GL,OES,texture_npot, GLES200, GLES300) // #37
_extension(114,GL,OES,vertex_half_float, GLES200, GLES300) // #38
_extension(115,GL,OES,packed_depth_stencil, GLES200, GLES300) // #43
_extension(116,GL,OES,depth_texture, GLES200, GLES300) // #44
_extension(117,GL,OES,standard_derivatives, GLES200, GLES300) // #45
_extension(118,GL,OES,vertex_array_object, GLES200, GLES300) // #71
_extension(119,GL,OES,required_internalformat, GLES200, GLES300) // #115
_extension(120,GL,OES,surfaceless_context, GLES200, GLES300) // #116
#endif
#ifndef MAGNUM_TARGET_GLES2
_extension(121,GL,OES,sample_shading, GLES300, GLES320) // #169
_extension(122,GL,OES,sample_variables, GLES300, GLES320) // #170
_extension(123,GL,OES,shader_image_atomic, GLES310, GLES320) // #171
_extension(124,GL,OES,shader_multisample_interpolation, GLES300, GLES320) // #172
#endif
_extension(125,GL,OES,texture_stencil8, GLES200, GLES320) // #173
#ifndef MAGNUM_TARGET_GLES2
_extension(126,GL,OES,texture_storage_multisample_2d_array, GLES310, GLES320) // #174
#endif
}
#endif
}
#undef _extension
#endif

54
src/Magnum/Test/ContextTest.cpp

@ -27,12 +27,15 @@
#include <Corrade/TestSuite/Tester.h>
#include "Magnum/Context.h"
#include "Magnum/Version.h"
namespace Magnum { namespace Test {
struct ContextTest: TestSuite::Tester {
explicit ContextTest();
void extensions();
void debugFlag();
void debugFlags();
@ -41,13 +44,62 @@ struct ContextTest: TestSuite::Tester {
};
ContextTest::ContextTest() {
addTests({&ContextTest::debugFlag,
addTests({&ContextTest::extensions,
&ContextTest::debugFlag,
&ContextTest::debugFlags,
&ContextTest::debugDetectedDriver,
&ContextTest::debugDetectedDrivers});
}
void ContextTest::extensions() {
const char* used[Implementation::ExtensionCount]{};
/* Check that all extension indices are unique */
for(Version version: {
#ifndef MAGNUM_TARGET_GLES
Version::GL300,
Version::GL310,
Version::GL320,
Version::GL330,
Version::GL400,
Version::GL410,
Version::GL420,
Version::GL430,
Version::GL440,
Version::GL450,
Version::GL460,
#else
Version::GLES200,
Version::GLES300,
#ifndef MAGNUM_TARGET_WEBGL
Version::GLES310,
Version::GLES320,
#endif
#endif
Version::None})
{
for(const Extension& e: Extension::extensions(version)) {
if(e.index() >= Implementation::ExtensionCount) {
Error{} << "Index" << e.index() << "used by" << e.string()
<< "larger than" << Implementation::ExtensionCount;
CORRADE_VERIFY(false);
}
if(used[e.index()]) {
Error{} << "Index" << e.index() << "used by both"
<< used[e.index()] << "and" << e.string();
CORRADE_VERIFY(false);
}
used[e.index()] = e.string();
}
}
CORRADE_VERIFY(true);
}
void ContextTest::debugFlag() {
#ifdef MAGNUM_TARGET_WEBGL
CORRADE_SKIP("No context flags on Emscripten yet.");

Loading…
Cancel
Save