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

29
src/Magnum/Audio/Context.cpp

@ -41,21 +41,26 @@
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),
_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<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>

712
src/Magnum/GL/Context.cpp

@ -67,370 +67,374 @@
namespace Magnum { namespace GL {
const std::vector<Extension>& 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<Extension> empty;
#ifndef MAGNUM_TARGET_GLES
static const std::vector<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<Extension> 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<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
};
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<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