Browse Source

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.
pull/332/head
Vladimír Vondruš 7 years ago
parent
commit
b05c887375
  1. 3
      doc/changelog.dox
  2. 29
      src/Magnum/Audio/Context.cpp
  3. 8
      src/Magnum/Audio/Context.h
  4. 1
      src/Magnum/Audio/Test/ContextTest.cpp
  5. 1
      src/Magnum/Audio/al-info.cpp
  6. 712
      src/Magnum/GL/Context.cpp
  7. 8
      src/Magnum/GL/Context.h

3
doc/changelog.dox

@ -337,6 +337,9 @@ See also:
up compile times. Backwards compatibility is not provided, when using up compile times. Backwards compatibility is not provided, when using
@ref Math types with @ref Corrade::Utility::Configuration or @ref Math types with @ref Corrade::Utility::Configuration or
@ref Corrade::Utility::Arguments you have to include the header explicitly @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 - Removed all aliases to @ref GL library functionality in the root namespace
(and root include path) which were deprecated in 2018.04 and everything (and root include path) which were deprecated in 2018.04 and everything
related to this change: related to this change:

29
src/Magnum/Audio/Context.cpp

@ -41,21 +41,26 @@
namespace Magnum { namespace Audio { namespace Magnum { namespace Audio {
const std::vector<Extension>& Extension::extensions() { namespace {
constexpr Extension ExtensionList[]{
#define _extension(prefix, vendor, extension) {Extensions::prefix::vendor::extension::Index, Extensions::prefix::vendor::extension::string()} #define _extension(prefix, vendor, extension) {Extensions::prefix::vendor::extension::Index, Extensions::prefix::vendor::extension::string()}
static const std::vector<Extension> extensions{ _extension(AL,EXT,FLOAT32),
_extension(AL,EXT,FLOAT32), _extension(AL,EXT,DOUBLE),
_extension(AL,EXT,DOUBLE), _extension(AL,EXT,ALAW),
_extension(AL,EXT,ALAW), _extension(AL,EXT,MULAW),
_extension(AL,EXT,MULAW), _extension(AL,EXT,MCFORMATS),
_extension(AL,EXT,MCFORMATS), _extension(ALC,EXT,ENUMERATION),
_extension(ALC,EXT,ENUMERATION), _extension(ALC,SOFTX,HRTF),
_extension(ALC,SOFTX,HRTF), _extension(ALC,SOFT,HRTF)
_extension(ALC,SOFT,HRTF)
};
#undef _entension #undef _entension
};
return extensions; }
Containers::ArrayView<const Extension> Extension::extensions() {
/* GCC 4.8 needs an explicit cast */
return Containers::arrayView(ExtensionList);
} }
Debug& operator<<(Debug& debug, const Context::HrtfStatus value) { Debug& operator<<(Debug& debug, const Context::HrtfStatus value) {

8
src/Magnum/Audio/Context.h

@ -63,7 +63,7 @@ information about OpenAL extensions.
class MAGNUM_AUDIO_EXPORT Extension { class MAGNUM_AUDIO_EXPORT Extension {
public: public:
/** @brief All OpenAL extensions */ /** @brief All OpenAL extensions */
static const std::vector<Extension>& extensions(); static Containers::ArrayView<const Extension> extensions();
/** @brief Internal unique extension index */ /** @brief Internal unique extension index */
constexpr std::size_t index() const { return _index; } constexpr std::size_t index() const { return _index; }
@ -71,12 +71,14 @@ class MAGNUM_AUDIO_EXPORT Extension {
/** @brief Extension string */ /** @brief Extension string */
constexpr const char* string() const { return _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: private:
/* MSVC seems to have problems with const members */ /* MSVC seems to have problems with const members */
std::size_t _index; std::size_t _index;
const char* _string; const char* _string;
constexpr Extension(std::size_t index, const char* string): _index(index), _string(string) {}
}; };
/** /**

1
src/Magnum/Audio/Test/ContextTest.cpp

@ -25,6 +25,7 @@
*/ */
#include <sstream> #include <sstream>
#include <Corrade/Containers/ArrayView.h>
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include <Corrade/Utility/DebugStl.h> #include <Corrade/Utility/DebugStl.h>

1
src/Magnum/Audio/al-info.cpp

@ -23,6 +23,7 @@
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
*/ */
#include <Corrade/Containers/ArrayView.h>
#include <Corrade/Utility/Arguments.h> #include <Corrade/Utility/Arguments.h>
#include <Corrade/Utility/DebugStl.h> #include <Corrade/Utility/DebugStl.h>

712
src/Magnum/GL/Context.cpp

@ -67,370 +67,374 @@
namespace Magnum { namespace GL { namespace Magnum { namespace GL {
const std::vector<Extension>& Extension::extensions(Version version) { namespace {
#define _extension(vendor, extension) \
{Extensions::vendor::extension::Index, Extensions::vendor::extension::requiredVersion(), Extensions::vendor::extension::coreVersion(), Extensions::vendor::extension::string()} #define _extension(vendor, extension) \
static const std::vector<Extension> empty; {Extensions::vendor::extension::Index, Extensions::vendor::extension::requiredVersion(), Extensions::vendor::extension::coreVersion(), Extensions::vendor::extension::string()}
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
static const std::vector<Extension> extensions{ constexpr Extension ExtensionList[]{
_extension(AMD,transform_feedback3_lines_triangles), _extension(AMD,transform_feedback3_lines_triangles),
_extension(AMD,vertex_shader_layer), _extension(AMD,vertex_shader_layer),
_extension(AMD,shader_trinary_minmax), _extension(AMD,shader_trinary_minmax),
_extension(ARB,robustness), _extension(ARB,robustness),
_extension(ARB,robustness_isolation), _extension(ARB,robustness_isolation),
_extension(ARB,robustness_application_isolation), _extension(ARB,robustness_application_isolation),
_extension(ARB,robustness_share_group_isolation), _extension(ARB,robustness_share_group_isolation),
_extension(ARB,bindless_texture), _extension(ARB,bindless_texture),
_extension(ARB,compute_variable_group_size), _extension(ARB,compute_variable_group_size),
_extension(ARB,seamless_cubemap_per_texture), _extension(ARB,seamless_cubemap_per_texture),
_extension(ARB,sparse_texture), _extension(ARB,sparse_texture),
_extension(ARB,sparse_buffer), _extension(ARB,sparse_buffer),
_extension(ARB,ES3_2_compatibility), _extension(ARB,ES3_2_compatibility),
_extension(ATI,texture_mirror_once), _extension(ATI,texture_mirror_once),
_extension(EXT,texture_filter_anisotropic), _extension(EXT,texture_filter_anisotropic),
_extension(EXT,texture_compression_s3tc), _extension(EXT,texture_compression_s3tc),
_extension(EXT,texture_mirror_clamp), _extension(EXT,texture_mirror_clamp),
_extension(EXT,texture_sRGB_decode), _extension(EXT,texture_sRGB_decode),
_extension(EXT,shader_integer_mix), _extension(EXT,shader_integer_mix),
_extension(EXT,debug_label), _extension(EXT,debug_label),
_extension(EXT,debug_marker), _extension(EXT,debug_marker),
_extension(GREMEDY,string_marker), _extension(GREMEDY,string_marker),
_extension(KHR,texture_compression_astc_ldr), _extension(KHR,texture_compression_astc_ldr),
_extension(KHR,texture_compression_astc_hdr), _extension(KHR,texture_compression_astc_hdr),
_extension(KHR,blend_equation_advanced), _extension(KHR,blend_equation_advanced),
_extension(KHR,blend_equation_advanced_coherent)}; _extension(KHR,blend_equation_advanced_coherent)};
static const std::vector<Extension> extensions300{ constexpr Extension ExtensionList300[]{
_extension(ARB,map_buffer_range), _extension(ARB,map_buffer_range),
_extension(ARB,color_buffer_float), _extension(ARB,color_buffer_float),
_extension(ARB,half_float_pixel), _extension(ARB,half_float_pixel),
_extension(ARB,texture_float), _extension(ARB,texture_float),
_extension(ARB,depth_buffer_float), _extension(ARB,depth_buffer_float),
_extension(ARB,texture_rg), _extension(ARB,texture_rg),
_extension(ARB,vertex_array_object), _extension(ARB,vertex_array_object),
_extension(ARB,framebuffer_object), _extension(ARB,framebuffer_object),
_extension(ARB,framebuffer_sRGB), _extension(ARB,framebuffer_sRGB),
_extension(ARB,half_float_vertex), _extension(ARB,half_float_vertex),
_extension(EXT,gpu_shader4), _extension(EXT,gpu_shader4),
_extension(EXT,packed_float), _extension(EXT,packed_float),
_extension(EXT,texture_array), _extension(EXT,texture_array),
_extension(EXT,texture_compression_rgtc), _extension(EXT,texture_compression_rgtc),
_extension(EXT,texture_shared_exponent), _extension(EXT,texture_shared_exponent),
_extension(EXT,draw_buffers2), _extension(EXT,draw_buffers2),
_extension(EXT,texture_integer), _extension(EXT,texture_integer),
_extension(EXT,transform_feedback), _extension(EXT,transform_feedback),
_extension(MAGNUM,shader_vertex_id), _extension(MAGNUM,shader_vertex_id),
_extension(NV,depth_buffer_float), _extension(NV,depth_buffer_float),
_extension(NV,conditional_render)}; _extension(NV,conditional_render)};
static const std::vector<Extension> extensions310{ constexpr Extension ExtensionList310[]{
_extension(ARB,texture_rectangle), _extension(ARB,texture_rectangle),
_extension(ARB,draw_instanced), _extension(ARB,draw_instanced),
_extension(ARB,texture_buffer_object), _extension(ARB,texture_buffer_object),
_extension(ARB,uniform_buffer_object), _extension(ARB,uniform_buffer_object),
_extension(ARB,copy_buffer), _extension(ARB,copy_buffer),
_extension(EXT,texture_snorm), _extension(EXT,texture_snorm),
_extension(NV,primitive_restart)}; _extension(NV,primitive_restart)};
static const std::vector<Extension> extensions320{ constexpr Extension ExtensionList320[]{
_extension(ARB,geometry_shader4), _extension(ARB,geometry_shader4),
_extension(ARB,depth_clamp), _extension(ARB,depth_clamp),
_extension(ARB,draw_elements_base_vertex), _extension(ARB,draw_elements_base_vertex),
_extension(ARB,fragment_coord_conventions), _extension(ARB,fragment_coord_conventions),
_extension(ARB,provoking_vertex), _extension(ARB,provoking_vertex),
_extension(ARB,seamless_cube_map), _extension(ARB,seamless_cube_map),
_extension(ARB,sync), _extension(ARB,sync),
_extension(ARB,texture_multisample), _extension(ARB,texture_multisample),
_extension(ARB,vertex_array_bgra)}; _extension(ARB,vertex_array_bgra)};
static const std::vector<Extension> extensions330{ constexpr Extension ExtensionList330[]{
_extension(ARB,instanced_arrays), _extension(ARB,instanced_arrays),
_extension(ARB,blend_func_extended), _extension(ARB,blend_func_extended),
_extension(ARB,explicit_attrib_location), _extension(ARB,explicit_attrib_location),
_extension(ARB,occlusion_query2), _extension(ARB,occlusion_query2),
_extension(ARB,sampler_objects), _extension(ARB,sampler_objects),
_extension(ARB,shader_bit_encoding), _extension(ARB,shader_bit_encoding),
_extension(ARB,texture_rgb10_a2ui), _extension(ARB,texture_rgb10_a2ui),
_extension(ARB,texture_swizzle), _extension(ARB,texture_swizzle),
_extension(ARB,timer_query), _extension(ARB,timer_query),
_extension(ARB,vertex_type_2_10_10_10_rev)}; _extension(ARB,vertex_type_2_10_10_10_rev)};
static const std::vector<Extension> extensions400{ constexpr Extension ExtensionList400[]{
_extension(ARB,draw_buffers_blend), _extension(ARB,draw_buffers_blend),
_extension(ARB,sample_shading), _extension(ARB,sample_shading),
_extension(ARB,texture_cube_map_array), _extension(ARB,texture_cube_map_array),
_extension(ARB,texture_gather), _extension(ARB,texture_gather),
_extension(ARB,texture_query_lod), _extension(ARB,texture_query_lod),
_extension(ARB,draw_indirect), _extension(ARB,draw_indirect),
_extension(ARB,gpu_shader5), _extension(ARB,gpu_shader5),
_extension(ARB,gpu_shader_fp64), _extension(ARB,gpu_shader_fp64),
_extension(ARB,shader_subroutine), _extension(ARB,shader_subroutine),
_extension(ARB,tessellation_shader), _extension(ARB,tessellation_shader),
_extension(ARB,texture_buffer_object_rgb32), _extension(ARB,texture_buffer_object_rgb32),
_extension(ARB,transform_feedback2), _extension(ARB,transform_feedback2),
_extension(ARB,transform_feedback3)}; _extension(ARB,transform_feedback3)};
static const std::vector<Extension> extensions410{ constexpr Extension ExtensionList410[]{
_extension(ARB,ES2_compatibility), _extension(ARB,ES2_compatibility),
_extension(ARB,get_program_binary), _extension(ARB,get_program_binary),
_extension(ARB,separate_shader_objects), _extension(ARB,separate_shader_objects),
_extension(ARB,shader_precision), _extension(ARB,shader_precision),
_extension(ARB,vertex_attrib_64bit), _extension(ARB,vertex_attrib_64bit),
_extension(ARB,viewport_array)}; _extension(ARB,viewport_array)};
static const std::vector<Extension> extensions420{ constexpr Extension ExtensionList420[]{
_extension(ARB,texture_compression_bptc), _extension(ARB,texture_compression_bptc),
_extension(ARB,base_instance), _extension(ARB,base_instance),
_extension(ARB,shading_language_420pack), _extension(ARB,shading_language_420pack),
_extension(ARB,transform_feedback_instanced), _extension(ARB,transform_feedback_instanced),
_extension(ARB,compressed_texture_pixel_storage), _extension(ARB,compressed_texture_pixel_storage),
_extension(ARB,conservative_depth), _extension(ARB,conservative_depth),
_extension(ARB,internalformat_query), _extension(ARB,internalformat_query),
_extension(ARB,map_buffer_alignment), _extension(ARB,map_buffer_alignment),
_extension(ARB,shader_atomic_counters), _extension(ARB,shader_atomic_counters),
_extension(ARB,shader_image_load_store), _extension(ARB,shader_image_load_store),
/* Mentioned in GLSL 4.20 specs as newly added */ /* Mentioned in GLSL 4.20 specs as newly added */
_extension(ARB,shading_language_packing), _extension(ARB,shading_language_packing),
_extension(ARB,texture_storage)}; _extension(ARB,texture_storage)};
static const std::vector<Extension> extensions430{ constexpr Extension ExtensionList430[]{
_extension(ARB,arrays_of_arrays), _extension(ARB,arrays_of_arrays),
_extension(ARB,ES3_compatibility), _extension(ARB,ES3_compatibility),
_extension(ARB,clear_buffer_object), _extension(ARB,clear_buffer_object),
_extension(ARB,compute_shader), _extension(ARB,compute_shader),
_extension(ARB,copy_image), _extension(ARB,copy_image),
_extension(ARB,explicit_uniform_location), _extension(ARB,explicit_uniform_location),
_extension(ARB,fragment_layer_viewport), _extension(ARB,fragment_layer_viewport),
_extension(ARB,framebuffer_no_attachments), _extension(ARB,framebuffer_no_attachments),
_extension(ARB,internalformat_query2), _extension(ARB,internalformat_query2),
_extension(ARB,invalidate_subdata), _extension(ARB,invalidate_subdata),
_extension(ARB,multi_draw_indirect), _extension(ARB,multi_draw_indirect),
_extension(ARB,program_interface_query), _extension(ARB,program_interface_query),
_extension(ARB,robust_buffer_access_behavior), _extension(ARB,robust_buffer_access_behavior),
_extension(ARB,shader_image_size), _extension(ARB,shader_image_size),
_extension(ARB,shader_storage_buffer_object), _extension(ARB,shader_storage_buffer_object),
_extension(ARB,stencil_texturing), _extension(ARB,stencil_texturing),
_extension(ARB,texture_buffer_range), _extension(ARB,texture_buffer_range),
_extension(ARB,texture_query_levels), _extension(ARB,texture_query_levels),
_extension(ARB,texture_storage_multisample), _extension(ARB,texture_storage_multisample),
_extension(ARB,texture_view), _extension(ARB,texture_view),
_extension(ARB,vertex_attrib_binding), _extension(ARB,vertex_attrib_binding),
_extension(KHR,debug)}; _extension(KHR,debug)};
static const std::vector<Extension> extensions440{ constexpr Extension ExtensionList440[]{
_extension(ARB,buffer_storage), _extension(ARB,buffer_storage),
_extension(ARB,clear_texture), _extension(ARB,clear_texture),
_extension(ARB,enhanced_layouts), _extension(ARB,enhanced_layouts),
_extension(ARB,multi_bind), _extension(ARB,multi_bind),
_extension(ARB,query_buffer_object), _extension(ARB,query_buffer_object),
_extension(ARB,texture_mirror_clamp_to_edge), _extension(ARB,texture_mirror_clamp_to_edge),
_extension(ARB,texture_stencil8), _extension(ARB,texture_stencil8),
_extension(ARB,vertex_type_10f_11f_11f_rev)}; _extension(ARB,vertex_type_10f_11f_11f_rev)};
static const std::vector<Extension> extensions450{ constexpr Extension ExtensionList450[]{
_extension(ARB,ES3_1_compatibility), _extension(ARB,ES3_1_compatibility),
_extension(ARB,clip_control), _extension(ARB,clip_control),
_extension(ARB,conditional_render_inverted), _extension(ARB,conditional_render_inverted),
_extension(ARB,cull_distance), _extension(ARB,cull_distance),
_extension(ARB,derivative_control), _extension(ARB,derivative_control),
_extension(ARB,direct_state_access), _extension(ARB,direct_state_access),
_extension(ARB,get_texture_sub_image), _extension(ARB,get_texture_sub_image),
_extension(ARB,shader_texture_image_samples), _extension(ARB,shader_texture_image_samples),
_extension(ARB,texture_barrier), _extension(ARB,texture_barrier),
_extension(KHR,context_flush_control), _extension(KHR,context_flush_control),
_extension(KHR,robustness)}; _extension(KHR,robustness)};
static const std::vector<Extension> extensions460{ constexpr Extension ExtensionList460[]{
_extension(ARB,indirect_parameters), _extension(ARB,indirect_parameters),
_extension(ARB,shader_draw_parameters), _extension(ARB,shader_draw_parameters),
_extension(ARB,shader_group_vote), _extension(ARB,shader_group_vote),
_extension(ARB,pipeline_statistics_query), _extension(ARB,pipeline_statistics_query),
_extension(ARB,transform_feedback_overflow_query), _extension(ARB,transform_feedback_overflow_query),
_extension(ARB,shader_atomic_counter_ops), _extension(ARB,shader_atomic_counter_ops),
_extension(ARB,gl_spirv), _extension(ARB,gl_spirv),
_extension(ARB,polygon_offset_clamp), _extension(ARB,polygon_offset_clamp),
_extension(ARB,spirv_extensions), _extension(ARB,spirv_extensions),
_extension(ARB,texture_filter_anisotropic), _extension(ARB,texture_filter_anisotropic),
_extension(KHR,no_error)}; _extension(KHR,no_error)};
#elif defined(MAGNUM_TARGET_WEBGL) #elif defined(MAGNUM_TARGET_WEBGL)
static const std::vector<Extension> extensions{ constexpr Extension ExtensionList[]{
_extension(EXT,texture_filter_anisotropic), _extension(EXT,texture_filter_anisotropic),
_extension(EXT,disjoint_timer_query), _extension(EXT,disjoint_timer_query),
_extension(EXT,color_buffer_float), _extension(EXT,color_buffer_float),
_extension(OES,texture_float_linear), _extension(OES,texture_float_linear),
_extension(WEBGL,compressed_texture_s3tc)}; _extension(WEBGL,compressed_texture_s3tc)};
static const std::vector<Extension> extensionsES300{ constexpr Extension ExtensionListES300[]{
#ifdef MAGNUM_TARGET_GLES2 #ifdef MAGNUM_TARGET_GLES2
_extension(ANGLE,instanced_arrays), _extension(ANGLE,instanced_arrays),
_extension(EXT,color_buffer_half_float), _extension(EXT,color_buffer_half_float),
_extension(EXT,sRGB), _extension(EXT,sRGB),
_extension(EXT,blend_minmax), _extension(EXT,blend_minmax),
_extension(EXT,shader_texture_lod), _extension(EXT,shader_texture_lod),
#endif #endif
_extension(MAGNUM,shader_vertex_id), _extension(MAGNUM,shader_vertex_id),
#ifdef MAGNUM_TARGET_GLES2 #ifdef MAGNUM_TARGET_GLES2
_extension(OES,texture_float), _extension(OES,texture_float),
_extension(OES,texture_half_float), _extension(OES,texture_half_float),
_extension(OES,standard_derivatives), _extension(OES,standard_derivatives),
_extension(OES,vertex_array_object), _extension(OES,vertex_array_object),
_extension(OES,element_index_uint), _extension(OES,element_index_uint),
_extension(OES,texture_half_float_linear), _extension(OES,texture_half_float_linear),
_extension(OES,fbo_render_mipmap), _extension(OES,fbo_render_mipmap),
_extension(WEBGL,depth_texture), _extension(WEBGL,depth_texture),
_extension(WEBGL,color_buffer_float), _extension(WEBGL,color_buffer_float),
_extension(WEBGL,draw_buffers) _extension(WEBGL,draw_buffers)
#endif #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 constexpr Extension ExtensionListES320[]{
static const std::vector<Extension> extensions{ _extension(EXT,color_buffer_half_float),
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
_extension(ANDROID,extension_pack_es31a), _extension(EXT,color_buffer_float),
#endif _extension(EXT,copy_image),
_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<Extension> 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<Extension> 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
};
#endif #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<const Extension> Extension::extensions(Version version) {
switch(version) { switch(version) {
case Version::None: return extensions; /* GCC 4.8 needs an explicit cast */
case Version::None: return Containers::arrayView(ExtensionList);
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
case Version::GL210: return empty; case Version::GL210: return {};
case Version::GL300: return extensions300; case Version::GL300: return Containers::arrayView(ExtensionList300);
case Version::GL310: return extensions310; case Version::GL310: return Containers::arrayView(ExtensionList310);
case Version::GL320: return extensions320; case Version::GL320: return Containers::arrayView(ExtensionList320);
case Version::GL330: return extensions330; case Version::GL330: return Containers::arrayView(ExtensionList330);
case Version::GL400: return extensions400; case Version::GL400: return Containers::arrayView(ExtensionList400);
case Version::GL410: return extensions410; case Version::GL410: return Containers::arrayView(ExtensionList410);
case Version::GL420: return extensions420; case Version::GL420: return Containers::arrayView(ExtensionList420);
case Version::GL430: return extensions430; case Version::GL430: return Containers::arrayView(ExtensionList430);
case Version::GL440: return extensions440; case Version::GL440: return Containers::arrayView(ExtensionList440);
case Version::GL450: return extensions450; case Version::GL450: return Containers::arrayView(ExtensionList450);
case Version::GL460: return extensions460; case Version::GL460: return Containers::arrayView(ExtensionList460);
case Version::GLES200: case Version::GLES200:
case Version::GLES300: case Version::GLES300:
case Version::GLES310: case Version::GLES310:
case Version::GLES320: return empty; case Version::GLES320: return {};
#else #else
case Version::GLES200: return empty; case Version::GLES200: return {};
case Version::GLES300: return extensionsES300; case Version::GLES300: return Containers::arrayView(ExtensionListES300);
#ifndef MAGNUM_TARGET_WEBGL #ifndef MAGNUM_TARGET_WEBGL
case Version::GLES310: return empty; case Version::GLES310: return {};
case Version::GLES320: return extensionsES320; case Version::GLES320: return Containers::arrayView(ExtensionListES320);
#endif #endif
#endif #endif
} }

8
src/Magnum/GL/Context.h

@ -78,7 +78,7 @@ about OpenGL extensions.
class MAGNUM_GL_EXPORT Extension { class MAGNUM_GL_EXPORT Extension {
public: public:
/** @brief All extensions for given OpenGL version */ /** @brief All extensions for given OpenGL version */
static const std::vector<Extension>& extensions(Version version); static Containers::ArrayView<const Extension> extensions(Version version);
/** @brief Internal unique extension index */ /** @brief Internal unique extension index */
constexpr std::size_t index() const { return _index; } constexpr std::size_t index() const { return _index; }
@ -92,13 +92,15 @@ class MAGNUM_GL_EXPORT Extension {
/** @brief Extension string */ /** @brief Extension string */
constexpr const char* string() const { return _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: private:
std::size_t _index; std::size_t _index;
Version _requiredVersion; Version _requiredVersion;
Version _coreVersion; Version _coreVersion;
const char* _string; const char* _string;
constexpr Extension(std::size_t index, Version requiredVersion, Version coreVersion, const char* string): _index(index), _requiredVersion(requiredVersion), _coreVersion(coreVersion), _string(string) {}
}; };
/** /**

Loading…
Cancel
Save