diff --git a/src/Magnum/Audio/Context.cpp b/src/Magnum/Audio/Context.cpp index d7095c01c..082fbea0f 100644 --- a/src/Magnum/Audio/Context.cpp +++ b/src/Magnum/Audio/Context.cpp @@ -49,17 +49,19 @@ namespace Magnum { namespace Audio { namespace { +/* Binary search is performed on the extensions, thus they have to be sorted + alphabetically. */ constexpr Extension ExtensionList[]{ #define _extension(prefix, vendor, extension) {Extensions::prefix::vendor::extension::Index, Extensions::prefix::vendor::extension::string()} - _extension(AL,EXT,FLOAT32), - _extension(AL,EXT,DOUBLE), + _extension(ALC,EXT,ENUMERATION), + _extension(ALC,SOFTX,HRTF), + _extension(ALC,SOFT,HRTF), _extension(AL,EXT,ALAW), - _extension(AL,EXT,MULAW), + _extension(AL,EXT,DOUBLE), + _extension(AL,EXT,FLOAT32), _extension(AL,EXT,MCFORMATS), + _extension(AL,EXT,MULAW), _extension(AL,SOFT,loop_points), - _extension(ALC,EXT,ENUMERATION), - _extension(ALC,SOFTX,HRTF), - _extension(ALC,SOFT,HRTF) #undef _entension }; diff --git a/src/Magnum/Audio/Test/ContextTest.cpp b/src/Magnum/Audio/Test/ContextTest.cpp index 9b8e044bb..3f607e5f2 100644 --- a/src/Magnum/Audio/Test/ContextTest.cpp +++ b/src/Magnum/Audio/Test/ContextTest.cpp @@ -74,11 +74,17 @@ void ContextTest::extensions() { std::set unique; /* Check that all extension indices are unique, are listed just once etc. */ + std::string previous; for(const Extension& e: Extension::extensions()) { CORRADE_ITERATION(e.string()); /** @todo convert to CORRADE_ERROR() when that's done */ + if(!previous.empty() && previous >= e.string()) { + Error{} << "Extension not sorted after" << previous; + CORRADE_VERIFY(false); + } + if(e.index() >= Implementation::ExtensionCount) { Error{} << "Index" << e.index() << "larger than" << Implementation::ExtensionCount; CORRADE_VERIFY(false); @@ -94,6 +100,8 @@ void ContextTest::extensions() { Error{} << "Extension listed more than once"; CORRADE_VERIFY(false); } + + previous = e.string(); } CORRADE_VERIFY(true); diff --git a/src/Magnum/GL/Context.cpp b/src/Magnum/GL/Context.cpp index 681fcdba2..9fd2c3156 100644 --- a/src/Magnum/GL/Context.cpp +++ b/src/Magnum/GL/Context.cpp @@ -71,92 +71,95 @@ namespace Magnum { namespace GL { +/* When adding a new list, Extension::extensions() needs to be adapted. Binary + search is performed on the extensions, thus they have to be sorted + alphabetically. */ namespace { #define _extension(vendor, extension) \ {Extensions::vendor::extension::Index, Extensions::vendor::extension::requiredVersion(), Extensions::vendor::extension::coreVersion(), Extensions::vendor::extension::string()} #ifndef MAGNUM_TARGET_GLES constexpr Extension ExtensionList[]{ - _extension(AMD,transform_feedback3_lines_triangles), _extension(AMD,sample_positions), - _extension(AMD,vertex_shader_layer), - _extension(AMD,shader_trinary_minmax), _extension(AMD,shader_explicit_vertex_parameter), + _extension(AMD,shader_trinary_minmax), + _extension(AMD,transform_feedback3_lines_triangles), + _extension(AMD,vertex_shader_layer), + _extension(ARB,ES3_2_compatibility), + _extension(ARB,bindless_texture), + _extension(ARB,compute_variable_group_size), _extension(ARB,robustness), - _extension(ARB,robustness_isolation), _extension(ARB,robustness_application_isolation), + _extension(ARB,robustness_isolation), _extension(ARB,robustness_share_group_isolation), - _extension(ARB,bindless_texture), - _extension(ARB,compute_variable_group_size), + _extension(ARB,sample_locations), _extension(ARB,seamless_cubemap_per_texture), - _extension(ARB,sparse_texture), _extension(ARB,sparse_buffer), - _extension(ARB,ES3_2_compatibility), - _extension(ARB,sample_locations), + _extension(ARB,sparse_texture), _extension(ATI,texture_mirror_once), - _extension(EXT,texture_filter_anisotropic), - _extension(EXT,texture_compression_s3tc), - _extension(EXT,texture_mirror_clamp), - _extension(EXT,texture_compression_dxt1), - _extension(EXT,texture_sRGB_decode), - _extension(EXT,shader_integer_mix), _extension(EXT,debug_label), _extension(EXT,debug_marker), + _extension(EXT,shader_integer_mix), + _extension(EXT,texture_compression_dxt1), + _extension(EXT,texture_compression_s3tc), + _extension(EXT,texture_filter_anisotropic), + _extension(EXT,texture_mirror_clamp), _extension(EXT,texture_sRGB_R8), + _extension(EXT,texture_sRGB_decode), _extension(GREMEDY,string_marker), - _extension(KHR,texture_compression_astc_ldr), - _extension(KHR,texture_compression_astc_hdr), _extension(KHR,blend_equation_advanced), _extension(KHR,blend_equation_advanced_coherent), + _extension(KHR,texture_compression_astc_hdr), + _extension(KHR,texture_compression_astc_ldr), _extension(KHR,texture_compression_astc_sliced_3d), - _extension(NV,sample_locations), _extension(NV,fragment_shader_barycentric), + _extension(NV,sample_locations), _extension(OVR,multiview), _extension(OVR,multiview2)}; constexpr Extension ExtensionList300[]{ - _extension(ARB,map_buffer_range), _extension(ARB,color_buffer_float), - _extension(ARB,half_float_pixel), - _extension(ARB,texture_float), _extension(ARB,depth_buffer_float), - _extension(ARB,texture_rg), - _extension(ARB,vertex_array_object), _extension(ARB,framebuffer_object), _extension(ARB,framebuffer_sRGB), + _extension(ARB,half_float_pixel), _extension(ARB,half_float_vertex), + _extension(ARB,map_buffer_range), + _extension(ARB,texture_float), + _extension(ARB,texture_rg), + _extension(ARB,vertex_array_object), + _extension(EXT,draw_buffers2), _extension(EXT,gpu_shader4), _extension(EXT,packed_float), _extension(EXT,texture_array), _extension(EXT,texture_compression_rgtc), - _extension(EXT,texture_shared_exponent), - _extension(EXT,draw_buffers2), _extension(EXT,texture_integer), + _extension(EXT,texture_shared_exponent), _extension(EXT,transform_feedback), _extension(MAGNUM,shader_vertex_id), - _extension(NV,depth_buffer_float), - _extension(NV,conditional_render)}; + _extension(NV,conditional_render), + _extension(NV,depth_buffer_float)}; constexpr Extension ExtensionList310[]{ - _extension(ARB,texture_rectangle), + _extension(ARB,copy_buffer), _extension(ARB,draw_instanced), _extension(ARB,texture_buffer_object), + _extension(ARB,texture_rectangle), _extension(ARB,uniform_buffer_object), - _extension(ARB,copy_buffer), _extension(EXT,texture_snorm), _extension(NV,primitive_restart)}; constexpr Extension ExtensionList320[]{ - _extension(ARB,geometry_shader4), _extension(ARB,depth_clamp), _extension(ARB,draw_elements_base_vertex), _extension(ARB,fragment_coord_conventions), + _extension(ARB,geometry_shader4), _extension(ARB,provoking_vertex), _extension(ARB,seamless_cube_map), _extension(ARB,sync), _extension(ARB,texture_multisample), _extension(ARB,vertex_array_bgra)}; constexpr Extension ExtensionList330[]{ - _extension(ARB,instanced_arrays), _extension(ARB,blend_func_extended), _extension(ARB,explicit_attrib_location), + _extension(ARB,instanced_arrays), _extension(ARB,occlusion_query2), _extension(ARB,sampler_objects), _extension(ARB,shader_bit_encoding), @@ -166,16 +169,16 @@ constexpr Extension ExtensionList330[]{ _extension(ARB,vertex_type_2_10_10_10_rev)}; constexpr Extension ExtensionList400[]{ _extension(ARB,draw_buffers_blend), - _extension(ARB,sample_shading), - _extension(ARB,texture_cube_map_array), - _extension(ARB,texture_gather), - _extension(ARB,texture_query_lod), _extension(ARB,draw_indirect), _extension(ARB,gpu_shader5), _extension(ARB,gpu_shader_fp64), + _extension(ARB,sample_shading), _extension(ARB,shader_subroutine), _extension(ARB,tessellation_shader), _extension(ARB,texture_buffer_object_rgb32), + _extension(ARB,texture_cube_map_array), + _extension(ARB,texture_gather), + _extension(ARB,texture_query_lod), _extension(ARB,transform_feedback2), _extension(ARB,transform_feedback3)}; constexpr Extension ExtensionList410[]{ @@ -186,22 +189,22 @@ constexpr Extension ExtensionList410[]{ _extension(ARB,vertex_attrib_64bit), _extension(ARB,viewport_array)}; constexpr Extension ExtensionList420[]{ - _extension(ARB,texture_compression_bptc), _extension(ARB,base_instance), - _extension(ARB,shading_language_420pack), - _extension(ARB,transform_feedback_instanced), _extension(ARB,compressed_texture_pixel_storage), _extension(ARB,conservative_depth), _extension(ARB,internalformat_query), _extension(ARB,map_buffer_alignment), _extension(ARB,shader_atomic_counters), _extension(ARB,shader_image_load_store), + _extension(ARB,shading_language_420pack), /* Mentioned in GLSL 4.20 specs as newly added */ _extension(ARB,shading_language_packing), - _extension(ARB,texture_storage)}; + _extension(ARB,texture_compression_bptc), + _extension(ARB,texture_storage), + _extension(ARB,transform_feedback_instanced)}; constexpr Extension ExtensionList430[]{ - _extension(ARB,arrays_of_arrays), _extension(ARB,ES3_compatibility), + _extension(ARB,arrays_of_arrays), _extension(ARB,clear_buffer_object), _extension(ARB,compute_shader), _extension(ARB,copy_image), @@ -244,16 +247,16 @@ constexpr Extension ExtensionList450[]{ _extension(KHR,context_flush_control), _extension(KHR,robustness)}; constexpr Extension ExtensionList460[]{ + _extension(ARB,gl_spirv), _extension(ARB,indirect_parameters), - _extension(ARB,shader_draw_parameters), - _extension(ARB,shader_group_vote), _extension(ARB,pipeline_statistics_query), - _extension(ARB,transform_feedback_overflow_query), - _extension(ARB,shader_atomic_counter_ops), - _extension(ARB,gl_spirv), _extension(ARB,polygon_offset_clamp), + _extension(ARB,shader_atomic_counter_ops), + _extension(ARB,shader_draw_parameters), + _extension(ARB,shader_group_vote), _extension(ARB,spirv_extensions), _extension(ARB,texture_filter_anisotropic), + _extension(ARB,transform_feedback_overflow_query), _extension(KHR,no_error)}; #elif defined(MAGNUM_TARGET_WEBGL) constexpr Extension ExtensionList[]{ diff --git a/src/Magnum/GL/Extensions.h b/src/Magnum/GL/Extensions.h index bb04b6a8a..a9d7c0c27 100644 --- a/src/Magnum/GL/Extensions.h +++ b/src/Magnum/GL/Extensions.h @@ -255,6 +255,8 @@ namespace AMD { _extension(167,KHR,blend_equation_advanced_coherent, GL210, None) // #174 _extension(168,KHR,no_error, GL210, GL460) // #175 _extension(169,KHR,texture_compression_astc_sliced_3d, GL210, None) // #189 +} namespace MAGNUM { + _extension(170,MAGNUM,shader_vertex_id, GL300, GL300) } namespace NV { _extension(175,NV,primitive_restart, GL210, GL310) // #285 _extension(176,NV,depth_buffer_float, GL210, GL300) // #334 @@ -265,8 +267,6 @@ namespace AMD { } namespace OVR { _extension(185,OVR,multiview, GL300, None) // #478 _extension(186,OVR,multiview2, GL300, None) // #479 -} namespace MAGNUM { - _extension(187,MAGNUM,shader_vertex_id, GL300, GL300) } #elif defined(MAGNUM_TARGET_WEBGL) namespace ANGLE { diff --git a/src/Magnum/GL/Test/ContextTest.cpp b/src/Magnum/GL/Test/ContextTest.cpp index 294550a63..724010390 100644 --- a/src/Magnum/GL/Test/ContextTest.cpp +++ b/src/Magnum/GL/Test/ContextTest.cpp @@ -125,12 +125,18 @@ void ContextTest::extensions() { #endif Version::None}) { + std::string previous; for(const Extension& e: Extension::extensions(version)) { CORRADE_ITERATION(version); CORRADE_ITERATION(e.string()); /** @todo convert to CORRADE_ERROR() when that's done */ + if(!previous.empty() && previous >= e.string()) { + Error{} << "Extension not sorted after" << previous; + CORRADE_VERIFY(false); + } + if(e.index() >= GL::Implementation::ExtensionCount) { Error{} << "Index" << e.index() << "larger than" << GL::Implementation::ExtensionCount; CORRADE_VERIFY(false); @@ -173,6 +179,8 @@ void ContextTest::extensions() { CORRADE_VERIFY(false); } #endif + + previous = e.string(); } }