diff --git a/src/Magnum/GL/Context.cpp b/src/Magnum/GL/Context.cpp index 4c825c516..7a438e941 100644 --- a/src/Magnum/GL/Context.cpp +++ b/src/Magnum/GL/Context.cpp @@ -72,455 +72,464 @@ using namespace Containers::Literals; to be sorted alphabetically. */ 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,sample_positions), - _extension(AMD,shader_explicit_vertex_parameter), - _extension(AMD,shader_trinary_minmax), - _extension(AMD,transform_feedback3_lines_triangles), - _extension(AMD,vertex_shader_layer), - _extension(ARB,ES3_2_compatibility), - _extension(ARB,bindless_texture), - _extension(ARB,compute_variable_group_size), - _extension(ARB,robustness), - _extension(ARB,robustness_application_isolation), - _extension(ARB,robustness_isolation), - _extension(ARB,robustness_share_group_isolation), - _extension(ARB,sample_locations), - _extension(ARB,seamless_cubemap_per_texture), - _extension(ARB,sparse_buffer), - _extension(ARB,sparse_texture), - _extension(ATI,texture_mirror_once), - _extension(EXT,debug_label), - _extension(EXT,debug_marker), - _extension(EXT,shader_integer_mix), - _extension(EXT,texture_compression_dxt1), - _extension(EXT,texture_compression_s3tc), - _extension(EXT,texture_filter_anisotropic), - _extension(EXT,texture_mirror_clamp), - _extension(EXT,texture_sRGB_R8), - _extension(EXT,texture_sRGB_decode), - _extension(GREMEDY,string_marker), - _extension(KHR,blend_equation_advanced), - _extension(KHR,blend_equation_advanced_coherent), - _extension(KHR,texture_compression_astc_hdr), - _extension(KHR,texture_compression_astc_ldr), - _extension(KHR,texture_compression_astc_sliced_3d), - _extension(NV,fragment_shader_barycentric), - _extension(NV,sample_locations), - _extension(OVR,multiview), - _extension(OVR,multiview2)}; + Extensions::AMD::sample_positions{}, + Extensions::AMD::shader_explicit_vertex_parameter{}, + Extensions::AMD::shader_trinary_minmax{}, + Extensions::AMD::transform_feedback3_lines_triangles{}, + Extensions::AMD::vertex_shader_layer{}, + Extensions::ARB::ES3_2_compatibility{}, + Extensions::ARB::bindless_texture{}, + Extensions::ARB::compute_variable_group_size{}, + Extensions::ARB::robustness{}, + Extensions::ARB::robustness_application_isolation{}, + Extensions::ARB::robustness_isolation{}, + Extensions::ARB::robustness_share_group_isolation{}, + Extensions::ARB::sample_locations{}, + Extensions::ARB::seamless_cubemap_per_texture{}, + Extensions::ARB::sparse_buffer{}, + Extensions::ARB::sparse_texture{}, + Extensions::ATI::texture_mirror_once{}, + Extensions::EXT::debug_label{}, + Extensions::EXT::debug_marker{}, + Extensions::EXT::shader_integer_mix{}, + Extensions::EXT::texture_compression_dxt1{}, + Extensions::EXT::texture_compression_s3tc{}, + Extensions::EXT::texture_filter_anisotropic{}, + Extensions::EXT::texture_mirror_clamp{}, + Extensions::EXT::texture_sRGB_R8{}, + Extensions::EXT::texture_sRGB_decode{}, + Extensions::GREMEDY::string_marker{}, + Extensions::KHR::blend_equation_advanced{}, + Extensions::KHR::blend_equation_advanced_coherent{}, + Extensions::KHR::texture_compression_astc_hdr{}, + Extensions::KHR::texture_compression_astc_ldr{}, + Extensions::KHR::texture_compression_astc_sliced_3d{}, + Extensions::NV::fragment_shader_barycentric{}, + Extensions::NV::sample_locations{}, + Extensions::OVR::multiview{}, + Extensions::OVR::multiview2{} +}; constexpr Extension ExtensionList300[]{ - _extension(ARB,color_buffer_float), - _extension(ARB,depth_buffer_float), - _extension(ARB,framebuffer_object), - _extension(ARB,framebuffer_sRGB), - _extension(ARB,half_float_pixel), - _extension(ARB,half_float_vertex), - _extension(ARB,map_buffer_range), - _extension(ARB,texture_float), - _extension(ARB,texture_rg), - _extension(ARB,vertex_array_object), - _extension(EXT,draw_buffers2), - _extension(EXT,gpu_shader4), - _extension(EXT,packed_float), - _extension(EXT,texture_array), - _extension(EXT,texture_compression_rgtc), - _extension(EXT,texture_integer), - _extension(EXT,texture_shared_exponent), - _extension(EXT,transform_feedback), - _extension(MAGNUM,shader_vertex_id), - _extension(NV,conditional_render), - _extension(NV,depth_buffer_float)}; + Extensions::ARB::color_buffer_float{}, + Extensions::ARB::depth_buffer_float{}, + Extensions::ARB::framebuffer_object{}, + Extensions::ARB::framebuffer_sRGB{}, + Extensions::ARB::half_float_pixel{}, + Extensions::ARB::half_float_vertex{}, + Extensions::ARB::map_buffer_range{}, + Extensions::ARB::texture_float{}, + Extensions::ARB::texture_rg{}, + Extensions::ARB::vertex_array_object{}, + Extensions::EXT::draw_buffers2{}, + Extensions::EXT::gpu_shader4{}, + Extensions::EXT::packed_float{}, + Extensions::EXT::texture_array{}, + Extensions::EXT::texture_compression_rgtc{}, + Extensions::EXT::texture_integer{}, + Extensions::EXT::texture_shared_exponent{}, + Extensions::EXT::transform_feedback{}, + Extensions::MAGNUM::shader_vertex_id{}, + Extensions::NV::conditional_render{}, + Extensions::NV::depth_buffer_float{} +}; constexpr Extension ExtensionList310[]{ - _extension(ARB,copy_buffer), - _extension(ARB,draw_instanced), - _extension(ARB,texture_buffer_object), - _extension(ARB,texture_rectangle), - _extension(ARB,uniform_buffer_object), - _extension(EXT,texture_snorm), - _extension(NV,primitive_restart)}; + Extensions::ARB::copy_buffer{}, + Extensions::ARB::draw_instanced{}, + Extensions::ARB::texture_buffer_object{}, + Extensions::ARB::texture_rectangle{}, + Extensions::ARB::uniform_buffer_object{}, + Extensions::EXT::texture_snorm{}, + Extensions::NV::primitive_restart{} +}; constexpr Extension ExtensionList320[]{ - _extension(ARB,depth_clamp), - _extension(ARB,draw_elements_base_vertex), - _extension(ARB,fragment_coord_conventions), - _extension(ARB,geometry_shader4), - _extension(ARB,provoking_vertex), - _extension(ARB,seamless_cube_map), - _extension(ARB,sync), - _extension(ARB,texture_multisample), - _extension(ARB,vertex_array_bgra)}; + Extensions::ARB::depth_clamp{}, + Extensions::ARB::draw_elements_base_vertex{}, + Extensions::ARB::fragment_coord_conventions{}, + Extensions::ARB::geometry_shader4{}, + Extensions::ARB::provoking_vertex{}, + Extensions::ARB::seamless_cube_map{}, + Extensions::ARB::sync{}, + Extensions::ARB::texture_multisample{}, + Extensions::ARB::vertex_array_bgra{} +}; constexpr Extension ExtensionList330[]{ - _extension(ARB,blend_func_extended), - _extension(ARB,explicit_attrib_location), - _extension(ARB,instanced_arrays), - _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)}; + Extensions::ARB::blend_func_extended{}, + Extensions::ARB::explicit_attrib_location{}, + Extensions::ARB::instanced_arrays{}, + Extensions::ARB::occlusion_query2{}, + Extensions::ARB::sampler_objects{}, + Extensions::ARB::shader_bit_encoding{}, + Extensions::ARB::texture_rgb10_a2ui{}, + Extensions::ARB::texture_swizzle{}, + Extensions::ARB::timer_query{}, + Extensions::ARB::vertex_type_2_10_10_10_rev{} +}; constexpr Extension ExtensionList400[]{ - _extension(ARB,draw_buffers_blend), - _extension(ARB,draw_indirect), - _extension(ARB,gpu_shader5), - _extension(ARB,gpu_shader_fp64), - _extension(ARB,sample_shading), - _extension(ARB,shader_subroutine), - _extension(ARB,tessellation_shader), - _extension(ARB,texture_buffer_object_rgb32), - _extension(ARB,texture_cube_map_array), - _extension(ARB,texture_gather), - _extension(ARB,texture_query_lod), - _extension(ARB,transform_feedback2), - _extension(ARB,transform_feedback3)}; + Extensions::ARB::draw_buffers_blend{}, + Extensions::ARB::draw_indirect{}, + Extensions::ARB::gpu_shader5{}, + Extensions::ARB::gpu_shader_fp64{}, + Extensions::ARB::sample_shading{}, + Extensions::ARB::shader_subroutine{}, + Extensions::ARB::tessellation_shader{}, + Extensions::ARB::texture_buffer_object_rgb32{}, + Extensions::ARB::texture_cube_map_array{}, + Extensions::ARB::texture_gather{}, + Extensions::ARB::texture_query_lod{}, + Extensions::ARB::transform_feedback2{}, + Extensions::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)}; + Extensions::ARB::ES2_compatibility{}, + Extensions::ARB::get_program_binary{}, + Extensions::ARB::separate_shader_objects{}, + Extensions::ARB::shader_precision{}, + Extensions::ARB::vertex_attrib_64bit{}, + Extensions::ARB::viewport_array{} +}; constexpr Extension ExtensionList420[]{ - _extension(ARB,base_instance), - _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), - _extension(ARB,shading_language_420pack), + Extensions::ARB::base_instance{}, + Extensions::ARB::compressed_texture_pixel_storage{}, + Extensions::ARB::conservative_depth{}, + Extensions::ARB::internalformat_query{}, + Extensions::ARB::map_buffer_alignment{}, + Extensions::ARB::shader_atomic_counters{}, + Extensions::ARB::shader_image_load_store{}, + Extensions::ARB::shading_language_420pack{}, /* Mentioned in GLSL 4.20 specs as newly added */ - _extension(ARB,shading_language_packing), - _extension(ARB,texture_compression_bptc), - _extension(ARB,texture_storage), - _extension(ARB,transform_feedback_instanced)}; + Extensions::ARB::shading_language_packing{}, + Extensions::ARB::texture_compression_bptc{}, + Extensions::ARB::texture_storage{}, + Extensions::ARB::transform_feedback_instanced{} +}; constexpr Extension ExtensionList430[]{ - _extension(ARB,ES3_compatibility), - _extension(ARB,arrays_of_arrays), - _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)}; + Extensions::ARB::ES3_compatibility{}, + Extensions::ARB::arrays_of_arrays{}, + Extensions::ARB::clear_buffer_object{}, + Extensions::ARB::compute_shader{}, + Extensions::ARB::copy_image{}, + Extensions::ARB::explicit_uniform_location{}, + Extensions::ARB::fragment_layer_viewport{}, + Extensions::ARB::framebuffer_no_attachments{}, + Extensions::ARB::internalformat_query2{}, + Extensions::ARB::invalidate_subdata{}, + Extensions::ARB::multi_draw_indirect{}, + Extensions::ARB::program_interface_query{}, + Extensions::ARB::robust_buffer_access_behavior{}, + Extensions::ARB::shader_image_size{}, + Extensions::ARB::shader_storage_buffer_object{}, + Extensions::ARB::stencil_texturing{}, + Extensions::ARB::texture_buffer_range{}, + Extensions::ARB::texture_query_levels{}, + Extensions::ARB::texture_storage_multisample{}, + Extensions::ARB::texture_view{}, + Extensions::ARB::vertex_attrib_binding{}, + Extensions::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)}; + Extensions::ARB::buffer_storage{}, + Extensions::ARB::clear_texture{}, + Extensions::ARB::enhanced_layouts{}, + Extensions::ARB::multi_bind{}, + Extensions::ARB::query_buffer_object{}, + Extensions::ARB::texture_mirror_clamp_to_edge{}, + Extensions::ARB::texture_stencil8{}, + Extensions::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)}; + Extensions::ARB::ES3_1_compatibility{}, + Extensions::ARB::clip_control{}, + Extensions::ARB::conditional_render_inverted{}, + Extensions::ARB::cull_distance{}, + Extensions::ARB::derivative_control{}, + Extensions::ARB::direct_state_access{}, + Extensions::ARB::get_texture_sub_image{}, + Extensions::ARB::shader_texture_image_samples{}, + Extensions::ARB::texture_barrier{}, + Extensions::KHR::context_flush_control{}, + Extensions::KHR::robustness{} +}; constexpr Extension ExtensionList460[]{ - _extension(ARB,gl_spirv), - _extension(ARB,indirect_parameters), - _extension(ARB,pipeline_statistics_query), - _extension(ARB,polygon_offset_clamp), - _extension(ARB,shader_atomic_counter_ops), - _extension(ARB,shader_draw_parameters), - _extension(ARB,shader_group_vote), - _extension(ARB,spirv_extensions), - _extension(ARB,texture_filter_anisotropic), - _extension(ARB,transform_feedback_overflow_query), - _extension(KHR,no_error)}; + Extensions::ARB::gl_spirv{}, + Extensions::ARB::indirect_parameters{}, + Extensions::ARB::pipeline_statistics_query{}, + Extensions::ARB::polygon_offset_clamp{}, + Extensions::ARB::shader_atomic_counter_ops{}, + Extensions::ARB::shader_draw_parameters{}, + Extensions::ARB::shader_group_vote{}, + Extensions::ARB::spirv_extensions{}, + Extensions::ARB::texture_filter_anisotropic{}, + Extensions::ARB::transform_feedback_overflow_query{}, + Extensions::KHR::no_error{} +}; #elif defined(MAGNUM_TARGET_WEBGL) constexpr Extension ExtensionList[]{ #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,clip_cull_distance), + Extensions::EXT::clip_cull_distance{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,color_buffer_float), + Extensions::EXT::color_buffer_float{}, #endif #ifdef MAGNUM_TARGET_GLES2 - _extension(EXT,disjoint_timer_query), + Extensions::EXT::disjoint_timer_query{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,disjoint_timer_query_webgl2), + Extensions::EXT::disjoint_timer_query_webgl2{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,draw_buffers_indexed), + Extensions::EXT::draw_buffers_indexed{}, #endif - _extension(EXT,float_blend), - _extension(EXT,texture_compression_bptc), - _extension(EXT,texture_compression_rgtc), - _extension(EXT,texture_filter_anisotropic), - _extension(EXT,texture_norm16), - _extension(OES,texture_float_linear), + Extensions::EXT::float_blend{}, + Extensions::EXT::texture_compression_bptc{}, + Extensions::EXT::texture_compression_rgtc{}, + Extensions::EXT::texture_filter_anisotropic{}, + Extensions::EXT::texture_norm16{}, + Extensions::OES::texture_float_linear{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(OVR,multiview2), + Extensions::OVR::multiview2{}, #endif - _extension(WEBGL,blend_equation_advanced_coherent), - _extension(WEBGL,compressed_texture_astc), - _extension(WEBGL,compressed_texture_pvrtc), - _extension(WEBGL,compressed_texture_s3tc), - _extension(WEBGL,compressed_texture_s3tc_srgb), - _extension(WEBGL,debug_renderer_info), - _extension(WEBGL,debug_shaders), + Extensions::WEBGL::blend_equation_advanced_coherent{}, + Extensions::WEBGL::compressed_texture_astc{}, + Extensions::WEBGL::compressed_texture_pvrtc{}, + Extensions::WEBGL::compressed_texture_s3tc{}, + Extensions::WEBGL::compressed_texture_s3tc_srgb{}, + Extensions::WEBGL::debug_renderer_info{}, + Extensions::WEBGL::debug_shaders{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(WEBGL,draw_instanced_base_vertex_base_instance), + Extensions::WEBGL::draw_instanced_base_vertex_base_instance{}, #endif - _extension(WEBGL,lose_context), - _extension(WEBGL,multi_draw), + Extensions::WEBGL::lose_context{}, + Extensions::WEBGL::multi_draw{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(WEBGL,multi_draw_instanced_base_vertex_base_instance) + Extensions::WEBGL::multi_draw_instanced_base_vertex_base_instance{}, #endif }; constexpr Extension ExtensionListES300[]{ #ifdef MAGNUM_TARGET_GLES2 - _extension(ANGLE,instanced_arrays), - _extension(EXT,blend_minmax), - _extension(EXT,color_buffer_half_float), - _extension(EXT,frag_depth), - _extension(EXT,sRGB), - _extension(EXT,shader_texture_lod), + Extensions::ANGLE::instanced_arrays{}, + Extensions::EXT::blend_minmax{}, + Extensions::EXT::color_buffer_half_float{}, + Extensions::EXT::frag_depth{}, + Extensions::EXT::sRGB{}, + Extensions::EXT::shader_texture_lod{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(MAGNUM,shader_vertex_id), + Extensions::MAGNUM::shader_vertex_id{}, #endif #ifdef MAGNUM_TARGET_GLES2 - _extension(OES,element_index_uint), - _extension(OES,fbo_render_mipmap), - _extension(OES,standard_derivatives), - _extension(OES,texture_float), - _extension(OES,texture_half_float), - _extension(OES,texture_half_float_linear), - _extension(OES,vertex_array_object), - _extension(WEBGL,color_buffer_float), - _extension(WEBGL,depth_texture), - _extension(WEBGL,draw_buffers) + Extensions::OES::element_index_uint{}, + Extensions::OES::fbo_render_mipmap{}, + Extensions::OES::standard_derivatives{}, + Extensions::OES::texture_float{}, + Extensions::OES::texture_half_float{}, + Extensions::OES::texture_half_float_linear{}, + Extensions::OES::vertex_array_object{}, + Extensions::WEBGL::color_buffer_float{}, + Extensions::WEBGL::depth_texture{}, + Extensions::WEBGL::draw_buffers{}, #endif }; #else constexpr Extension ExtensionList[]{ #ifndef MAGNUM_TARGET_GLES2 - _extension(ANDROID,extension_pack_es31a), + Extensions::ANDROID::extension_pack_es31a{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(ANGLE,base_vertex_base_instance), + Extensions::ANGLE::base_vertex_base_instance{}, #endif - _extension(ANGLE,multi_draw), - _extension(ANGLE,texture_compression_dxt1), - _extension(ANGLE,texture_compression_dxt3), - _extension(ANGLE,texture_compression_dxt5), - _extension(APPLE,clip_distance), - _extension(APPLE,texture_format_BGRA8888), - _extension(ARM,shader_framebuffer_fetch), - _extension(ARM,shader_framebuffer_fetch_depth_stencil), + Extensions::ANGLE::multi_draw{}, + Extensions::ANGLE::texture_compression_dxt1{}, + Extensions::ANGLE::texture_compression_dxt3{}, + Extensions::ANGLE::texture_compression_dxt5{}, + Extensions::APPLE::clip_distance{}, + Extensions::APPLE::texture_format_BGRA8888{}, + Extensions::ARM::shader_framebuffer_fetch{}, + Extensions::ARM::shader_framebuffer_fetch_depth_stencil{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,clip_cull_distance), + Extensions::EXT::clip_cull_distance{}, #endif - _extension(EXT,debug_label), - _extension(EXT,debug_marker), - _extension(EXT,disjoint_timer_query), - _extension(EXT,draw_elements_base_vertex), - _extension(EXT,multi_draw_arrays), - _extension(EXT,multisampled_render_to_texture), - _extension(EXT,polygon_offset_clamp), - _extension(EXT,pvrtc_sRGB), - _extension(EXT,read_format_bgra), - _extension(EXT,robustness), - _extension(EXT,sRGB_write_control), - _extension(EXT,separate_shader_objects), - _extension(EXT,shader_framebuffer_fetch), + Extensions::EXT::debug_label{}, + Extensions::EXT::debug_marker{}, + Extensions::EXT::disjoint_timer_query{}, + Extensions::EXT::draw_elements_base_vertex{}, + Extensions::EXT::multi_draw_arrays{}, + Extensions::EXT::multisampled_render_to_texture{}, + Extensions::EXT::polygon_offset_clamp{}, + Extensions::EXT::pvrtc_sRGB{}, + Extensions::EXT::read_format_bgra{}, + Extensions::EXT::robustness{}, + Extensions::EXT::sRGB_write_control{}, + Extensions::EXT::separate_shader_objects{}, + Extensions::EXT::shader_framebuffer_fetch{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,shader_integer_mix), + Extensions::EXT::shader_integer_mix{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,texture_compression_bptc), + Extensions::EXT::texture_compression_bptc{}, #endif - _extension(EXT,texture_compression_dxt1), + Extensions::EXT::texture_compression_dxt1{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,texture_compression_rgtc), + Extensions::EXT::texture_compression_rgtc{}, #endif - _extension(EXT,texture_compression_s3tc), - _extension(EXT,texture_compression_s3tc_srgb), - _extension(EXT,texture_filter_anisotropic), - _extension(EXT,texture_format_BGRA8888), + Extensions::EXT::texture_compression_s3tc{}, + Extensions::EXT::texture_compression_s3tc_srgb{}, + Extensions::EXT::texture_filter_anisotropic{}, + Extensions::EXT::texture_format_BGRA8888{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,texture_norm16), - _extension(EXT,texture_sRGB_R8), + Extensions::EXT::texture_norm16{}, + Extensions::EXT::texture_sRGB_R8{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,texture_sRGB_RG8), + Extensions::EXT::texture_sRGB_RG8{}, #endif - _extension(EXT,texture_sRGB_decode), - _extension(IMG,texture_compression_pvrtc), - _extension(KHR,blend_equation_advanced_coherent), - _extension(KHR,context_flush_control), - _extension(KHR,no_error), - _extension(KHR,texture_compression_astc_hdr), - _extension(KHR,texture_compression_astc_sliced_3d), + Extensions::EXT::texture_sRGB_decode{}, + Extensions::IMG::texture_compression_pvrtc{}, + Extensions::KHR::blend_equation_advanced_coherent{}, + Extensions::KHR::context_flush_control{}, + Extensions::KHR::no_error{}, + Extensions::KHR::texture_compression_astc_hdr{}, + Extensions::KHR::texture_compression_astc_sliced_3d{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(NV,fragment_shader_barycentric), + Extensions::NV::fragment_shader_barycentric{}, #endif - _extension(NV,polygon_mode), - _extension(NV,read_buffer_front), - _extension(NV,read_depth), - _extension(NV,read_depth_stencil), - _extension(NV,read_stencil), - _extension(NV,sample_locations), + Extensions::NV::polygon_mode{}, + Extensions::NV::read_buffer_front{}, + Extensions::NV::read_depth{}, + Extensions::NV::read_depth_stencil{}, + Extensions::NV::read_stencil{}, + Extensions::NV::sample_locations{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(NV,shader_noperspective_interpolation), + Extensions::NV::shader_noperspective_interpolation{}, #endif - _extension(NV,texture_border_clamp), - _extension(OES,depth32), - _extension(OES,draw_elements_base_vertex), - _extension(OES,mapbuffer), - _extension(OES,stencil1), - _extension(OES,stencil4), + Extensions::NV::texture_border_clamp{}, + Extensions::OES::depth32{}, + Extensions::OES::draw_elements_base_vertex{}, + Extensions::OES::mapbuffer{}, + Extensions::OES::stencil1{}, + Extensions::OES::stencil4{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,texture_compression_astc), + Extensions::OES::texture_compression_astc{}, #endif - _extension(OES,texture_float_linear), + Extensions::OES::texture_float_linear{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(OVR,multiview), + Extensions::OVR::multiview{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(OVR,multiview2), + Extensions::OVR::multiview2{}, #endif }; constexpr Extension ExtensionListES300[]{ #ifdef MAGNUM_TARGET_GLES2 - _extension(ANGLE,depth_texture), - _extension(ANGLE,framebuffer_blit), - _extension(ANGLE,framebuffer_multisample), - _extension(ANGLE,instanced_arrays), - _extension(APPLE,framebuffer_multisample), - _extension(APPLE,texture_max_level), - _extension(ARM,rgba8), - _extension(EXT,blend_minmax), - _extension(EXT,discard_framebuffer), - _extension(EXT,draw_buffers), - _extension(EXT,draw_instanced), - _extension(EXT,instanced_arrays), - _extension(EXT,map_buffer_range), - _extension(EXT,occlusion_query_boolean), - _extension(EXT,sRGB), - _extension(EXT,shader_texture_lod), - _extension(EXT,shadow_samplers), - _extension(EXT,texture_rg), - _extension(EXT,texture_storage), - _extension(EXT,texture_type_2_10_10_10_REV), - _extension(EXT,unpack_subimage), + Extensions::ANGLE::depth_texture{}, + Extensions::ANGLE::framebuffer_blit{}, + Extensions::ANGLE::framebuffer_multisample{}, + Extensions::ANGLE::instanced_arrays{}, + Extensions::APPLE::framebuffer_multisample{}, + Extensions::APPLE::texture_max_level{}, + Extensions::ARM::rgba8{}, + Extensions::EXT::blend_minmax{}, + Extensions::EXT::discard_framebuffer{}, + Extensions::EXT::draw_buffers{}, + Extensions::EXT::draw_instanced{}, + Extensions::EXT::instanced_arrays{}, + Extensions::EXT::map_buffer_range{}, + Extensions::EXT::occlusion_query_boolean{}, + Extensions::EXT::sRGB{}, + Extensions::EXT::shader_texture_lod{}, + Extensions::EXT::shadow_samplers{}, + Extensions::EXT::texture_rg{}, + Extensions::EXT::texture_storage{}, + Extensions::EXT::texture_type_2_10_10_10_REV{}, + Extensions::EXT::unpack_subimage{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(MAGNUM,shader_vertex_id), + Extensions::MAGNUM::shader_vertex_id{}, #endif #ifdef MAGNUM_TARGET_GLES2 - _extension(NV,draw_buffers), - _extension(NV,draw_instanced), - _extension(NV,fbo_color_attachments), - _extension(NV,framebuffer_blit), - _extension(NV,framebuffer_multisample), - _extension(NV,instanced_arrays), - _extension(NV,pack_subimage), - _extension(NV,read_buffer), - _extension(NV,shadow_samplers_array), - _extension(NV,shadow_samplers_cube), - _extension(OES,depth24), - _extension(OES,depth_texture), - _extension(OES,element_index_uint), - _extension(OES,fbo_render_mipmap), - _extension(OES,packed_depth_stencil), - _extension(OES,required_internalformat), - _extension(OES,rgb8_rgba8), - _extension(OES,standard_derivatives), - _extension(OES,surfaceless_context), - _extension(OES,texture_3D), - _extension(OES,texture_float), - _extension(OES,texture_half_float), - _extension(OES,texture_half_float_linear), - _extension(OES,texture_npot), - _extension(OES,vertex_array_object), - _extension(OES,vertex_half_float), + Extensions::NV::draw_buffers{}, + Extensions::NV::draw_instanced{}, + Extensions::NV::fbo_color_attachments{}, + Extensions::NV::framebuffer_blit{}, + Extensions::NV::framebuffer_multisample{}, + Extensions::NV::instanced_arrays{}, + Extensions::NV::pack_subimage{}, + Extensions::NV::read_buffer{}, + Extensions::NV::shadow_samplers_array{}, + Extensions::NV::shadow_samplers_cube{}, + Extensions::OES::depth24{}, + Extensions::OES::depth_texture{}, + Extensions::OES::element_index_uint{}, + Extensions::OES::fbo_render_mipmap{}, + Extensions::OES::packed_depth_stencil{}, + Extensions::OES::required_internalformat{}, + Extensions::OES::rgb8_rgba8{}, + Extensions::OES::standard_derivatives{}, + Extensions::OES::surfaceless_context{}, + Extensions::OES::texture_3D{}, + Extensions::OES::texture_float{}, + Extensions::OES::texture_half_float{}, + Extensions::OES::texture_half_float_linear{}, + Extensions::OES::texture_npot{}, + Extensions::OES::vertex_array_object{}, + Extensions::OES::vertex_half_float{}, #endif }; constexpr Extension ExtensionListES320[]{ #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,color_buffer_float), + Extensions::EXT::color_buffer_float{}, #endif - _extension(EXT,color_buffer_half_float), + Extensions::EXT::color_buffer_half_float{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,copy_image), + Extensions::EXT::copy_image{}, #endif - _extension(EXT,draw_buffers_indexed), + Extensions::EXT::draw_buffers_indexed{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,geometry_shader), + Extensions::EXT::geometry_shader{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,gpu_shader5), + Extensions::EXT::gpu_shader5{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,primitive_bounding_box), + Extensions::EXT::primitive_bounding_box{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,shader_io_blocks), + Extensions::EXT::shader_io_blocks{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,tessellation_shader), + Extensions::EXT::tessellation_shader{}, #endif - _extension(EXT,texture_border_clamp), + Extensions::EXT::texture_border_clamp{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,texture_buffer), + Extensions::EXT::texture_buffer{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(EXT,texture_cube_map_array), + Extensions::EXT::texture_cube_map_array{}, #endif - _extension(KHR,blend_equation_advanced), - _extension(KHR,debug), - _extension(KHR,robust_buffer_access_behavior), - _extension(KHR,robustness), - _extension(KHR,texture_compression_astc_ldr), + Extensions::KHR::blend_equation_advanced{}, + Extensions::KHR::debug{}, + Extensions::KHR::robust_buffer_access_behavior{}, + Extensions::KHR::robustness{}, + Extensions::KHR::texture_compression_astc_ldr{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,sample_shading), + Extensions::OES::sample_shading{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,sample_variables), + Extensions::OES::sample_variables{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,shader_image_atomic), + Extensions::OES::shader_image_atomic{}, #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,shader_multisample_interpolation), + Extensions::OES::shader_multisample_interpolation{}, #endif - _extension(OES,texture_stencil8), + Extensions::OES::texture_stencil8{}, #ifndef MAGNUM_TARGET_GLES2 - _extension(OES,texture_storage_multisample_2d_array) + Extensions::OES::texture_storage_multisample_2d_array{} #endif }; #endif -#undef _extension constexpr struct { Version version; diff --git a/src/Magnum/GL/Context.h b/src/Magnum/GL/Context.h index 45bb43794..c776bee92 100644 --- a/src/Magnum/GL/Context.h +++ b/src/Magnum/GL/Context.h @@ -94,9 +94,8 @@ 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 + /** @brief Construct from a compile-time extension */ + template::value>::type> constexpr /*implicit*/ Extension(const E&): _index{E::Index}, _requiredVersion{E::requiredVersion()}, _coreVersion{E::coreVersion()}, _string{E::string()} {} private: std::size_t _index;