#ifndef Magnum_Extensions_h #define Magnum_Extensions_h /* This file is part of Magnum. Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** @file * @brief Namespace Magnum::Extensions */ #include "Context.h" namespace Magnum { /** @brief Compile-time information about OpenGL extensions Each extension is `struct` named hierarchically by prefix, vendor and extension name, for example `GL::APPLE::vertex_array_object`. Each struct has the same public methods as Extension class (requiredVersion(), coreVersion() and string(), but these structs are better suited for compile-time decisions rather than %Extension instances. See Context::isExtensionSupported() for example usage. This namespace is built by default. To use it, you need to add `${MAGNUM_INCLUDE_DIRS}` to include path and link to `${MAGNUM_LIBRARIES}`. See @ref building and @ref cmake for more information. @see MAGNUM_ASSERT_EXTENSION_SUPPORTED() @todo Manual indices for extensions, this has gaps */ namespace Extensions { #ifndef DOXYGEN_GENERATING_OUTPUT #define _extension(prefix, vendor, extension, _requiredVersion, _coreVersion) \ struct extension { \ enum: std::size_t { Index = __LINE__-1 }; \ constexpr static Version requiredVersion() { return Version::_requiredVersion; } \ constexpr static Version coreVersion() { return Version::_coreVersion; } \ constexpr static const char* string() { return #prefix "_" #vendor "_" #extension; } \ }; /* IMPORTANT: don't forget to add new extensions also in Context.cpp */ namespace GL { #ifndef MAGNUM_TARGET_GLES #line 1 namespace AMD { _extension(GL,AMD,vertex_shader_layer, GL210, None) // #417 _extension(GL,AMD,shader_trinary_minmax, GL210, None) // #428 } namespace APPLE { _extension(GL,APPLE,flush_buffer_range, GL210, GL300) // #321 _extension(GL,APPLE,vertex_array_object, GL210, GL300) // #273 } namespace ARB { _extension(GL,ARB,texture_rectangle, GL210, GL310) // #38 _extension(GL,ARB,color_buffer_float, GL210, GL300) // #39 _extension(GL,ARB,half_float_pixel, GL210, GL300) // #40 _extension(GL,ARB,texture_float, GL210, GL300) // #41 _extension(GL,ARB,depth_buffer_float, GL210, GL300) // #43 _extension(GL,ARB,draw_instanced, GL210, GL310) // #44 _extension(GL,ARB,framebuffer_object, GL210, GL300) // #45 _extension(GL,ARB,geometry_shader4, GL210, GL320) // #47 _extension(GL,ARB,instanced_arrays, GL210, GL330) // #49 _extension(GL,ARB,map_buffer_range, GL210, GL300) // #50 _extension(GL,ARB,texture_buffer_object, GL210, GL310) // #51 _extension(GL,ARB,texture_rg, GL210, GL300) // #53 _extension(GL,ARB,uniform_buffer_object, GL210, GL310) // #57 _extension(GL,ARB,copy_buffer, /*?*/ GL210, GL310) // #59 _extension(GL,ARB,depth_clamp, /*?*/ GL210, GL320) // #61 _extension(GL,ARB,draw_elements_base_vertex, /*?*/ GL210, GL320) // #62 _extension(GL,ARB,fragment_coord_conventions, /*?*/ GL210, GL320) // #63 _extension(GL,ARB,provoking_vertex, /*?*/ GL210, GL320) // #64 _extension(GL,ARB,seamless_cube_map, GL210, GL320) // #65 _extension(GL,ARB,sync, GL310, GL320) // #66 _extension(GL,ARB,texture_multisample, /*?*/ GL210, GL320) // #67 _extension(GL,ARB,vertex_array_bgra, GL210, GL320) // #68 _extension(GL,ARB,draw_buffers_blend, GL210, GL400) // #69 _extension(GL,ARB,sample_shading, GL210, GL400) // #70 _extension(GL,ARB,texture_cube_map_array, /*?*/ GL210, GL400) // #71 _extension(GL,ARB,texture_gather, GL210, GL400) // #72 _extension(GL,ARB,texture_query_lod, GL210, GL400) // #73 _extension(GL,ARB,texture_compression_bptc, GL310, GL420) // #77 _extension(GL,ARB,blend_func_extended, GL210, GL330) // #78 _extension(GL,ARB,explicit_attrib_location, /*!*/ GL320, GL330) // #79 _extension(GL,ARB,occlusion_query2, GL210, GL330) // #80 _extension(GL,ARB,sampler_objects, GL210, GL330) // #81 _extension(GL,ARB,shader_bit_encoding, /*?*/ GL210, GL330) // #82 _extension(GL,ARB,texture_rgb10_a2ui, GL210, GL330) // #83 _extension(GL,ARB,texture_swizzle, /*?*/ GL210, GL330) // #84 _extension(GL,ARB,timer_query, /*?*/ GL210, GL330) // #85 _extension(GL,ARB,vertex_type_2_10_10_10_rev, GL210, GL330) // #86 _extension(GL,ARB,draw_indirect, GL310, GL400) // #87 _extension(GL,ARB,gpu_shader5, GL320, GL400) // #88 _extension(GL,ARB,gpu_shader_fp64, GL320, GL400) // #89 _extension(GL,ARB,shader_subroutine, GL320, GL400) // #90 _extension(GL,ARB,tessellation_shader, GL320, GL400) // #91 _extension(GL,ARB,texture_buffer_object_rgb32, /*?*/ GL210, GL400) // #92 _extension(GL,ARB,transform_feedback2, GL210, GL400) // #93 _extension(GL,ARB,transform_feedback3, GL210, GL400) // #94 _extension(GL,ARB,ES2_compatibility, /*?*/ GL210, GL410) // #95 _extension(GL,ARB,get_program_binary, GL300, GL410) // #96 _extension(GL,ARB,separate_shader_objects, GL210, GL410) // #97 _extension(GL,ARB,shader_precision, GL400, GL410) // #98 _extension(GL,ARB,vertex_attrib_64bit, GL300, GL410) // #99 _extension(GL,ARB,viewport_array, GL210, GL410) // #100 _extension(GL,ARB,robustness, GL210, None) // #105 _extension(GL,ARB,base_instance, GL210, GL420) // #107 _extension(GL,ARB,shading_language_420pack, /*!*/ GL320, GL420) // #108 _extension(GL,ARB,transform_feedback_instanced, GL210, GL420) // #109 _extension(GL,ARB,compressed_texture_pixel_storage, GL210, GL420) // #110 _extension(GL,ARB,conservative_depth, GL300, GL420) // #111 _extension(GL,ARB,internalformat_query, GL210, GL420) // #112 _extension(GL,ARB,map_buffer_alignment, GL210, GL420) // #113 _extension(GL,ARB,shader_atomic_counters, GL300, GL420) // #114 _extension(GL,ARB,shader_image_load_store, GL300, GL420) // #115 _extension(GL,ARB,shading_language_packing, /*?*/ GL210, GL420) // #116 _extension(GL,ARB,texture_storage, GL210, GL420) // #117 _extension(GL,ARB,arrays_of_arrays, GL210, GL430) // #120 _extension(GL,ARB,clear_buffer_object, GL210, GL430) // #121 _extension(GL,ARB,compute_shader, GL420, GL430) // #122 _extension(GL,ARB,copy_image, GL210, GL430) // #123 _extension(GL,ARB,texture_view, GL210, GL430) // #124 _extension(GL,ARB,vertex_attrib_binding, GL210, GL430) // #125 _extension(GL,ARB,ES3_compatibility, GL330, GL430) // #127 _extension(GL,ARB,explicit_uniform_location, /*!*/ GL320, GL430) // #128 _extension(GL,ARB,fragment_layer_viewport, GL300, GL430) // #129 _extension(GL,ARB,framebuffer_no_attachments, GL210, GL430) // #130 _extension(GL,ARB,internalformat_query2, GL210, GL430) // #131 _extension(GL,ARB,invalidate_subdata, GL210, GL430) // #132 _extension(GL,ARB,multi_draw_indirect, GL310, GL430) // #133 _extension(GL,ARB,program_interface_query, GL210, GL430) // #134 _extension(GL,ARB,robust_buffer_access_behavior,GL210, GL430) // #135 _extension(GL,ARB,shader_image_size, GL420, GL430) // #136 _extension(GL,ARB,shader_storage_buffer_object, GL400, GL430) // #137 _extension(GL,ARB,stencil_texturing, GL210, GL430) // #138 _extension(GL,ARB,texture_buffer_range, GL210, GL430) // #139 _extension(GL,ARB,texture_query_levels, GL300, GL430) // #140 _extension(GL,ARB,texture_storage_multisample, GL210, GL430) // #141 _extension(GL,ARB,buffer_storage, /*?*/ GL430, GL440) // #144 _extension(GL,ARB,clear_texture, GL210, GL440) // #145 _extension(GL,ARB,enhanced_layouts, GL310, GL440) // #146 _extension(GL,ARB,multi_bind, GL300, GL440) // #147 _extension(GL,ARB,query_buffer_object, GL210, GL440) // #148 _extension(GL,ARB,texture_mirror_clamp_to_edge, GL210, GL440) // #149 _extension(GL,ARB,texture_stencil8, GL210, GL440) // #150 _extension(GL,ARB,vertex_type_10f_11f_11f_rev, GL300, GL440) // #151 } namespace ATI { _extension(GL,ATI,texture_mirror_once, GL210, None) // #221 } namespace EXT { _extension(GL,EXT,texture_filter_anisotropic, GL210, None) // #187 /* EXT_framebuffer_object, EXT_packed_depth_stencil, EXT_framebuffer_blit, EXT_framebuffer_multisample replaced with ARB_framebuffer_object */ _extension(GL,EXT,texture_mirror_clamp, GL210, None) // #298 _extension(GL,EXT,gpu_shader4, GL210, GL300) // #326 _extension(GL,EXT,packed_float, GL210, GL300) // #328 _extension(GL,EXT,texture_array, GL210, GL300) // #329 _extension(GL,EXT,texture_compression_rgtc, GL210, GL300) // #332 _extension(GL,EXT,texture_shared_exponent, GL210, GL300) // #333 _extension(GL,EXT,framebuffer_sRGB, GL210, GL300) // #337 _extension(GL,EXT,draw_buffers2, GL210, GL300) // #340 _extension(GL,EXT,texture_integer, GL210, GL300) // #343 _extension(GL,EXT,transform_feedback, GL210, GL300) // #352 _extension(GL,EXT,direct_state_access, GL210, None) // #353 _extension(GL,EXT,texture_snorm, GL300, GL310) // #365 } namespace GREMEDY { _extension(GL,GREMEDY,string_marker, GL210, None) // #311 } namespace INTEL { /* INTEL_map_texture not supported */ // #429 } namespace KHR { _extension(GL,KHR,debug, GL210, GL430) // #119 } namespace NV { _extension(GL,NV,half_float, GL210, GL300) // #283 _extension(GL,NV,primitive_restart, GL210, GL310) // #285 _extension(GL,NV,depth_buffer_float, GL210, GL300) // #334 _extension(GL,NV,conditional_render, GL210, GL300) // #346 /* NV_draw_texture not supported */ // #430 } /* IMPORTANT: if this line is > 226 (66 + size), don't forget to update array size in Context.h */ #else #line 1 namespace ANGLE { _extension(GL,ANGLE,framebuffer_blit, GLES200, GLES300) // #83 _extension(GL,ANGLE,framebuffer_multisample, GLES200, GLES300) // #84 _extension(GL,ANGLE,depth_texture, GLES200, GLES300) // #138 } namespace APPLE { _extension(GL,APPLE,framebuffer_multisample, GLES200, GLES300) // #78 _extension(GL,APPLE,texture_format_BGRA8888, GLES200, None) // #79 } namespace ARM { _extension(GL,ARM,rgba8, GLES200, GLES300) // #82 } namespace CHROMIUM { _extension(GL,CHROMIUM,map_sub, GLES200, None) } namespace EXT { _extension(GL,EXT,texture_filter_anisotropic, GLES200, None) // #41 _extension(GL,EXT,texture_type_2_10_10_10_REV, GLES200, GLES300) // #42 _extension(GL,EXT,texture_format_BGRA8888, GLES200, None) // #51 _extension(GL,EXT,discard_framebuffer, GLES200, GLES300) // #64 _extension(GL,EXT,blend_minmax, GLES200, GLES300) // #65 _extension(GL,EXT,read_format_bgra, GLES200, None) // #66 _extension(GL,EXT,debug_marker, GLES200, None) // #99 _extension(GL,EXT,occlusion_query_boolean, GLES200, GLES300) // #100 _extension(GL,EXT,separate_shader_objects, GLES200, None) // #101 _extension(GL,EXT,texture_rg, GLES200, GLES300) // #103 _extension(GL,EXT,sRGB, GLES200, None) // #105 _extension(GL,EXT,multisampled_render_to_texture, GLES200, None) // #106 _extension(GL,EXT,robustness, GLES200, None) // #107 _extension(GL,EXT,texture_storage, GLES200, GLES300) // #108 _extension(GL,EXT,map_buffer_range, GLES200, GLES300) // #121 _extension(GL,EXT,disjoint_timer_query, GLES200, None) // #150 } namespace KHR { _extension(GL,KHR,debug, GLES200, None) // #118 } namespace NV { _extension(GL,NV,draw_buffers, GLES200, GLES300) // #91 _extension(GL,NV,fbo_color_attachments, GLES200, GLES300) // #92 _extension(GL,NV,read_buffer, GLES200, GLES300) // #93 _extension(GL,NV,read_buffer_front, GLES200, None) // #93 _extension(GL,NV,read_depth, GLES200, GLES300) // #94 _extension(GL,NV,read_stencil, GLES200, None) // #94 _extension(GL,NV,read_depth_stencil, GLES200, GLES300) // #94 _extension(GL,NV,framebuffer_blit, GLES200, GLES300) // #142 _extension(GL,NV,framebuffer_multisample, GLES200, GLES300) // #143 _extension(GL,NV,texture_border_clamp, GLES200, None) // #149 } namespace OES { _extension(GL,OES,depth24, GLES200, GLES300) // #24 _extension(GL,OES,depth32, GLES200, None) // #25 _extension(GL,OES,element_index_uint, GLES200, GLES300) // #26 _extension(GL,OES,mapbuffer, GLES200, None) // #29 _extension(GL,OES,rgb8_rgba8, GLES200, GLES300) // #30 _extension(GL,OES,stencil1, GLES200, None) // #31 _extension(GL,OES,stencil4, GLES200, None) // #32 _extension(GL,OES,texture_3D, GLES200, None) // #34 _extension(GL,OES,texture_half_float_linear, GLES200, GLES300) // #35 _extension(GL,OES,texture_float_linear, GLES200, GLES300) // #35 _extension(GL,OES,texture_half_float, GLES200, GLES300) // #36 _extension(GL,OES,texture_float, GLES200, GLES300) // #36 _extension(GL,OES,vertex_half_float, GLES200, GLES300) // #38 _extension(GL,OES,packed_depth_stencil, GLES200, GLES300) // #43 _extension(GL,OES,depth_texture, GLES200, GLES300) // #44 _extension(GL,OES,standard_derivatives, GLES200, GLES300) // #45 _extension(GL,OES,vertex_array_object, GLES200, GLES300) // #71 _extension(GL,OES,required_internalformat, GLES200, GLES300) // #115 _extension(GL,OES,surfaceless_context, GLES200, GLES300) // #116 } #endif } #undef _extension #endif /* Notes (marked with ! above) ARB_explicit_attrib_location, ARB_explicit_uniform_location don't work with GLSL 1.20 (compiler error related to layout qualifier on Mesa), 1.30 (compiler error related to layout qualifier on NVidia) or 1.40 (compiler error on Mac OS X), bumping minimal required version to GL 3.2 even if both have *2.1* as minimal. ARB_shading_language_420pack (particularly sampler bindings) doesn't work with GLSL 1.40 (compiler error related to layout qualifier, similar to the above), bumping minimal required version to GL 3.2 even that it has *3.0* as minimal. */ } } #endif