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. 640
      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 @cpp Context::tryCreate() @ce in `src/Magnum/Context.cpp`
- to specify GLSL version in `src/Magnum/Shader.cpp` - to specify GLSL version in `src/Magnum/Shader.cpp`
- to the list in `src/Magnum/Platform/magnum-info.cpp` - to the list in `src/Magnum/Platform/magnum-info.cpp`
12. Add new extensions to `src/Magnum/Extensions.h`, order them by extension - to the test in `src/Magnum/Test/ContextTest.cpp`
ID that is mentioned in every extension spec file 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 13. Update existing extensions with version in which they become core (last
parameter of the `_extension()` macro) parameter of the `_extension()` macro)
14. Update extension list in `src/magnum/Context.cpp` according to changes in 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 { namespace Implementation {
struct ContextState; struct ContextState;
struct State; 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; } namespace Platform { class Context; }
/** /**
@ -642,8 +654,8 @@ class MAGNUM_EXPORT Context {
Flags _flags; Flags _flags;
#endif #endif
std::array<Version, 256> _extensionRequiredVersion; std::array<Version, Implementation::ExtensionCount> _extensionRequiredVersion;
std::bitset<256> _extensionStatus; std::bitset<Implementation::ExtensionCount> _extensionStatus;
std::vector<Extension> _supportedExtensions; std::vector<Extension> _supportedExtensions;
Implementation::State* _state; Implementation::State* _state;

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

54
src/Magnum/Test/ContextTest.cpp

@ -27,12 +27,15 @@
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include "Magnum/Context.h" #include "Magnum/Context.h"
#include "Magnum/Version.h"
namespace Magnum { namespace Test { namespace Magnum { namespace Test {
struct ContextTest: TestSuite::Tester { struct ContextTest: TestSuite::Tester {
explicit ContextTest(); explicit ContextTest();
void extensions();
void debugFlag(); void debugFlag();
void debugFlags(); void debugFlags();
@ -41,13 +44,62 @@ struct ContextTest: TestSuite::Tester {
}; };
ContextTest::ContextTest() { ContextTest::ContextTest() {
addTests({&ContextTest::debugFlag, addTests({&ContextTest::extensions,
&ContextTest::debugFlag,
&ContextTest::debugFlags, &ContextTest::debugFlags,
&ContextTest::debugDetectedDriver, &ContextTest::debugDetectedDriver,
&ContextTest::debugDetectedDrivers}); &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() { void ContextTest::debugFlag() {
#ifdef MAGNUM_TARGET_WEBGL #ifdef MAGNUM_TARGET_WEBGL
CORRADE_SKIP("No context flags on Emscripten yet."); CORRADE_SKIP("No context flags on Emscripten yet.");

Loading…
Cancel
Save