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. 92
      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
@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:

13
src/Magnum/Audio/Context.cpp

@ -41,9 +41,10 @@
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()}
static const std::vector<Extension> extensions{
_extension(AL,EXT,FLOAT32),
_extension(AL,EXT,DOUBLE),
_extension(AL,EXT,ALAW),
@ -52,10 +53,14 @@ const std::vector<Extension>& Extension::extensions() {
_extension(ALC,EXT,ENUMERATION),
_extension(ALC,SOFTX,HRTF),
_extension(ALC,SOFT,HRTF)
};
#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) {

8
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<Extension>& extensions();
static Containers::ArrayView<const Extension> 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) {}
};
/**

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

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

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

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

92
src/Magnum/GL/Context.cpp

@ -67,12 +67,12 @@
namespace Magnum { namespace GL {
const std::vector<Extension>& Extension::extensions(Version version) {
#define _extension(vendor, extension) \
namespace {
#define _extension(vendor, extension) \
{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
static const std::vector<Extension> extensions{
#ifndef MAGNUM_TARGET_GLES
constexpr Extension ExtensionList[]{
_extension(AMD,transform_feedback3_lines_triangles),
_extension(AMD,vertex_shader_layer),
_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,blend_equation_advanced),
_extension(KHR,blend_equation_advanced_coherent)};
static const std::vector<Extension> extensions300{
constexpr Extension ExtensionList300[]{
_extension(ARB,map_buffer_range),
_extension(ARB,color_buffer_float),
_extension(ARB,half_float_pixel),
@ -121,7 +121,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(MAGNUM,shader_vertex_id),
_extension(NV,depth_buffer_float),
_extension(NV,conditional_render)};
static const std::vector<Extension> extensions310{
constexpr Extension ExtensionList310[]{
_extension(ARB,texture_rectangle),
_extension(ARB,draw_instanced),
_extension(ARB,texture_buffer_object),
@ -129,7 +129,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(ARB,copy_buffer),
_extension(EXT,texture_snorm),
_extension(NV,primitive_restart)};
static const std::vector<Extension> extensions320{
constexpr Extension ExtensionList320[]{
_extension(ARB,geometry_shader4),
_extension(ARB,depth_clamp),
_extension(ARB,draw_elements_base_vertex),
@ -139,7 +139,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(ARB,sync),
_extension(ARB,texture_multisample),
_extension(ARB,vertex_array_bgra)};
static const std::vector<Extension> extensions330{
constexpr Extension ExtensionList330[]{
_extension(ARB,instanced_arrays),
_extension(ARB,blend_func_extended),
_extension(ARB,explicit_attrib_location),
@ -150,7 +150,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(ARB,texture_swizzle),
_extension(ARB,timer_query),
_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,sample_shading),
_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,transform_feedback2),
_extension(ARB,transform_feedback3)};
static const std::vector<Extension> extensions410{
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)};
static const std::vector<Extension> extensions420{
constexpr Extension ExtensionList420[]{
_extension(ARB,texture_compression_bptc),
_extension(ARB,base_instance),
_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 */
_extension(ARB,shading_language_packing),
_extension(ARB,texture_storage)};
static const std::vector<Extension> extensions430{
constexpr Extension ExtensionList430[]{
_extension(ARB,arrays_of_arrays),
_extension(ARB,ES3_compatibility),
_extension(ARB,clear_buffer_object),
@ -208,7 +208,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(ARB,texture_view),
_extension(ARB,vertex_attrib_binding),
_extension(KHR,debug)};
static const std::vector<Extension> extensions440{
constexpr Extension ExtensionList440[]{
_extension(ARB,buffer_storage),
_extension(ARB,clear_texture),
_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_stencil8),
_extension(ARB,vertex_type_10f_11f_11f_rev)};
static const std::vector<Extension> extensions450{
constexpr Extension ExtensionList450[]{
_extension(ARB,ES3_1_compatibility),
_extension(ARB,clip_control),
_extension(ARB,conditional_render_inverted),
@ -229,7 +229,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(ARB,texture_barrier),
_extension(KHR,context_flush_control),
_extension(KHR,robustness)};
static const std::vector<Extension> extensions460{
constexpr Extension ExtensionList460[]{
_extension(ARB,indirect_parameters),
_extension(ARB,shader_draw_parameters),
_extension(ARB,shader_group_vote),
@ -241,14 +241,14 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(ARB,spirv_extensions),
_extension(ARB,texture_filter_anisotropic),
_extension(KHR,no_error)};
#elif defined(MAGNUM_TARGET_WEBGL)
static const std::vector<Extension> extensions{
#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)};
static const std::vector<Extension> extensionsES300{
constexpr Extension ExtensionListES300[]{
#ifdef MAGNUM_TARGET_GLES2
_extension(ANGLE,instanced_arrays),
_extension(EXT,color_buffer_half_float),
@ -269,9 +269,9 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(WEBGL,color_buffer_float),
_extension(WEBGL,draw_buffers)
#endif
};
#else
static const std::vector<Extension> extensions{
};
#else
constexpr Extension ExtensionList[]{
#ifndef MAGNUM_TARGET_GLES2
_extension(ANDROID,extension_pack_es31a),
#endif
@ -314,7 +314,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(OES,stencil1),
_extension(OES,stencil4),
_extension(OES,texture_float_linear)};
static const std::vector<Extension> extensionsES300{
constexpr Extension ExtensionListES300[]{
#ifdef MAGNUM_TARGET_GLES2
_extension(ANGLE,framebuffer_blit),
_extension(ANGLE,framebuffer_multisample),
@ -368,7 +368,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(OES,surfaceless_context)
#endif
};
static const std::vector<Extension> extensionsES320{
constexpr Extension ExtensionListES320[]{
_extension(EXT,color_buffer_half_float),
#ifndef MAGNUM_TARGET_GLES2
_extension(EXT,color_buffer_float),
@ -403,34 +403,38 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(OES,texture_storage_multisample_2d_array)
#endif
};
#endif
#undef _extension
#endif
#undef _extension
}
Containers::ArrayView<const Extension> 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
}

8
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<Extension>& extensions(Version version);
static Containers::ArrayView<const Extension> 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) {}
};
/**

Loading…
Cancel
Save