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. 13
      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. 78
      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:

13
src/Magnum/Audio/Context.cpp

@ -41,9 +41,10 @@
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),
@ -52,10 +53,14 @@ const std::vector<Extension>& Extension::extensions() {
_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>

78
src/Magnum/GL/Context.cpp

@ -67,12 +67,12 @@
namespace Magnum { namespace GL { namespace Magnum { namespace GL {
const std::vector<Extension>& Extension::extensions(Version version) { namespace {
#define _extension(vendor, extension) \ #define _extension(vendor, extension) \
{Extensions::vendor::extension::Index, Extensions::vendor::extension::requiredVersion(), Extensions::vendor::extension::coreVersion(), Extensions::vendor::extension::string()} {Extensions::vendor::extension::Index, Extensions::vendor::extension::requiredVersion(), Extensions::vendor::extension::coreVersion(), Extensions::vendor::extension::string()}
static const std::vector<Extension> empty;
#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),
@ -99,7 +99,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -121,7 +121,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -129,7 +129,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -139,7 +139,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -150,7 +150,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -164,14 +164,14 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -185,7 +185,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
/* 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),
@ -208,7 +208,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -217,7 +217,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -229,7 +229,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -242,13 +242,13 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_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),
@ -271,7 +271,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
#endif #endif
}; };
#else #else
static const std::vector<Extension> extensions{ constexpr Extension ExtensionList[]{
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
_extension(ANDROID,extension_pack_es31a), _extension(ANDROID,extension_pack_es31a),
#endif #endif
@ -314,7 +314,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(OES,stencil1), _extension(OES,stencil1),
_extension(OES,stencil4), _extension(OES,stencil4),
_extension(OES,texture_float_linear)}; _extension(OES,texture_float_linear)};
static const std::vector<Extension> extensionsES300{ constexpr Extension ExtensionListES300[]{
#ifdef MAGNUM_TARGET_GLES2 #ifdef MAGNUM_TARGET_GLES2
_extension(ANGLE,framebuffer_blit), _extension(ANGLE,framebuffer_blit),
_extension(ANGLE,framebuffer_multisample), _extension(ANGLE,framebuffer_multisample),
@ -368,7 +368,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(OES,surfaceless_context) _extension(OES,surfaceless_context)
#endif #endif
}; };
static const std::vector<Extension> extensionsES320{ constexpr Extension ExtensionListES320[]{
_extension(EXT,color_buffer_half_float), _extension(EXT,color_buffer_half_float),
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
_extension(EXT,color_buffer_float), _extension(EXT,color_buffer_float),
@ -406,31 +406,35 @@ const std::vector<Extension>& Extension::extensions(Version version) {
#endif #endif
#undef _extension #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