From b05c88737510cb9afd01c5c65ece2b1251abb7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 20 Mar 2019 16:44:38 +0100 Subject: [PATCH] Audio, GL: make the extension lists constexpr. The Audio::Extension::extensions() and GL::Extension::extensions() functions now return an ArrayView instead of a reference to std::vector. Having a function-local static std::vector is the worst thing ever. Ugh. --- doc/changelog.dox | 3 + src/Magnum/Audio/Context.cpp | 29 +- src/Magnum/Audio/Context.h | 8 +- src/Magnum/Audio/Test/ContextTest.cpp | 1 + src/Magnum/Audio/al-info.cpp | 1 + src/Magnum/GL/Context.cpp | 712 +++++++++++++------------- src/Magnum/GL/Context.h | 8 +- 7 files changed, 390 insertions(+), 372 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 16d71aa0c..e77eafede 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -337,6 +337,9 @@ See also: up compile times. Backwards compatibility is not provided, when using @ref Math types with @ref Corrade::Utility::Configuration or @ref Corrade::Utility::Arguments you have to include the header explicitly +- @ref Audio::Extension::extensions() and @ref GL::Extension::extensions() + now return a @ref Corrade::Containers::ArrayView instead of a reference to + @ref std::vector in order to reduce binary bloat and compile times - Removed all aliases to @ref GL library functionality in the root namespace (and root include path) which were deprecated in 2018.04 and everything related to this change: diff --git a/src/Magnum/Audio/Context.cpp b/src/Magnum/Audio/Context.cpp index 325a1ad45..47b16a2e7 100644 --- a/src/Magnum/Audio/Context.cpp +++ b/src/Magnum/Audio/Context.cpp @@ -41,21 +41,26 @@ namespace Magnum { namespace Audio { -const std::vector& Extension::extensions() { +namespace { + +constexpr Extension ExtensionList[]{ #define _extension(prefix, vendor, extension) {Extensions::prefix::vendor::extension::Index, Extensions::prefix::vendor::extension::string()} - static const std::vector extensions{ - _extension(AL,EXT,FLOAT32), - _extension(AL,EXT,DOUBLE), - _extension(AL,EXT,ALAW), - _extension(AL,EXT,MULAW), - _extension(AL,EXT,MCFORMATS), - _extension(ALC,EXT,ENUMERATION), - _extension(ALC,SOFTX,HRTF), - _extension(ALC,SOFT,HRTF) - }; + _extension(AL,EXT,FLOAT32), + _extension(AL,EXT,DOUBLE), + _extension(AL,EXT,ALAW), + _extension(AL,EXT,MULAW), + _extension(AL,EXT,MCFORMATS), + _extension(ALC,EXT,ENUMERATION), + _extension(ALC,SOFTX,HRTF), + _extension(ALC,SOFT,HRTF) #undef _entension +}; - return extensions; +} + +Containers::ArrayView Extension::extensions() { + /* GCC 4.8 needs an explicit cast */ + return Containers::arrayView(ExtensionList); } Debug& operator<<(Debug& debug, const Context::HrtfStatus value) { diff --git a/src/Magnum/Audio/Context.h b/src/Magnum/Audio/Context.h index 9d2aa7f4e..2c9e78009 100644 --- a/src/Magnum/Audio/Context.h +++ b/src/Magnum/Audio/Context.h @@ -63,7 +63,7 @@ information about OpenAL extensions. class MAGNUM_AUDIO_EXPORT Extension { public: /** @brief All OpenAL extensions */ - static const std::vector& extensions(); + static Containers::ArrayView extensions(); /** @brief Internal unique extension index */ constexpr std::size_t index() const { return _index; } @@ -71,12 +71,14 @@ class MAGNUM_AUDIO_EXPORT Extension { /** @brief Extension string */ constexpr const char* string() const { return _string; } + #ifndef DOXYGEN_GENERATING_OUTPUT + constexpr Extension(std::size_t index, const char* string): _index{index}, _string{string} {} + #endif + private: /* MSVC seems to have problems with const members */ std::size_t _index; const char* _string; - - constexpr Extension(std::size_t index, const char* string): _index(index), _string(string) {} }; /** diff --git a/src/Magnum/Audio/Test/ContextTest.cpp b/src/Magnum/Audio/Test/ContextTest.cpp index 4b15b51f1..1eb0138f6 100644 --- a/src/Magnum/Audio/Test/ContextTest.cpp +++ b/src/Magnum/Audio/Test/ContextTest.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include diff --git a/src/Magnum/Audio/al-info.cpp b/src/Magnum/Audio/al-info.cpp index bb55b8925..f4151a6b7 100644 --- a/src/Magnum/Audio/al-info.cpp +++ b/src/Magnum/Audio/al-info.cpp @@ -23,6 +23,7 @@ DEALINGS IN THE SOFTWARE. */ +#include #include #include diff --git a/src/Magnum/GL/Context.cpp b/src/Magnum/GL/Context.cpp index 31669c624..32a3bcf79 100644 --- a/src/Magnum/GL/Context.cpp +++ b/src/Magnum/GL/Context.cpp @@ -67,370 +67,374 @@ namespace Magnum { namespace GL { -const std::vector& Extension::extensions(Version version) { - #define _extension(vendor, extension) \ - {Extensions::vendor::extension::Index, Extensions::vendor::extension::requiredVersion(), Extensions::vendor::extension::coreVersion(), Extensions::vendor::extension::string()} - static const std::vector empty; - #ifndef MAGNUM_TARGET_GLES - static const std::vector extensions{ - _extension(AMD,transform_feedback3_lines_triangles), - _extension(AMD,vertex_shader_layer), - _extension(AMD,shader_trinary_minmax), - _extension(ARB,robustness), - _extension(ARB,robustness_isolation), - _extension(ARB,robustness_application_isolation), - _extension(ARB,robustness_share_group_isolation), - _extension(ARB,bindless_texture), - _extension(ARB,compute_variable_group_size), - _extension(ARB,seamless_cubemap_per_texture), - _extension(ARB,sparse_texture), - _extension(ARB,sparse_buffer), - _extension(ARB,ES3_2_compatibility), - _extension(ATI,texture_mirror_once), - _extension(EXT,texture_filter_anisotropic), - _extension(EXT,texture_compression_s3tc), - _extension(EXT,texture_mirror_clamp), - _extension(EXT,texture_sRGB_decode), - _extension(EXT,shader_integer_mix), - _extension(EXT,debug_label), - _extension(EXT,debug_marker), - _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)}; - static const std::vector extensions300{ - _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_vertex), - _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,transform_feedback), - _extension(MAGNUM,shader_vertex_id), - _extension(NV,depth_buffer_float), - _extension(NV,conditional_render)}; - static const std::vector extensions310{ - _extension(ARB,texture_rectangle), - _extension(ARB,draw_instanced), - _extension(ARB,texture_buffer_object), - _extension(ARB,uniform_buffer_object), - _extension(ARB,copy_buffer), - _extension(EXT,texture_snorm), - _extension(NV,primitive_restart)}; - static const std::vector extensions320{ - _extension(ARB,geometry_shader4), - _extension(ARB,depth_clamp), - _extension(ARB,draw_elements_base_vertex), - _extension(ARB,fragment_coord_conventions), - _extension(ARB,provoking_vertex), - _extension(ARB,seamless_cube_map), - _extension(ARB,sync), - _extension(ARB,texture_multisample), - _extension(ARB,vertex_array_bgra)}; - static const std::vector extensions330{ - _extension(ARB,instanced_arrays), - _extension(ARB,blend_func_extended), - _extension(ARB,explicit_attrib_location), - _extension(ARB,occlusion_query2), - _extension(ARB,sampler_objects), - _extension(ARB,shader_bit_encoding), - _extension(ARB,texture_rgb10_a2ui), - _extension(ARB,texture_swizzle), - _extension(ARB,timer_query), - _extension(ARB,vertex_type_2_10_10_10_rev)}; - static const std::vector extensions400{ - _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,shader_subroutine), - _extension(ARB,tessellation_shader), - _extension(ARB,texture_buffer_object_rgb32), - _extension(ARB,transform_feedback2), - _extension(ARB,transform_feedback3)}; - static const std::vector extensions410{ - _extension(ARB,ES2_compatibility), - _extension(ARB,get_program_binary), - _extension(ARB,separate_shader_objects), - _extension(ARB,shader_precision), - _extension(ARB,vertex_attrib_64bit), - _extension(ARB,viewport_array)}; - static const std::vector extensions420{ - _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), - /* Mentioned in GLSL 4.20 specs as newly added */ - _extension(ARB,shading_language_packing), - _extension(ARB,texture_storage)}; - static const std::vector extensions430{ - _extension(ARB,arrays_of_arrays), - _extension(ARB,ES3_compatibility), - _extension(ARB,clear_buffer_object), - _extension(ARB,compute_shader), - _extension(ARB,copy_image), - _extension(ARB,explicit_uniform_location), - _extension(ARB,fragment_layer_viewport), - _extension(ARB,framebuffer_no_attachments), - _extension(ARB,internalformat_query2), - _extension(ARB,invalidate_subdata), - _extension(ARB,multi_draw_indirect), - _extension(ARB,program_interface_query), - _extension(ARB,robust_buffer_access_behavior), - _extension(ARB,shader_image_size), - _extension(ARB,shader_storage_buffer_object), - _extension(ARB,stencil_texturing), - _extension(ARB,texture_buffer_range), - _extension(ARB,texture_query_levels), - _extension(ARB,texture_storage_multisample), - _extension(ARB,texture_view), - _extension(ARB,vertex_attrib_binding), - _extension(KHR,debug)}; - static const std::vector extensions440{ - _extension(ARB,buffer_storage), - _extension(ARB,clear_texture), - _extension(ARB,enhanced_layouts), - _extension(ARB,multi_bind), - _extension(ARB,query_buffer_object), - _extension(ARB,texture_mirror_clamp_to_edge), - _extension(ARB,texture_stencil8), - _extension(ARB,vertex_type_10f_11f_11f_rev)}; - static const std::vector extensions450{ - _extension(ARB,ES3_1_compatibility), - _extension(ARB,clip_control), - _extension(ARB,conditional_render_inverted), - _extension(ARB,cull_distance), - _extension(ARB,derivative_control), - _extension(ARB,direct_state_access), - _extension(ARB,get_texture_sub_image), - _extension(ARB,shader_texture_image_samples), - _extension(ARB,texture_barrier), - _extension(KHR,context_flush_control), - _extension(KHR,robustness)}; - static const std::vector extensions460{ - _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,spirv_extensions), - _extension(ARB,texture_filter_anisotropic), - _extension(KHR,no_error)}; - #elif defined(MAGNUM_TARGET_WEBGL) - static const std::vector extensions{ - _extension(EXT,texture_filter_anisotropic), - _extension(EXT,disjoint_timer_query), - _extension(EXT,color_buffer_float), - _extension(OES,texture_float_linear), - _extension(WEBGL,compressed_texture_s3tc)}; - static const std::vector extensionsES300{ - #ifdef MAGNUM_TARGET_GLES2 - _extension(ANGLE,instanced_arrays), - _extension(EXT,color_buffer_half_float), - _extension(EXT,sRGB), - _extension(EXT,blend_minmax), - _extension(EXT,shader_texture_lod), - #endif - _extension(MAGNUM,shader_vertex_id), - #ifdef MAGNUM_TARGET_GLES2 - _extension(OES,texture_float), - _extension(OES,texture_half_float), - _extension(OES,standard_derivatives), - _extension(OES,vertex_array_object), - _extension(OES,element_index_uint), - _extension(OES,texture_half_float_linear), - _extension(OES,fbo_render_mipmap), - _extension(WEBGL,depth_texture), - _extension(WEBGL,color_buffer_float), - _extension(WEBGL,draw_buffers) - #endif +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,vertex_shader_layer), + _extension(AMD,shader_trinary_minmax), + _extension(ARB,robustness), + _extension(ARB,robustness_isolation), + _extension(ARB,robustness_application_isolation), + _extension(ARB,robustness_share_group_isolation), + _extension(ARB,bindless_texture), + _extension(ARB,compute_variable_group_size), + _extension(ARB,seamless_cubemap_per_texture), + _extension(ARB,sparse_texture), + _extension(ARB,sparse_buffer), + _extension(ARB,ES3_2_compatibility), + _extension(ATI,texture_mirror_once), + _extension(EXT,texture_filter_anisotropic), + _extension(EXT,texture_compression_s3tc), + _extension(EXT,texture_mirror_clamp), + _extension(EXT,texture_sRGB_decode), + _extension(EXT,shader_integer_mix), + _extension(EXT,debug_label), + _extension(EXT,debug_marker), + _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)}; +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_vertex), + _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,transform_feedback), + _extension(MAGNUM,shader_vertex_id), + _extension(NV,depth_buffer_float), + _extension(NV,conditional_render)}; +constexpr Extension ExtensionList310[]{ + _extension(ARB,texture_rectangle), + _extension(ARB,draw_instanced), + _extension(ARB,texture_buffer_object), + _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,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,occlusion_query2), + _extension(ARB,sampler_objects), + _extension(ARB,shader_bit_encoding), + _extension(ARB,texture_rgb10_a2ui), + _extension(ARB,texture_swizzle), + _extension(ARB,timer_query), + _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,shader_subroutine), + _extension(ARB,tessellation_shader), + _extension(ARB,texture_buffer_object_rgb32), + _extension(ARB,transform_feedback2), + _extension(ARB,transform_feedback3)}; +constexpr Extension ExtensionList410[]{ + _extension(ARB,ES2_compatibility), + _extension(ARB,get_program_binary), + _extension(ARB,separate_shader_objects), + _extension(ARB,shader_precision), + _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), + /* Mentioned in GLSL 4.20 specs as newly added */ + _extension(ARB,shading_language_packing), + _extension(ARB,texture_storage)}; +constexpr Extension ExtensionList430[]{ + _extension(ARB,arrays_of_arrays), + _extension(ARB,ES3_compatibility), + _extension(ARB,clear_buffer_object), + _extension(ARB,compute_shader), + _extension(ARB,copy_image), + _extension(ARB,explicit_uniform_location), + _extension(ARB,fragment_layer_viewport), + _extension(ARB,framebuffer_no_attachments), + _extension(ARB,internalformat_query2), + _extension(ARB,invalidate_subdata), + _extension(ARB,multi_draw_indirect), + _extension(ARB,program_interface_query), + _extension(ARB,robust_buffer_access_behavior), + _extension(ARB,shader_image_size), + _extension(ARB,shader_storage_buffer_object), + _extension(ARB,stencil_texturing), + _extension(ARB,texture_buffer_range), + _extension(ARB,texture_query_levels), + _extension(ARB,texture_storage_multisample), + _extension(ARB,texture_view), + _extension(ARB,vertex_attrib_binding), + _extension(KHR,debug)}; +constexpr Extension ExtensionList440[]{ + _extension(ARB,buffer_storage), + _extension(ARB,clear_texture), + _extension(ARB,enhanced_layouts), + _extension(ARB,multi_bind), + _extension(ARB,query_buffer_object), + _extension(ARB,texture_mirror_clamp_to_edge), + _extension(ARB,texture_stencil8), + _extension(ARB,vertex_type_10f_11f_11f_rev)}; +constexpr Extension ExtensionList450[]{ + _extension(ARB,ES3_1_compatibility), + _extension(ARB,clip_control), + _extension(ARB,conditional_render_inverted), + _extension(ARB,cull_distance), + _extension(ARB,derivative_control), + _extension(ARB,direct_state_access), + _extension(ARB,get_texture_sub_image), + _extension(ARB,shader_texture_image_samples), + _extension(ARB,texture_barrier), + _extension(KHR,context_flush_control), + _extension(KHR,robustness)}; +constexpr Extension ExtensionList460[]{ + _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,spirv_extensions), + _extension(ARB,texture_filter_anisotropic), + _extension(KHR,no_error)}; +#elif defined(MAGNUM_TARGET_WEBGL) +constexpr Extension ExtensionList[]{ + _extension(EXT,texture_filter_anisotropic), + _extension(EXT,disjoint_timer_query), + _extension(EXT,color_buffer_float), + _extension(OES,texture_float_linear), + _extension(WEBGL,compressed_texture_s3tc)}; +constexpr Extension ExtensionListES300[]{ + #ifdef MAGNUM_TARGET_GLES2 + _extension(ANGLE,instanced_arrays), + _extension(EXT,color_buffer_half_float), + _extension(EXT,sRGB), + _extension(EXT,blend_minmax), + _extension(EXT,shader_texture_lod), + #endif + _extension(MAGNUM,shader_vertex_id), + #ifdef MAGNUM_TARGET_GLES2 + _extension(OES,texture_float), + _extension(OES,texture_half_float), + _extension(OES,standard_derivatives), + _extension(OES,vertex_array_object), + _extension(OES,element_index_uint), + _extension(OES,texture_half_float_linear), + _extension(OES,fbo_render_mipmap), + _extension(WEBGL,depth_texture), + _extension(WEBGL,color_buffer_float), + _extension(WEBGL,draw_buffers) + #endif +}; +#else +constexpr Extension ExtensionList[]{ + #ifndef MAGNUM_TARGET_GLES2 + _extension(ANDROID,extension_pack_es31a), + #endif + _extension(APPLE,texture_format_BGRA8888), + _extension(ARM,shader_framebuffer_fetch), + _extension(ARM,shader_framebuffer_fetch_depth_stencil), + _extension(EXT,texture_filter_anisotropic), + _extension(EXT,texture_format_BGRA8888), + _extension(EXT,read_format_bgra), + _extension(EXT,multi_draw_arrays), + _extension(EXT,debug_label), + _extension(EXT,debug_marker), + _extension(EXT,separate_shader_objects), + _extension(EXT,multisampled_render_to_texture), + _extension(EXT,robustness), + _extension(EXT,shader_framebuffer_fetch), + _extension(EXT,disjoint_timer_query), + _extension(EXT,texture_sRGB_decode), + _extension(EXT,sRGB_write_control), + _extension(EXT,texture_compression_s3tc), + #ifndef MAGNUM_TARGET_GLES2 + _extension(EXT,shader_integer_mix), + #endif + _extension(EXT,polygon_offset_clamp), + _extension(KHR,texture_compression_astc_hdr), + _extension(KHR,blend_equation_advanced_coherent), + _extension(KHR,context_flush_control), + _extension(KHR,no_error), + _extension(NV,read_buffer_front), + _extension(NV,read_depth), + _extension(NV,read_stencil), + _extension(NV,read_depth_stencil), + _extension(NV,texture_border_clamp), + #ifndef MAGNUM_TARGET_GLES2 + _extension(NV,shader_noperspective_interpolation), + #endif + _extension(NV,polygon_mode), + _extension(OES,depth32), + _extension(OES,mapbuffer), + _extension(OES,stencil1), + _extension(OES,stencil4), + _extension(OES,texture_float_linear)}; +constexpr Extension ExtensionListES300[]{ + #ifdef MAGNUM_TARGET_GLES2 + _extension(ANGLE,framebuffer_blit), + _extension(ANGLE,framebuffer_multisample), + _extension(ANGLE,instanced_arrays), + _extension(ANGLE,depth_texture), + _extension(APPLE,framebuffer_multisample), + _extension(APPLE,texture_max_level), + _extension(ARM,rgba8), + _extension(EXT,texture_type_2_10_10_10_REV), + _extension(EXT,discard_framebuffer), + _extension(EXT,blend_minmax), + _extension(EXT,shader_texture_lod), + _extension(EXT,unpack_subimage), + _extension(EXT,occlusion_query_boolean), + _extension(EXT,shadow_samplers), + _extension(EXT,texture_rg), + _extension(EXT,sRGB), + _extension(EXT,texture_storage), + _extension(EXT,map_buffer_range), + _extension(EXT,draw_buffers), + _extension(EXT,instanced_arrays), + _extension(EXT,draw_instanced), + #endif + _extension(MAGNUM,shader_vertex_id), + #ifdef MAGNUM_TARGET_GLES2 + _extension(NV,draw_buffers), + _extension(NV,fbo_color_attachments), + _extension(NV,read_buffer), + _extension(NV,pack_subimage), + _extension(NV,draw_instanced), + _extension(NV,framebuffer_blit), + _extension(NV,framebuffer_multisample), + _extension(NV,instanced_arrays), + _extension(NV,shadow_samplers_array), + _extension(NV,shadow_samplers_cube), + _extension(OES,depth24), + _extension(OES,element_index_uint), + _extension(OES,fbo_render_mipmap), + _extension(OES,rgb8_rgba8), + _extension(OES,texture_3D), + _extension(OES,texture_half_float_linear), + _extension(OES,texture_half_float), + _extension(OES,texture_float), + _extension(OES,texture_npot), + _extension(OES,vertex_half_float), + _extension(OES,packed_depth_stencil), + _extension(OES,depth_texture), + _extension(OES,standard_derivatives), + _extension(OES,vertex_array_object), + _extension(OES,required_internalformat), + _extension(OES,surfaceless_context) + #endif }; - #else - static const std::vector extensions{ - #ifndef MAGNUM_TARGET_GLES2 - _extension(ANDROID,extension_pack_es31a), - #endif - _extension(APPLE,texture_format_BGRA8888), - _extension(ARM,shader_framebuffer_fetch), - _extension(ARM,shader_framebuffer_fetch_depth_stencil), - _extension(EXT,texture_filter_anisotropic), - _extension(EXT,texture_format_BGRA8888), - _extension(EXT,read_format_bgra), - _extension(EXT,multi_draw_arrays), - _extension(EXT,debug_label), - _extension(EXT,debug_marker), - _extension(EXT,separate_shader_objects), - _extension(EXT,multisampled_render_to_texture), - _extension(EXT,robustness), - _extension(EXT,shader_framebuffer_fetch), - _extension(EXT,disjoint_timer_query), - _extension(EXT,texture_sRGB_decode), - _extension(EXT,sRGB_write_control), - _extension(EXT,texture_compression_s3tc), - #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,shader_integer_mix), - #endif - _extension(EXT,polygon_offset_clamp), - _extension(KHR,texture_compression_astc_hdr), - _extension(KHR,blend_equation_advanced_coherent), - _extension(KHR,context_flush_control), - _extension(KHR,no_error), - _extension(NV,read_buffer_front), - _extension(NV,read_depth), - _extension(NV,read_stencil), - _extension(NV,read_depth_stencil), - _extension(NV,texture_border_clamp), - #ifndef MAGNUM_TARGET_GLES2 - _extension(NV,shader_noperspective_interpolation), - #endif - _extension(NV,polygon_mode), - _extension(OES,depth32), - _extension(OES,mapbuffer), - _extension(OES,stencil1), - _extension(OES,stencil4), - _extension(OES,texture_float_linear)}; - static const std::vector extensionsES300{ - #ifdef MAGNUM_TARGET_GLES2 - _extension(ANGLE,framebuffer_blit), - _extension(ANGLE,framebuffer_multisample), - _extension(ANGLE,instanced_arrays), - _extension(ANGLE,depth_texture), - _extension(APPLE,framebuffer_multisample), - _extension(APPLE,texture_max_level), - _extension(ARM,rgba8), - _extension(EXT,texture_type_2_10_10_10_REV), - _extension(EXT,discard_framebuffer), - _extension(EXT,blend_minmax), - _extension(EXT,shader_texture_lod), - _extension(EXT,unpack_subimage), - _extension(EXT,occlusion_query_boolean), - _extension(EXT,shadow_samplers), - _extension(EXT,texture_rg), - _extension(EXT,sRGB), - _extension(EXT,texture_storage), - _extension(EXT,map_buffer_range), - _extension(EXT,draw_buffers), - _extension(EXT,instanced_arrays), - _extension(EXT,draw_instanced), - #endif - _extension(MAGNUM,shader_vertex_id), - #ifdef MAGNUM_TARGET_GLES2 - _extension(NV,draw_buffers), - _extension(NV,fbo_color_attachments), - _extension(NV,read_buffer), - _extension(NV,pack_subimage), - _extension(NV,draw_instanced), - _extension(NV,framebuffer_blit), - _extension(NV,framebuffer_multisample), - _extension(NV,instanced_arrays), - _extension(NV,shadow_samplers_array), - _extension(NV,shadow_samplers_cube), - _extension(OES,depth24), - _extension(OES,element_index_uint), - _extension(OES,fbo_render_mipmap), - _extension(OES,rgb8_rgba8), - _extension(OES,texture_3D), - _extension(OES,texture_half_float_linear), - _extension(OES,texture_half_float), - _extension(OES,texture_float), - _extension(OES,texture_npot), - _extension(OES,vertex_half_float), - _extension(OES,packed_depth_stencil), - _extension(OES,depth_texture), - _extension(OES,standard_derivatives), - _extension(OES,vertex_array_object), - _extension(OES,required_internalformat), - _extension(OES,surfaceless_context) - #endif - }; - static const std::vector extensionsES320{ - _extension(EXT,color_buffer_half_float), - #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,color_buffer_float), - _extension(EXT,copy_image), - #endif - _extension(EXT,draw_buffers_indexed), - #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,geometry_shader), - _extension(EXT,gpu_shader5), - _extension(EXT,shader_io_blocks), - _extension(EXT,tessellation_shader), - #endif - _extension(EXT,texture_border_clamp), - #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,texture_buffer), - _extension(EXT,texture_cube_map_array), - _extension(EXT,primitive_bounding_box), - #endif - _extension(KHR,texture_compression_astc_ldr), - _extension(KHR,debug), - _extension(KHR,blend_equation_advanced), - _extension(KHR,robustness), - _extension(KHR,robust_buffer_access_behavior), - #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,sample_shading), - _extension(OES,sample_variables), - _extension(OES,shader_image_atomic), - _extension(OES,shader_multisample_interpolation), - #endif - _extension(OES,texture_stencil8), - #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,texture_storage_multisample_2d_array) - #endif - }; +constexpr Extension ExtensionListES320[]{ + _extension(EXT,color_buffer_half_float), + #ifndef MAGNUM_TARGET_GLES2 + _extension(EXT,color_buffer_float), + _extension(EXT,copy_image), #endif - #undef _extension + _extension(EXT,draw_buffers_indexed), + #ifndef MAGNUM_TARGET_GLES2 + _extension(EXT,geometry_shader), + _extension(EXT,gpu_shader5), + _extension(EXT,shader_io_blocks), + _extension(EXT,tessellation_shader), + #endif + _extension(EXT,texture_border_clamp), + #ifndef MAGNUM_TARGET_GLES2 + _extension(EXT,texture_buffer), + _extension(EXT,texture_cube_map_array), + _extension(EXT,primitive_bounding_box), + #endif + _extension(KHR,texture_compression_astc_ldr), + _extension(KHR,debug), + _extension(KHR,blend_equation_advanced), + _extension(KHR,robustness), + _extension(KHR,robust_buffer_access_behavior), + #ifndef MAGNUM_TARGET_GLES2 + _extension(OES,sample_shading), + _extension(OES,sample_variables), + _extension(OES,shader_image_atomic), + _extension(OES,shader_multisample_interpolation), + #endif + _extension(OES,texture_stencil8), + #ifndef MAGNUM_TARGET_GLES2 + _extension(OES,texture_storage_multisample_2d_array) + #endif + }; +#endif +#undef _extension + +} +Containers::ArrayView Extension::extensions(Version version) { switch(version) { - case Version::None: return extensions; + /* GCC 4.8 needs an explicit cast */ + case Version::None: return Containers::arrayView(ExtensionList); #ifndef MAGNUM_TARGET_GLES - case Version::GL210: return empty; - case Version::GL300: return extensions300; - case Version::GL310: return extensions310; - case Version::GL320: return extensions320; - case Version::GL330: return extensions330; - case Version::GL400: return extensions400; - case Version::GL410: return extensions410; - case Version::GL420: return extensions420; - case Version::GL430: return extensions430; - case Version::GL440: return extensions440; - case Version::GL450: return extensions450; - case Version::GL460: return extensions460; + case Version::GL210: return {}; + case Version::GL300: return Containers::arrayView(ExtensionList300); + case Version::GL310: return Containers::arrayView(ExtensionList310); + case Version::GL320: return Containers::arrayView(ExtensionList320); + case Version::GL330: return Containers::arrayView(ExtensionList330); + case Version::GL400: return Containers::arrayView(ExtensionList400); + case Version::GL410: return Containers::arrayView(ExtensionList410); + case Version::GL420: return Containers::arrayView(ExtensionList420); + case Version::GL430: return Containers::arrayView(ExtensionList430); + case Version::GL440: return Containers::arrayView(ExtensionList440); + case Version::GL450: return Containers::arrayView(ExtensionList450); + case Version::GL460: return Containers::arrayView(ExtensionList460); case Version::GLES200: case Version::GLES300: case Version::GLES310: - case Version::GLES320: return empty; + case Version::GLES320: return {}; #else - case Version::GLES200: return empty; - case Version::GLES300: return extensionsES300; + case Version::GLES200: return {}; + case Version::GLES300: return Containers::arrayView(ExtensionListES300); #ifndef MAGNUM_TARGET_WEBGL - case Version::GLES310: return empty; - case Version::GLES320: return extensionsES320; + case Version::GLES310: return {}; + case Version::GLES320: return Containers::arrayView(ExtensionListES320); #endif #endif } diff --git a/src/Magnum/GL/Context.h b/src/Magnum/GL/Context.h index ec6634d8b..f8b0a2672 100644 --- a/src/Magnum/GL/Context.h +++ b/src/Magnum/GL/Context.h @@ -78,7 +78,7 @@ about OpenGL extensions. class MAGNUM_GL_EXPORT Extension { public: /** @brief All extensions for given OpenGL version */ - static const std::vector& extensions(Version version); + static Containers::ArrayView extensions(Version version); /** @brief Internal unique extension index */ constexpr std::size_t index() const { return _index; } @@ -92,13 +92,15 @@ class MAGNUM_GL_EXPORT Extension { /** @brief Extension string */ constexpr const char* string() const { return _string; } + #ifndef DOXYGEN_GENERATING_OUTPUT + constexpr Extension(std::size_t index, Version requiredVersion, Version coreVersion, const char* string): _index{index}, _requiredVersion{requiredVersion}, _coreVersion{coreVersion}, _string{string} {} + #endif + private: std::size_t _index; Version _requiredVersion; Version _coreVersion; const char* _string; - - constexpr Extension(std::size_t index, Version requiredVersion, Version coreVersion, const char* string): _index(index), _requiredVersion(requiredVersion), _coreVersion(coreVersion), _string(string) {} }; /**