/* This file is part of Magnum. Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 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. */ namespace Magnum { /** @page opengl-support Support state @brief List of (un)supported OpenGL features and extensions. @tableofcontents @m_footernavigation @section opengl-support-state OpenGL implementation state The extension implementation is considered complete if all its defined types, functions and enum values are exposed through the API, except for features listed below in @ref opengl-unsupported-features. All extensions from the below lists are available in the @ref GL::Extensions namespace and it's possible to check for their availability using @ref GL::Context::isExtensionSupported(). See its documentation for more information. @subsection opengl-support-21 OpenGL 2.1 The core subset of OpenGL 2.1 should be fully implemented, except for the following: - Proxy textures - Some forgotten limit queries @subsection opengl-support-30 OpenGL 3.0 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 1.30 | done @fn_gl{ClearBuffer} functions | done @gl_extension{ARB,map_buffer_range} | done @gl_extension{ARB,color_buffer_float} | | @gl_extension{ARB,half_float_pixel} | done @gl_extension{ARB,texture_float} | done @gl_extension{ARB,depth_buffer_float} | done @gl_extension{ARB,texture_rg} | done @gl_extension{ARB,vertex_array_object} | done @gl_extension{ARB,framebuffer_object} | done @gl_extension{ARB,framebuffer_sRGB} | done @gl_extension{ARB,half_float_vertex} | done @gl_extension{EXT,gpu_shader4} | done @gl_extension{EXT,packed_float} | done @gl_extension{EXT,texture_array} | done @gl_extension{EXT,texture_compression_rgtc} | done @gl_extension{EXT,texture_shared_exponent} | done @gl_extension{EXT,draw_buffers2} | done (GL 3.0 subset) @gl_extension{EXT,texture_integer} | done (GL 3.0 subset) @gl_extension{EXT,transform_feedback} | done `MAGNUM_shader_vertex_id` \n @m_span{m-text m-dim} Pseudo-extension denoting support for the @glsl gl_VertexID @ce GLSL builtin. @m_endspan | done @gl_extension{NV,depth_buffer_float} | done @gl_extension{NV,conditional_render} | done @subsection opengl-support-31 OpenGL 3.1 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 1.40 | done @gl_extension{ARB,texture_rectangle} | done @gl_extension{ARB,draw_instanced} | done @gl_extension{ARB,texture_buffer_object} | done @gl_extension{ARB,uniform_buffer_object} | done except for data layout queries @gl_extension{ARB,copy_buffer} | done @gl_extension{EXT,texture_snorm} | done @gl_extension{NV,primitive_restart} | | @subsection opengl-support-32 OpenGL 3.2 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 1.50 | done @gl_extension{ARB,geometry_shader4} | missing some limit queries @gl_extension{ARB,depth_clamp} | done @gl_extension{ARB,draw_elements_base_vertex} | done @gl_extension{ARB,fragment_coord_conventions} | done (shading language only) @gl_extension{ARB,provoking_vertex} | done @gl_extension{ARB,seamless_cube_map} | done @gl_extension{ARB,sync} | | @gl_extension{ARB,texture_multisample} | missing sample location queries and sample mask @gl_extension{ARB,vertex_array_bgra} | done @subsection opengl-support-33 OpenGL 3.3 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 3.30 | done @gl_extension{ARB,instanced_arrays} | done @gl_extension{ARB,blend_func_extended} | done @gl_extension{ARB,explicit_attrib_location} | done (shading language only) @gl_extension{ARB,occlusion_query2} | done @gl_extension{ARB,sampler_objects} | | @gl_extension{ARB,shader_bit_encoding} | done (shading language only) @gl_extension{ARB,texture_rgb10_a2ui} | done @gl_extension{ARB,texture_swizzle} | done @gl_extension{ARB,timer_query} | missing direct query @gl_extension{ARB,vertex_type_2_10_10_10_rev} | done @subsection opengl-support-40 OpenGL 4.0 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 4.00 | done @gl_extension{ARB,draw_buffers_blend} | done @gl_extension{ARB,sample_shading} | done @gl_extension{ARB,texture_cube_map_array} | done @gl_extension{ARB,texture_gather} | missing limit queries @gl_extension{ARB,texture_query_lod} | done (shading language only) @gl_extension{ARB,draw_indirect} | | @gl_extension{ARB,gpu_shader5} | missing limit queries @gl_extension{ARB,gpu_shader_fp64} | done @gl_extension{ARB,shader_subroutine} | | @gl_extension{ARB,tessellation_shader} | done except for `MAX_TESS_GEN_LEVEL` and `MAX_TESS_PATCH_COMPONENTS` queries @gl_extension{ARB,texture_buffer_object_rgb32} | done @gl_extension{ARB,transform_feedback2} | done @gl_extension{ARB,transform_feedback3} | missing indexed properties query @subsection opengl-support-41 OpenGL 4.1 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 4.10 | done @gl_extension{ARB,ES2_compatibility} | only float depth clear @gl_extension{ARB,get_program_binary} | | @gl_extension{ARB,separate_shader_objects} | only direct uniform binding @gl_extension{ARB,shader_precision} | done (shading language only) @gl_extension{ARB,vertex_attrib_64bit} | done @gl_extension{ARB,viewport_array} | | @subsection opengl-support-42 OpenGL 4.2 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 4.20 | done @gl_extension{ARB,texture_compression_bptc} | done @gl_extension{ARB,base_instance} | done @gl_extension{ARB,shading_language_420pack} | done (shading language only) @gl_extension{ARB,transform_feedback_instanced} | done @gl_extension{ARB,compressed_texture_pixel_storage} | done @gl_extension{ARB,conservative_depth} | done (shading language only) @gl_extension{ARB,internalformat_query} | | @gl_extension{ARB,map_buffer_alignment} | done @gl_extension{ARB,shader_atomic_counters} | done @gl_extension{ARB,shader_image_load_store} | done @gl_extension{ARB,shading_language_packing} | done (shading language only) @gl_extension{ARB,texture_storage} | done @subsection opengl-support-43 OpenGL 4.3 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 4.30 | done @gl_extension{ARB,arrays_of_arrays} | done (shading language only) @gl_extension{ARB,ES3_compatibility} | only conservative sample query and compression formats @gl_extension{ARB,clear_buffer_object} | | @gl_extension{ARB,compute_shader} | done except for indirect dispatch @gl_extension{ARB,copy_image} | | @gl_extension{KHR,debug} | missing log retrieval, sync, pipeline and sampler label @gl_extension{ARB,explicit_uniform_location} | done @gl_extension{ARB,fragment_layer_viewport} | done (shading language only) @gl_extension{ARB,framebuffer_no_attachments} | done @gl_extension{ARB,internalformat_query2} | only compressed texture block queries @gl_extension{ARB,invalidate_subdata} | done @gl_extension{ARB,multi_draw_indirect} | | @gl_extension{ARB,program_interface_query} | | @gl_extension{ARB,robust_buffer_access_behavior} | done (nothing to do) @gl_extension{ARB,shader_image_size} | done (shading language only) @gl_extension{ARB,shader_storage_buffer_object} | missing (unneeded) block binding @gl_extension{ARB,stencil_texturing} | done @gl_extension{ARB,texture_buffer_range} | done @gl_extension{ARB,texture_query_levels} | done (shading language only) @gl_extension{ARB,texture_storage_multisample} | done @gl_extension{ARB,texture_view} | done @gl_extension{ARB,vertex_attrib_binding} | | @subsection opengl-support-44 OpenGL 4.4 @todo Also fallback to @gl_extension{AMD,query_buffer_object} @todo @gl_extension{AMD,pinned_memory} "fallback" for @gl_extension{ARB,buffer_storage} @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 4.40 | done @def_gl{MAX_VERTEX_ATTRIB_STRIDE} | | @gl_extension{ARB,buffer_storage} | done @gl_extension{ARB,clear_texture} | | @gl_extension{ARB,enhanced_layouts} | done (shading language only) @gl_extension{ARB,multi_bind} | missing sampler and vertex buffer binding @gl_extension{ARB,query_buffer_object} | | @gl_extension{ARB,texture_mirror_clamp_to_edge} | done @gl_extension{ARB,texture_stencil8} | done @gl_extension{ARB,vertex_type_10f_11f_11f_rev} | done @subsection opengl-support-45 OpenGL 4.5 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 4.50 | done @gl_extension{ARB,ES3_1_compatibility} | done @gl_extension{ARB,clip_control} | done @gl_extension{ARB,conditional_render_inverted} | done @gl_extension{ARB,cull_distance} | done @gl_extension{ARB,derivative_control} | done (shading language only) @gl_extension{ARB,direct_state_access} | done for implemented functionality @gl_extension{ARB,get_texture_sub_image} | done @gl_extension{ARB,shader_texture_image_samples} | done (shading language only) @gl_extension{ARB,texture_barrier} | done @gl_extension{KHR,context_flush_control} | | @gl_extension{KHR,robustness} | | @subsection opengl-support-46 OpenGL 4.6 @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ GLSL 4.60 | done @gl_extension{ARB,indirect_parameters} | | @gl_extension{ARB,shader_draw_parameters} | done (shading language only) @gl_extension{ARB,shader_group_vote} | done (shading language only) @gl_extension{ARB,pipeline_statistics_query} | done @gl_extension{ARB,transform_feedback_overflow_query} | done @gl_extension{ARB,shader_atomic_counter_ops} | done (shading language only) @gl_extension{ARB,gl_spirv} | | @gl_extension{ARB,polygon_offset_clamp} | | @gl_extension{ARB,spirv_extensions} | | @gl_extension{ARB,texture_filter_anisotropic} | done @gl_extension{KHR,no_error} | done @subsection opengl-support-extensions ARB / Khronos OpenGL extensions @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ @gl_extension{ARB,robustness} | done @gl_extension{KHR,texture_compression_astc_hdr} | done @gl_extension{ARB,robustness_isolation} | done @gl_extension{ARB,bindless_texture} | | @gl_extension{ARB,compute_variable_group_size} | | @gl_extension{ARB,seamless_cubemap_per_texture} | | @gl_extension{ARB,sparse_texture} | | @gl_extension{ARB,sparse_buffer} | | @gl_extension{ARB,ES3_2_compatibility} | | @gl_extension{ARB,sample_locations} | | @gl_extension2{KHR,texture_compression_astc_ldr,KHR_texture_compression_astc_hdr} | done @gl_extension{KHR,robust_buffer_access_behavior} | done (nothing to do) @gl_extension{KHR,blend_equation_advanced} | done @gl_extension2{KHR,blend_equation_advanced_coherent,KHR_blend_equation_advanced} | done @gl_extension{KHR,texture_compression_astc_sliced_3d} | done (nothing to do) @gl_extension{KHR,parallel_shader_compile} | missing thread count setting @subsection opengl-support-extensions-vendor Vendor OpenGL extensions @todo @gl_extension{ARB,sparse_texture}, @gl_extension{ARB,bindless_texture} + their vendor equivalents @todo @gl_extension{ATI,meminfo}, @gl_extension{NVX,gpu_memory_info}, GPU temperature @todo @gl_extension{AMD,performance_monitor}, @gl_extension{INTEL,performance_query} @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ @gl_extension{AMD,transform_feedback3_lines_triangles} | done (nothing to do) @gl_extension{AMD,sample_positions} | | @gl_extension{AMD,vertex_shader_layer} | done (shading language only) @gl_extension{AMD,shader_trinary_minmax} | done (shading language only) @gl_extension{AMD,shader_explicit_vertex_parameter} | done (shading language only) @gl_extension{ATI,texture_mirror_once} | done (GL 4.4 subset) @gl_extension{EXT,texture_filter_anisotropic} | done @gl_extension{EXT,texture_compression_s3tc} | done @gl_extension{EXT,texture_mirror_clamp} | only GL 4.4 subset @gl_extension{EXT,texture_compression_dxt1} | done @gl_extension{EXT,texture_sRGB_decode} | done @gl_extension{EXT,shader_integer_mix} | done (shading language only) @gl_extension{EXT,debug_label} | missing pipeline and sampler label @gl_extension{EXT,debug_marker} | done @gl_extension{EXT,texture_sRGB_R8} | done @gl_extension{EXT,texture_sRGB_RG8} | done @gl_extension{GREMEDY,string_marker} | done @gl_extension{NV,geometry_shader_passthrough} | done (shading language only) @gl_extension{NV,sample_locations} | | @gl_extension{NV,fragment_shader_barycentric} | done (shading language only) @gl_extension{OVR,multiview} | | @gl_extension{OVR,multiview2} | | @subsection opengl-support-es20 OpenGL ES 2.0 Features that have their equivalents implemented in desktop version are supported. ESSL 1.00 is supported. @subsection opengl-support-es30 OpenGL ES 3.0 Features that have their equivalents implemented in desktop version are supported. ESSL 3.00 is supported. @subsection opengl-support-es31 OpenGL ES 3.1 Features that have their equivalents implemented in desktop version are supported. ESSL 3.10 is supported. @subsection opengl-support-es32 OpenGL ES 3.2 Features that have their equivalents implemented in desktop version are supported. ESSL 3.20 is supported. @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ @gl_extension{EXT,color_buffer_half_float} | | @gl_extension{EXT,color_buffer_float} | | @gl_extension{EXT,copy_image} | | @gl_extension{EXT,draw_buffers_indexed} | done @gl_extension{EXT,geometry_shader} | missing some ES-specific limit queries @gl_extension{EXT,gpu_shader5} | done (shading language only) @gl_extension{EXT,shader_io_blocks} | done (shading language only) @gl_extension{EXT,tessellation_shader} | done except for `MAX_TESS_GEN_LEVEL` and `MAX_TESS_PATCH_COMPONENTS` queries @gl_extension{EXT,texture_border_clamp} | done @gl_extension{EXT,texture_buffer} | done @gl_extension{EXT,texture_cube_map_array} | done @gl_extension{EXT,primitive_bounding_box} | | @gl_extension2{KHR,texture_compression_astc_ldr,KHR_texture_compression_astc_hdr} | done @gl_extension{KHR,debug} | see above @gl_extension{KHR,blend_equation_advanced} | done @gl_extension{KHR,robustness} | | @gl_extension{KHR,robust_buffer_access_behavior} | done (nothing to do) @gl_extension{OES,sample_shading} | done @gl_extension{OES,sample_variables} | done (shading language only) @gl_extension{OES,shader_image_atomic} | done (shading language only) @gl_extension{OES,shader_multisample_interpolation} | | @gl_extension{OES,texture_stencil8} | done @gl_extension{OES,texture_storage_multisample_2d_array} | done @subsection opengl-support-es30-extensions OpenGL ES 2.0 extensions to match ES 3.0 functionality Unless said otherwise, these are not exposed in the @ref GL::Extensions namespace on @ref MAGNUM_TARGET_GLES2 "OpenGL ES 3.0 builds". @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ @gl_extension{ANGLE,framebuffer_blit} | done @gl_extension{ANGLE,framebuffer_multisample} | done @gl_extension{ANGLE,instanced_arrays} | done @gl_extension{ANGLE,depth_texture} | done @m_class{m-doc-external} [ANGLE_compressed_texture_etc](https://chromium.googlesource.com/angle/angle/+/master/extensions/ANGLE_compressed_texture_etc.txt) (unlisted) | done @gl_extension{APPLE,framebuffer_multisample} | done (ES 3.0 subset) @gl_extension{APPLE,texture_max_level} | done @gl_extension{ARM,rgba8} | done @gl_extension{EXT,texture_type_2_10_10_10_REV} | done @gl_extension{EXT,discard_framebuffer} | done @gl_extension{EXT,blend_minmax} | done @gl_extension{EXT,shader_texture_lod} | done (shading language only) @gl_extension{EXT,unpack_subimage} | done @gl_extension{EXT,occlusion_query_boolean} | done @gl_extension{EXT,shadow_samplers} | done @gl_extension{EXT,texture_rg} | done @gl_extension{EXT,sRGB} | done @gl_extension{EXT,texture_storage} | done @gl_extension{EXT,map_buffer_range} | done @gl_extension{EXT,draw_buffers} | done @gl_extension{EXT,instanced_arrays} | done @gl_extension{EXT,draw_instanced} | done `MAGNUM_shader_vertex_id` \n @m_span{m-text m-dim} Pseudo-extension denoting support for the @glsl gl_VertexID @ce \n GLSL builtin. Exposed on ES3 builds only. @m_endspan | done @gl_extension{NV,draw_buffers} | done @gl_extension{NV,fbo_color_attachments} | done @gl_extension{NV,read_buffer} | done @gl_extension{NV,pack_subimage} | done @gl_extension{NV,draw_instanced} | done @gl_extension{NV,framebuffer_blit} | done @gl_extension{NV,framebuffer_multisample} | done @gl_extension{NV,instanced_arrays} | done @gl_extension{NV,shadow_samplers_array} | done (shading language only) @gl_extension{NV,shadow_samplers_cube} | done (shading language only) @gl_extension{OES,depth24} | done @gl_extension{OES,element_index_uint} | done @gl_extension{OES,fbo_render_mipmap} | done @gl_extension{OES,rgb8_rgba8} | done (desktop-compatible subset) @gl_extension{OES,texture_3D} | done @gl_extension2{OES,texture_half_float_linear,OES_texture_float_linear} | done @gl_extension2{OES,texture_half_float,OES_texture_float} | done @gl_extension{OES,texture_float} | done @gl_extension{OES,texture_npot} | done (nothing to do) @gl_extension{OES,vertex_half_float} | done @gl_extension{OES,packed_depth_stencil} | done @gl_extension{OES,depth_texture} | done @gl_extension{OES,standard_derivatives} | done @gl_extension{OES,vertex_array_object} | done @gl_extension{OES,required_internalformat} | done (desktop-compatible subset) @gl_extension{OES,surfaceless_context} | done @subsection opengl-support-es-extensions OpenGL ES extensions @todo @gl_extension{NV,non_square_matrices} @todo Support also IMG_multisampled_render_to_texture? It has different enum values (!) @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ @gl_extension{ANDROID,extension_pack_es31a} | done (nothing to do) @gl_extension2{ANGLE,texture_compression_dxt1,ANGLE_texture_compression_dxt} | done @gl_extension2{ANGLE,texture_compression_dxt3,ANGLE_texture_compression_dxt} | done @gl_extension2{ANGLE,texture_compression_dxt5,ANGLE_texture_compression_dxt} | done @m_class{m-doc-external} [ANGLE_multi_draw](https://chromium.googlesource.com/angle/angle/+/master/extensions/ANGLE_multi_draw.txt) (unlisted) | done @m_class{m-doc-external} [ANGLE_base_vertex_base_instance](https://chromium.googlesource.com/angle/angle/+/master/extensions/ANGLE_base_vertex_base_instance.txt) (unlisted) | done @m_class{m-doc-external} [ANGLE_provoking_vertex](https://chromium.googlesource.com/angle/angle/+/main/extensions/ANGLE_provoking_vertex.txt) (unlisted) | done @m_class{m-doc-external} [ANGLE_polygon_mode](https://chromium.googlesource.com/angle/angle/+/HEAD/extensions/ANGLE_polygon_mode.txt) (unlisted) | done @m_class{m-doc-external} [ANGLE_stencil_texturing](https://chromium.googlesource.com/angle/angle/+/HEAD/extensions/ANGLE_stencil_texturing.txt) (unlisted) | done @gl_extension{APPLE,texture_format_BGRA8888} | done @gl_extension{APPLE,clip_distance} | done @gl_extension{ARM,shader_framebuffer_fetch} | missing renderer setup and limit query @gl_extension{ARM,shader_framebuffer_fetch_depth_stencil} | done (shading language only) @gl_extension{EXT,texture_filter_anisotropic} | done @gl_extension{EXT,texture_compression_dxt1} | done @gl_extension{EXT,texture_format_BGRA8888} | done @gl_extension{EXT,read_format_bgra} | done @gl_extension{EXT,multi_draw_arrays} | done @gl_extension{EXT,debug_label} | see above @gl_extension{EXT,debug_marker} | done @gl_extension2{EXT,separate_shader_objects,EXT_separate_shader_objects.gles} | only direct uniform binding @gl_extension{EXT,multisampled_render_to_texture} | only renderbuffer storage @gl_extension{EXT,robustness} | done @gl_extension{EXT,shader_framebuffer_fetch} | missing limit query @gl_extension{EXT,disjoint_timer_query} | only time elapsed query @gl_extension{EXT,texture_sRGB_decode} | done @gl_extension{EXT,sRGB_write_control} | done @gl_extension{EXT,texture_compression_s3tc} | done @gl_extension{EXT,pvrtc_sRGB} | done @gl_extension{EXT,shader_integer_mix} | done (shading language only) @gl_extension{EXT,texture_view} | done @gl_extension{EXT,draw_elements_base_vertex} | done @gl_extension{EXT,texture_norm16} | done @gl_extension{EXT,texture_sRGB_R8} | done @gl_extension{EXT,texture_sRGB_RG8} | done @gl_extension{EXT,blend_func_extended} | done @gl_extension{EXT,polygon_offset_clamp} | | @gl_extension{EXT,clip_cull_distance} | done @gl_extension{EXT,texture_compression_rgtc} | done @gl_extension{EXT,texture_compression_bptc} | done @gl_extension{EXT,texture_compression_s3tc_srgb} | done @gl_extension{EXT,clip_control} | done @gl_extension{EXT,texture_mirror_clamp_to_edge} | done @gl_extension{EXT,depth_clamp} | done @gl_extension{IMG,texture_compression_pvrtc} | done @gl_extension2{KHR,texture_compression_astc_hdr,KHR_texture_compression_astc_hdr} | done @gl_extension2{KHR,blend_equation_advanced_coherent,KHR_blend_equation_advanced} | done @gl_extension{KHR,context_flush_control} | | @gl_extension{KHR,no_error} | done @gl_extension{KHR,texture_compression_astc_sliced_3d} | done (nothing to do) @gl_extension{KHR,parallel_shader_compile} | missing thread count setting @gl_extension2{NV,read_buffer_front,NV_read_buffer} | done @gl_extension2{NV,read_depth,NV_read_depth_stencil} | done @gl_extension2{NV,read_stencil,NV_read_depth_stencil} | done @gl_extension{NV,read_depth_stencil} | done @gl_extension{NV,texture_border_clamp} | done @gl_extension{NV,shader_noperspective_interpolation} | done (shading language only) @gl_extension{NV,geometry_shader_passthrough} | done (shading language only) @gl_extension{NV,sample_locations} | | @gl_extension{NV,polygon_mode} | done @gl_extension{OES,depth32} | done @gl_extension{OES,mapbuffer} | done @gl_extension{OES,stencil1} | done @gl_extension{OES,stencil4} | done @gl_extension{OES,texture_float_linear} | done @gl_extension{OES,texture_view} | done @gl_extension{OES,draw_elements_base_vertex} | done @gl_extension{OVR,multiview} | | @gl_extension{OVR,multiview2} | | @subsection opengl-support-webgl10 WebGL 1.0 Features that have their equivalents implemented in OpenGL ES 2.0 are supported. @subsection opengl-support-webgl20 WebGL 2.0 Features that have their equivalents implemented in OpenGL ES 3.0 are supported. @subsection opengl-support-webgl20-extensions WebGL 1.0 extensions to match WebGL 2.0 functionality Unless said otherwise, these are not available in the @ref GL::Extensions namespace on @ref MAGNUM_TARGET_GLES2 "WebGL 2.0 builds". @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ @webgl_extension{ANGLE,instanced_arrays} | done @webgl_extension{EXT,frag_depth} | done (shading language only) @webgl_extension{EXT,sRGB} | done @webgl_extension{EXT,blend_minmax} | done @webgl_extension{EXT,shader_texture_lod} | done (shading language only) `MAGNUM_shader_vertex_id` \n @m_span{m-text m-dim} Pseudo-extension denoting support for the @glsl gl_VertexID @ce \n GLSL builtin. Exposed on WebGL 2 builds only. @m_endspan | done @webgl_extension{OES,texture_float} | done @webgl_extension{OES,texture_half_float} | done @webgl_extension{OES,standard_derivatives} | done @webgl_extension{OES,vertex_array_object} | done @webgl_extension{OES,element_index_uint} | done @webgl_extension{OES,texture_half_float_linear} | done @webgl_extension{OES,fbo_render_mipmap} | done @webgl_extension{WEBGL,depth_texture} | done @webgl_extension{WEBGL,color_buffer_float} | | @webgl_extension{WEBGL,draw_buffers} | done @attention @webgl_extension{EXT,color_buffer_half_float} and @webgl_extension{WEBGL,color_buffer_float} are not part of WebGL 2.0, but are included in this table because they are subsumed by @webgl_extension{EXT,color_buffer_float} in WebGL 2.0. @subsection opengl-support-webgl-extensions WebGL extensions @m_class{m-fullwidth} Extension | Status ------------------------------------------- | ------ @webgl_extension{EXT,texture_filter_anisotropic} | done @webgl_extension{EXT,color_buffer_half_float} | | @webgl_extension{EXT,disjoint_timer_query} | only time elapsed query @webgl_extension{EXT,disjoint_timer_query_webgl2} | done @webgl_extension{EXT,color_buffer_float} | | @webgl_extension{EXT,float_blend} | | @webgl_extension{EXT,texture_compression_rgtc} | done @webgl_extension{EXT,texture_compression_bptc} | done @webgl_extension{EXT,texture_norm16} | done @webgl_extension{EXT,polygon_offset_clamp} | missing support in Emscripten @webgl_extension{EXT,clip_control} | missing support in Emscripten @webgl_extension{EXT,depth_clamp} | done @webgl_extension{EXT,texture_mirror_clamp_to_edge} | done @webgl_extension{KHR,parallel_shader_compile} | done @webgl_extension{NV,shader_noperspective_interpolation} | done (shading language only) @webgl_extension{OES,texture_float_linear} | done @webgl_extension{OES,draw_buffers_indexed} \n (originally named `EXT_draw_buffers_indexed`) | done @webgl_extension{OVR,multiview2} | | @webgl_extension{WEBGL,lose_context} | | @webgl_extension{WEBGL,debug_renderer_info} | done @webgl_extension{WEBGL,debug_shaders} | | @webgl_extension{WEBGL,compressed_texture_s3tc} | done @webgl_extension{WEBGL,compressed_texture_pvrtc} | done @webgl_extension{WEBGL,compressed_texture_etc} | done @webgl_extension{WEBGL,compressed_texture_astc} | done @webgl_extension{WEBGL,compressed_texture_s3tc_srgb} | done @webgl_extension{WEBGL,multi_draw} | done @webgl_extension{WEBGL,blend_equation_advanced_coherent} | done @webgl_extension{WEBGL,clip_cull_distance} \n (originally named `EXT_clip_cull_distance`) | done @webgl_extension{WEBGL,draw_instanced_base_vertex_base_instance} | done @webgl_extension{WEBGL,multi_draw_instanced_base_vertex_base_instance} | done @webgl_extension{WEBGL,provoking_vertex} | missing support in Emscripten @webgl_extension{WEBGL,polygon_mode} | missing support in Emscripten @webgl_extension{WEBGL,blend_func_extended} | done @webgl_extension{WEBGL,stencil_texturing} | done @section opengl-unsupported Unsupported OpenGL features Some functionality, which is either soon-to-be deprecated or isn't proven to add any performance gains, is not supported in Magnum. See also @ref opengl-deprecated. @subsection opengl-unsupported-features Unsupported features - API that is not part of core profile or is marked as deprecated (but still supported in core profile) in the latest version of OpenGL specification is not supported. The only exception are features that are needed for some OpenGL ES 2.0 implementations (such as luminance texture formats). - State queries (various `glIs*()`, `glGet*()` functions) are not supported. Magnum API is designed to prevent the need for majority of them, many of them are tracked internally to avoid redundant state changes and in many cases it is easier to set the state to some value rather than query it and then decide on the result. For detailed state introspection please use external debugger (such as ApiTrace), which is more convenient to use than manual queries. Queries of implementation-defined values (various limits etc.) and queries of generated values (buffer data, texture data) are supported. - Line and polygon smoothing (`GL_LINE_SMOOTH`, `GL_POLYGON_SMOOTH`) and related functions are not supported, as the driver might do it in software with serious performance drops. Multisampling is far superior solution. - Fixed precision data types (`GL_FIXED` in OpenGL ES) are not supported, as they occupy the same memory as floats and they aren't faster than floats on current hardware anymore. They are also not available in WebGL or desktop GL. - Shader compiler is assumed to be present (`GL_SHADER_COMPILER` returning true), as all desktop GL implementations and also ES3 are required to support it. - Querying shader attribute locations using @fn_gl_keyword{GetAttribLocation} and other resources using @fn_gl_keyword{GetProgramResource}, @fn_gl_keyword{GetProgramResourceIndex}, @fn_gl_keyword{GetProgramResourceLocation}, @fn_gl_keyword{GetProgramResourceLocationIndex} or @fn_gl_keyword{GetProgramResourceName} (as opposed to setting them) is not supported, as newer GL versions encourage setting them explicitly in shader code. - Direct vertex data specification (as opposed to using buffers) is not supported, as it encourages bad practices. - @fn_gl{PixelStore} with @def_gl{PACK_SWAP_BYTES} / @def_gl{UNPACK_SWAP_BYTES}. Too much burden imposed on every API that deals with pixel storage. Use @ref Corrade::Utility::Endianness instead. Note that this state is also not tracked, so it won't get reset in case a 3rd party code enables it. @subsection opengl-unsupported-extensions Unsupported ARB / Khronos extensions - @gl_extension{ARB,shading_language_include} is overly complicated and supported exclusively by NVidia. However, see the @ref ShaderTools::GlslangConverter "GlslangShaderConverter" plugin for shader preprocessing/compilation that *does* support @cpp #include @ce directives. - @gl_extension{ARB,cl_event} seems to be not supported anywhere - @gl_extension{ARB,shader_stencil_export} is supported exclusively by AMD - @gl_extension{EXT,texture_compression_latc} is superseded by @gl_extension{EXT,texture_compression_rgtc}, available in OpenGL 3.0. @subsection opengl-unsupported-extensions-vendor Unsupported vendor extensions - @gl_extension{INTEL,map_texture} negatively affects texture access performance. Combination of buffer mapping and pixel buffers might be of the same or better performance, without affecting texture access speed. - @gl_extension{NV,draw_texture} can be done with framebuffer blitting and doesn't make any full-screen postprocessing easier, as shaders are excluded. - @gl_extension{IMG,texture_compression_pvrtc2} OpenGL ES extension is not supported as there is no equivalent in WebGL nor Metal and [all hardware having support for it suppors other formats as well](https://forums.developer.apple.com/thread/38454). */ /** @page opengl-deprecated Deprecated OpenGL API list @m_footernavigation See also @ref opengl-unsupported and @ref deprecated. */ /** @page deprecated Deprecated list See also @ref opengl-deprecated. */ }