From 083ecf72b8a3de8b92cd2df2a597722a636c19da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 4 Jul 2020 14:14:21 +0200 Subject: [PATCH] GL: implement EXT_texture_norm16 ES and WebGL extension. --- doc/changelog.dox | 7 + doc/opengl-support.dox | 2 + src/Magnum/GL/AbstractTexture.cpp | 28 +++- src/Magnum/GL/Context.cpp | 2 + src/Magnum/GL/Context.h | 2 +- src/Magnum/GL/Extensions.h | 146 +++++++++--------- .../GL/Implementation/pixelFormatMapping.hpp | 8 +- src/Magnum/GL/PixelFormat.cpp | 6 +- src/Magnum/GL/PixelFormat.h | 22 +-- src/Magnum/GL/RenderbufferFormat.h | 44 ++++-- src/Magnum/GL/TextureFormat.cpp | 2 +- src/Magnum/GL/TextureFormat.h | 83 ++++++++-- .../OpenGL/GLES2/Emscripten/extensions.txt | 1 + .../OpenGL/GLES2/flextGLEmscripten.h | 11 ++ .../OpenGL/GLES3/Emscripten/extensions.txt | 1 + .../OpenGL/GLES3/extensions.txt | 1 + src/MagnumExternal/OpenGL/GLES3/flextGL.h | 11 ++ .../OpenGL/GLES3/flextGLEmscripten.h | 11 ++ .../OpenGL/GLES3/flextGLWindowsDesktop.h | 11 ++ 19 files changed, 278 insertions(+), 121 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 9c8cf6b2c..dfd8e58f8 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -40,6 +40,13 @@ See also: @subsection changelog-latest-new New features +@subsubsection changelog-latest-new-gl GL library + +- Implemented @gl_extension{EXT,texture_norm16} and + @webgl_extension{EXT,texture_norm16} ES and WebGL extensions, making + normalized 16-bit texture and renderbuffer formats available on all + platforms + @subsubsection changelog-latest-new-math Math library - Added @ref Math::fmod() (see [mosra/magnum#454](https://github.com/mosra/magnum/pull/454)) diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index c92519a1d..3f27f66d8 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -470,6 +470,7 @@ Extension | Status @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_norm16} | done @gl_extension{EXT,texture_sRGB_R8} | done @gl_extension{EXT,texture_sRGB_RG8} | done @gl_extension{EXT,polygon_offset_clamp} | | @@ -552,6 +553,7 @@ Extension | Status @webgl_extension{EXT,texture_compression_rgtc} | done @webgl_extension{EXT,texture_compression_bptc} | done @webgl_extension{EXT,clip_cull_distance} | done +@webgl_extension{EXT,texture_norm16} | done @webgl_extension{EXT,draw_buffers_indexed} | done @webgl_extension{OES,texture_float_linear} | done @webgl_extension{OVR,multiview2} | | diff --git a/src/Magnum/GL/AbstractTexture.cpp b/src/Magnum/GL/AbstractTexture.cpp index 1afe8a9c3..ec788e17f 100644 --- a/src/Magnum/GL/AbstractTexture.cpp +++ b/src/Magnum/GL/AbstractTexture.cpp @@ -564,7 +564,7 @@ PixelFormat pixelFormatForInternalFormat(const TextureFormat internalFormat) { #ifndef MAGNUM_TARGET_WEBGL case TextureFormat::SR8: #endif - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 case TextureFormat::R16: case TextureFormat::R16Snorm: #endif @@ -614,7 +614,7 @@ PixelFormat pixelFormatForInternalFormat(const TextureFormat internalFormat) { #ifdef MAGNUM_TARGET_GLES case TextureFormat::SRG8: #endif - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 case TextureFormat::RG16: case TextureFormat::RG16Snorm: #endif @@ -662,7 +662,8 @@ PixelFormat pixelFormatForInternalFormat(const TextureFormat internalFormat) { #ifndef MAGNUM_TARGET_GLES2 case TextureFormat::RGB8Snorm: #endif - #ifndef MAGNUM_TARGET_GLES + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) case TextureFormat::RGB16: case TextureFormat::RGB16Snorm: #endif @@ -740,7 +741,8 @@ PixelFormat pixelFormatForInternalFormat(const TextureFormat internalFormat) { #ifndef MAGNUM_TARGET_GLES2 case TextureFormat::RGBA8Snorm: #endif - #ifndef MAGNUM_TARGET_GLES + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) case TextureFormat::RGBA16: case TextureFormat::RGBA16Snorm: #endif @@ -851,8 +853,16 @@ PixelFormat pixelFormatForInternalFormat(const TextureFormat internalFormat) { #ifdef MAGNUM_TARGET_GLES2 case TextureFormat::Luminance: + #ifdef MAGNUM_TARGET_WEBGL + case TextureFormat::R16: + case TextureFormat::R16Snorm: + #endif return PixelFormat::Luminance; case TextureFormat::LuminanceAlpha: + #ifdef MAGNUM_TARGET_WEBGL + case TextureFormat::RG16: + case TextureFormat::RG16Snorm: + #endif return PixelFormat::LuminanceAlpha; #endif @@ -1046,7 +1056,8 @@ PixelType pixelTypeForInternalFormat(const TextureFormat internalFormat) { #endif #endif - #ifndef MAGNUM_TARGET_GLES + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) case TextureFormat::R16: case TextureFormat::RG16: case TextureFormat::RGB16: @@ -1067,17 +1078,18 @@ PixelType pixelTypeForInternalFormat(const TextureFormat internalFormat) { #endif return PixelType::UnsignedShort; - #ifndef MAGNUM_TARGET_GLES2 - #ifndef MAGNUM_TARGET_GLES + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) case TextureFormat::R16Snorm: case TextureFormat::RG16Snorm: case TextureFormat::RGB16Snorm: case TextureFormat::RGBA16Snorm: - #endif + #ifndef MAGNUM_TARGET_GLES2 case TextureFormat::R16I: case TextureFormat::RG16I: case TextureFormat::RGB16I: case TextureFormat::RGBA16I: + #endif return PixelType::Short; #endif diff --git a/src/Magnum/GL/Context.cpp b/src/Magnum/GL/Context.cpp index 17297e687..dd1dbf203 100644 --- a/src/Magnum/GL/Context.cpp +++ b/src/Magnum/GL/Context.cpp @@ -275,6 +275,7 @@ constexpr Extension ExtensionList[]{ _extension(EXT,texture_compression_bptc), _extension(EXT,texture_compression_rgtc), _extension(EXT,texture_filter_anisotropic), + _extension(EXT,texture_norm16), _extension(OES,texture_float_linear), #ifndef MAGNUM_TARGET_GLES2 _extension(OVR,multiview2), @@ -349,6 +350,7 @@ constexpr Extension ExtensionList[]{ _extension(EXT,texture_filter_anisotropic), _extension(EXT,texture_format_BGRA8888), #ifndef MAGNUM_TARGET_GLES2 + _extension(EXT,texture_norm16), _extension(EXT,texture_sRGB_R8), #endif #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/GL/Context.h b/src/Magnum/GL/Context.h index 2d609f6db..c2e7efb8c 100644 --- a/src/Magnum/GL/Context.h +++ b/src/Magnum/GL/Context.h @@ -58,7 +58,7 @@ namespace Implementation { #ifndef MAGNUM_TARGET_GLES 192 #elif !defined(MAGNUM_TARGET_WEBGL) - 144 + 160 #else 48 #endif diff --git a/src/Magnum/GL/Extensions.h b/src/Magnum/GL/Extensions.h index a9d7c0c27..dca431138 100644 --- a/src/Magnum/GL/Extensions.h +++ b/src/Magnum/GL/Extensions.h @@ -299,7 +299,10 @@ namespace ANGLE { _extension(11,EXT,texture_compression_bptc, GLES200, None) // #39 #ifndef MAGNUM_TARGET_GLES2 _extension(12,EXT,clip_cull_distance, GLES300, None) // #43 - _extension(13,EXT,draw_buffers_indexed, GLES300, None) // #45 + #endif + _extension(13,EXT,texture_norm16, GLES200, None) // #44 + #ifndef MAGNUM_TARGET_GLES2 + _extension(14,EXT,draw_buffers_indexed, GLES300, None) // #45 #endif } namespace OES { #ifdef MAGNUM_TARGET_GLES2 @@ -436,108 +439,109 @@ namespace ANDROID { _extension( 59,EXT,texture_buffer, GLES310, GLES320) // #183 _extension( 60,EXT,texture_cube_map_array, GLES310, GLES320) // #184 _extension( 61,EXT,primitive_bounding_box, GLES310, GLES320) // #186 - _extension( 62,EXT,texture_sRGB_R8, GLES300, None) // #221 - _extension( 63,EXT,texture_sRGB_RG8, GLES300, None) // #223 + _extension( 62,EXT,texture_norm16, GLES310, None) // #207 + _extension( 63,EXT,texture_sRGB_R8, GLES300, None) // #221 + _extension( 64,EXT,texture_sRGB_RG8, GLES300, None) // #223 #endif - _extension( 64,EXT,polygon_offset_clamp, GLES200, None) // #252 + _extension( 65,EXT,polygon_offset_clamp, GLES200, None) // #252 #ifndef MAGNUM_TARGET_GLES2 - _extension( 65,EXT,clip_cull_distance, GLES300, None) // #257 - _extension( 66,EXT,texture_compression_rgtc, GLES300, None) // #286 - _extension( 67,EXT,texture_compression_bptc, GLES300, None) // #287 + _extension( 66,EXT,clip_cull_distance, GLES300, None) // #257 + _extension( 67,EXT,texture_compression_rgtc, GLES300, None) // #286 + _extension( 68,EXT,texture_compression_bptc, GLES300, None) // #287 #endif - _extension( 68,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289 + _extension( 69,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289 } namespace IMG { - _extension( 69,IMG,texture_compression_pvrtc, GLES200, None) // #54 + _extension( 70,IMG,texture_compression_pvrtc, GLES200, None) // #54 } namespace KHR { - _extension( 70,KHR,texture_compression_astc_ldr,GLES200, GLES320) // #117 - _extension( 71,KHR,texture_compression_astc_hdr,GLES200, None) // #117 - _extension( 72,KHR,debug, GLES200, GLES320) // #118 - _extension( 73,KHR,blend_equation_advanced, GLES200, GLES320) // #168 - _extension( 74,KHR,blend_equation_advanced_coherent, GLES200, None) // #168 - _extension( 75,KHR,robustness, GLES200, GLES320) // #170 - _extension( 76,KHR,robust_buffer_access_behavior, GLES200, GLES320) // #189 - _extension( 77,KHR,context_flush_control, GLES200, None) // #191 - _extension( 78,KHR,no_error, GLES200, None) // #243 - _extension( 79,KHR,texture_compression_astc_sliced_3d, GLES200, None) // #249 + _extension( 80,KHR,texture_compression_astc_ldr,GLES200, GLES320) // #117 + _extension( 81,KHR,texture_compression_astc_hdr,GLES200, None) // #117 + _extension( 82,KHR,debug, GLES200, GLES320) // #118 + _extension( 83,KHR,blend_equation_advanced, GLES200, GLES320) // #168 + _extension( 84,KHR,blend_equation_advanced_coherent, GLES200, None) // #168 + _extension( 85,KHR,robustness, GLES200, GLES320) // #170 + _extension( 86,KHR,robust_buffer_access_behavior, GLES200, GLES320) // #189 + _extension( 87,KHR,context_flush_control, GLES200, None) // #191 + _extension( 88,KHR,no_error, GLES200, None) // #243 + _extension( 89,KHR,texture_compression_astc_sliced_3d, GLES200, None) // #249 } namespace NV { #ifdef MAGNUM_TARGET_GLES2 - _extension( 80,NV,draw_buffers, GLES200, GLES300) // #91 - _extension( 81,NV,fbo_color_attachments, GLES200, GLES300) // #92 - _extension( 82,NV,read_buffer, GLES200, GLES300) // #93 - #endif - _extension( 83,NV,read_buffer_front, GLES200, None) // #93 - _extension( 84,NV,read_depth, GLES200, None) // #94 - _extension( 85,NV,read_stencil, GLES200, None) // #94 - _extension( 86,NV,read_depth_stencil, GLES200, None) // #94 + _extension(100,NV,draw_buffers, GLES200, GLES300) // #91 + _extension(101,NV,fbo_color_attachments, GLES200, GLES300) // #92 + _extension(102,NV,read_buffer, GLES200, GLES300) // #93 + #endif + _extension(103,NV,read_buffer_front, GLES200, None) // #93 + _extension(104,NV,read_depth, GLES200, None) // #94 + _extension(105,NV,read_stencil, GLES200, None) // #94 + _extension(106,NV,read_depth_stencil, GLES200, None) // #94 #ifdef MAGNUM_TARGET_GLES2 - _extension( 87,NV,pack_subimage, GLES200, GLES300) // #132 - _extension( 88,NV,draw_instanced, GLES200, GLES300) // #141 - _extension( 89,NV,framebuffer_blit, GLES200, GLES300) // #142 - _extension( 90,NV,framebuffer_multisample, GLES200, GLES300) // #143 - _extension( 91,NV,instanced_arrays, GLES200, GLES300) // #145 - _extension( 92,NV,shadow_samplers_array, GLES200, GLES300) // #146 - _extension( 93,NV,shadow_samplers_cube, GLES200, GLES300) // #147 - #endif - _extension( 94,NV,texture_border_clamp, GLES200, None) // #149 + _extension(107,NV,pack_subimage, GLES200, GLES300) // #132 + _extension(108,NV,draw_instanced, GLES200, GLES300) // #141 + _extension(109,NV,framebuffer_blit, GLES200, GLES300) // #142 + _extension(110,NV,framebuffer_multisample, GLES200, GLES300) // #143 + _extension(111,NV,instanced_arrays, GLES200, GLES300) // #145 + _extension(112,NV,shadow_samplers_array, GLES200, GLES300) // #146 + _extension(113,NV,shadow_samplers_cube, GLES200, GLES300) // #147 + #endif + _extension(114,NV,texture_border_clamp, GLES200, None) // #149 #ifndef MAGNUM_TARGET_GLES2 - _extension( 95,NV,shader_noperspective_interpolation, GLES300, None) // #201 + _extension(115,NV,shader_noperspective_interpolation, GLES300, None) // #201 #endif - _extension( 96,NV,sample_locations, GLES200, None) // #235 - _extension( 97,NV,polygon_mode, GLES200, None) // #238 + _extension(116,NV,sample_locations, GLES200, None) // #235 + _extension(117,NV,polygon_mode, GLES200, None) // #238 #ifndef MAGNUM_TARGET_GLES2 - _extension( 98,NV,fragment_shader_barycentric, GLES320, None) // #316 + _extension(118,NV,fragment_shader_barycentric, GLES320, None) // #316 #endif } namespace OES { #ifdef MAGNUM_TARGET_GLES2 - _extension(100,OES,depth24, GLES200, GLES300) // #24 + _extension(120,OES,depth24, GLES200, GLES300) // #24 #endif - _extension(101,OES,depth32, GLES200, None) // #25 + _extension(121,OES,depth32, GLES200, None) // #25 #ifdef MAGNUM_TARGET_GLES2 - _extension(102,OES,element_index_uint, GLES200, GLES300) // #26 - _extension(103,OES,fbo_render_mipmap, GLES200, GLES300) // #27 + _extension(122,OES,element_index_uint, GLES200, GLES300) // #26 + _extension(123,OES,fbo_render_mipmap, GLES200, GLES300) // #27 #endif - _extension(104,OES,mapbuffer, GLES200, None) // #29 + _extension(124,OES,mapbuffer, GLES200, None) // #29 #ifdef MAGNUM_TARGET_GLES2 - _extension(105,OES,rgb8_rgba8, GLES200, GLES300) // #30 + _extension(125,OES,rgb8_rgba8, GLES200, GLES300) // #30 #endif - _extension(106,OES,stencil1, GLES200, None) // #31 - _extension(107,OES,stencil4, GLES200, None) // #32 + _extension(126,OES,stencil1, GLES200, None) // #31 + _extension(127,OES,stencil4, GLES200, None) // #32 #ifdef MAGNUM_TARGET_GLES2 - _extension(108,OES,texture_3D, GLES200, GLES300) // #34 - _extension(109,OES,texture_half_float_linear, GLES200, GLES300) // #35 + _extension(128,OES,texture_3D, GLES200, GLES300) // #34 + _extension(129,OES,texture_half_float_linear, GLES200, GLES300) // #35 #endif - _extension(110,OES,texture_float_linear, GLES200, None) // #35 + _extension(130,OES,texture_float_linear, GLES200, None) // #35 #ifdef MAGNUM_TARGET_GLES2 - _extension(111,OES,texture_half_float, GLES200, GLES300) // #36 - _extension(112,OES,texture_float, GLES200, GLES300) // #36 - _extension(113,OES,texture_npot, GLES200, GLES300) // #37 - _extension(114,OES,vertex_half_float, GLES200, GLES300) // #38 - _extension(115,OES,packed_depth_stencil, GLES200, GLES300) // #43 - _extension(116,OES,depth_texture, GLES200, GLES300) // #44 - _extension(117,OES,standard_derivatives, GLES200, GLES300) // #45 - _extension(118,OES,vertex_array_object, GLES200, GLES300) // #71 - _extension(119,OES,required_internalformat, GLES200, GLES300) // #115 - _extension(120,OES,surfaceless_context, GLES200, GLES300) // #116 + _extension(131,OES,texture_half_float, GLES200, GLES300) // #36 + _extension(132,OES,texture_float, GLES200, GLES300) // #36 + _extension(133,OES,texture_npot, GLES200, GLES300) // #37 + _extension(134,OES,vertex_half_float, GLES200, GLES300) // #38 + _extension(135,OES,packed_depth_stencil, GLES200, GLES300) // #43 + _extension(136,OES,depth_texture, GLES200, GLES300) // #44 + _extension(137,OES,standard_derivatives, GLES200, GLES300) // #45 + _extension(138,OES,vertex_array_object, GLES200, GLES300) // #71 + _extension(139,OES,required_internalformat, GLES200, GLES300) // #115 + _extension(140,OES,surfaceless_context, GLES200, GLES300) // #116 #endif #ifndef MAGNUM_TARGET_GLES2 - _extension(121,OES,texture_compression_astc, GLES300, None) // #162 - _extension(122,OES,sample_shading, GLES300, GLES320) // #169 - _extension(123,OES,sample_variables, GLES300, GLES320) // #170 - _extension(124,OES,shader_image_atomic, GLES310, GLES320) // #171 - _extension(125,OES,shader_multisample_interpolation, GLES300, GLES320) // #172 + _extension(141,OES,texture_compression_astc, GLES300, None) // #162 + _extension(142,OES,sample_shading, GLES300, GLES320) // #169 + _extension(143,OES,sample_variables, GLES300, GLES320) // #170 + _extension(144,OES,shader_image_atomic, GLES310, GLES320) // #171 + _extension(145,OES,shader_multisample_interpolation, GLES300, GLES320) // #172 #endif - _extension(126,OES,texture_stencil8, GLES200, GLES320) // #173 + _extension(146,OES,texture_stencil8, GLES200, GLES320) // #173 #ifndef MAGNUM_TARGET_GLES2 - _extension(127,OES,texture_storage_multisample_2d_array, GLES310, GLES320) // #174 + _extension(147,OES,texture_storage_multisample_2d_array, GLES310, GLES320) // #174 #endif } namespace OVR { #ifndef MAGNUM_TARGET_GLES2 - _extension(128,OVR,multiview, GLES300, None) // #241 - _extension(129,OVR,multiview2, GLES300, None) // #242 + _extension(148,OVR,multiview, GLES300, None) // #241 + _extension(149,OVR,multiview2, GLES300, None) // #242 #endif } namespace MAGNUM { #ifndef MAGNUM_TARGET_GLES2 - _extension(130,MAGNUM,shader_vertex_id, GLES300, GLES300) + _extension(150,MAGNUM,shader_vertex_id, GLES300, GLES300) #endif } #endif diff --git a/src/Magnum/GL/Implementation/pixelFormatMapping.hpp b/src/Magnum/GL/Implementation/pixelFormatMapping.hpp index dde17a53e..4a1e25aa7 100644 --- a/src/Magnum/GL/Implementation/pixelFormatMapping.hpp +++ b/src/Magnum/GL/Implementation/pixelFormatMapping.hpp @@ -115,11 +115,17 @@ _n(RG16Unorm, LuminanceAlpha, UnsignedShort) _n(RGB16Unorm, RGB, UnsignedShort) _n(RGBA16Unorm, RGBA, UnsignedShort) #endif -#ifndef MAGNUM_TARGET_GLES +/* Available everywhere except ES2 (WebGL 1 has it) */ +#ifndef MAGNUM_TARGET_GLES2 _c(R16Snorm, Red, Short, R16Snorm) _c(RG16Snorm, RG, Short, RG16Snorm) _c(RGB16Snorm, RGB, Short, RGB16Snorm) _c(RGBA16Snorm, RGBA, Short, RGBA16Snorm) +#elif defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL) +_c(R16Snorm, Luminance, Short, R16Snorm) +_c(RG16Snorm, LuminanceAlpha, Short, RG16Snorm) +_c(RGB16Snorm, RGB, Short, RGB16Snorm) +_c(RGBA16Snorm, RGBA, Short, RGBA16Snorm) #else _s(R16Snorm) _s(RG16Snorm) diff --git a/src/Magnum/GL/PixelFormat.cpp b/src/Magnum/GL/PixelFormat.cpp index 9b08bfb76..2f38b75f4 100644 --- a/src/Magnum/GL/PixelFormat.cpp +++ b/src/Magnum/GL/PixelFormat.cpp @@ -135,7 +135,8 @@ UnsignedInt pixelSize(const PixelFormat format, const PixelType type) { #endif size = 1; break; case PixelType::UnsignedShort: - #ifndef MAGNUM_TARGET_GLES2 + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) case PixelType::Short: #endif case PixelType::Half: @@ -344,7 +345,8 @@ Debug& operator<<(Debug& debug, const PixelType value) { _c(Byte) #endif _c(UnsignedShort) - #ifndef MAGNUM_TARGET_GLES2 + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) _c(Short) #endif _c(UnsignedInt) diff --git a/src/Magnum/GL/PixelFormat.h b/src/Magnum/GL/PixelFormat.h index 933e97930..f98799982 100644 --- a/src/Magnum/GL/PixelFormat.h +++ b/src/Magnum/GL/PixelFormat.h @@ -369,24 +369,28 @@ enum class PixelType: GLenum { /** * Each component unsigned short. - * @requires_gles30 For texture data only, extension @gl_extension{OES,depth_texture} - * or @gl_extension{ANGLE,depth_texture} in OpenGL ES 2.0. - * @requires_gl Can't be used for framebuffer reading in OpenGL ES or - * WebGL. - * @requires_webgl20 For texture data only, extension - * @webgl_extension{WEBGL,depth_texture} in WebGL 1.0. + * @requires_gles30 Extension @gl_extension{OES,depth_texture} + * or @gl_extension{ANGLE,depth_texture} in OpenGL ES 2.0 for depth + * texture data + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * for color texture data + * @requires_webgl20 Extension @webgl_extension{WEBGL,depth_texture} in + * WebGL 1.0 for depth texture data + * @requires_webgl_extension @webgl_extension{EXT,texture_norm16} for color + * texture data */ UnsignedShort = GL_UNSIGNED_SHORT, - #ifndef MAGNUM_TARGET_GLES2 + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) /** * Each component signed short. * @requires_gl Can't be used for framebuffer reading in OpenGL ES or * WebGL. * @requires_gles30 For texture data only, only @ref PixelType::UnsignedShort * is available in OpenGL ES 2.0. - * @requires_webgl20 For texture data only, only @ref PixelType::UnsignedShort - * is available in WebGL 1.0. + * @requires_webgl20 For texture data only, @webgl_extension{EXT,texture_norm16} + * in WebGL 1.0. */ Short = GL_SHORT, #endif diff --git a/src/Magnum/GL/RenderbufferFormat.h b/src/Magnum/GL/RenderbufferFormat.h index c1c7160e0..7a63541f5 100644 --- a/src/Magnum/GL/RenderbufferFormat.h +++ b/src/Magnum/GL/RenderbufferFormat.h @@ -125,38 +125,60 @@ enum class RenderbufferFormat: GLenum { #endif #endif - #ifndef MAGNUM_TARGET_GLES + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) /** * Red component, normalized unsigned short. * @requires_gl30 Extension @gl_extension{ARB,texture_rg} - * @requires_gl Only byte-sized normalized formats (such as - * @ref RenderbufferFormat::R8) are available in OpenGL ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats (such as + * @ref RenderbufferFormat::RG8) are available in OpenGL ES 3.0 and + * older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES R16 = GL_R16, + #else + R16 = GL_R16_EXT, + #endif /** * Red and green component, each normalized unsigned short. * @requires_gl30 Extension @gl_extension{ARB,texture_rg} - * @requires_gl Only byte-sized normalized formats (such as - * @ref RenderbufferFormat::RG8) are available in OpenGL ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats (such as + * @ref RenderbufferFormat::RG8) are available in OpenGL ES 3.0 and + * older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RG16 = GL_RG16, + #else + RG16 = GL_RG16_EXT, + #endif + #ifndef MAGNUM_TARGET_GLES /** * RGB, each component normalized unsigned short. - * @requires_gl Only byte-sized normalized formats (such as - * @ref RenderbufferFormat::RGBA8) are available in OpenGL ES and - * WebGL. + * @requires_gl Three-component formats are not renderable in OpenGL ES + * or WebGL. */ RGB16 = GL_RGB16, + #endif /** * RGBA, each component normalized unsigned short. - * @requires_gl Only byte-sized normalized formats (such as - * @ref RenderbufferFormat::RGBA8) are available in OpenGL ES and - * WebGL. + * @requires_gles31 Only byte-sized normalized formats (such as + * @ref RenderbufferFormat::RG8) are available in OpenGL ES 3.0 and + * older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RGBA16 = GL_RGBA16, + #else + RGBA16 = GL_RGBA16_EXT, + #endif #endif #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/GL/TextureFormat.cpp b/src/Magnum/GL/TextureFormat.cpp index 0d43c2665..b482fd077 100644 --- a/src/Magnum/GL/TextureFormat.cpp +++ b/src/Magnum/GL/TextureFormat.cpp @@ -87,7 +87,7 @@ Debug& operator<<(Debug& debug, const TextureFormat value) { _c(RGB8Snorm) _c(RGBA8Snorm) #endif - #ifndef MAGNUM_TARGET_GLES + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) _c(R16) _c(RG16) _c(RGB16) diff --git a/src/Magnum/GL/TextureFormat.h b/src/Magnum/GL/TextureFormat.h index 83ebac678..934a8fcde 100644 --- a/src/Magnum/GL/TextureFormat.h +++ b/src/Magnum/GL/TextureFormat.h @@ -331,68 +331,117 @@ enum class TextureFormat: GLenum { RGBA8Snorm = GL_RGBA8_SNORM, #endif - #ifndef MAGNUM_TARGET_GLES + /* Available everywhere except ES2 (WebGL 1 has it) */ + #if !(defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)) /** * Red component, normalized unsigned short. * @requires_gl30 Extension @gl_extension{ARB,texture_rg} - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles30 Only byte-sized normalized formats are available in + * OpenGL ES 2.0 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES R16 = GL_R16, + #else + R16 = GL_R16_EXT, + #endif /** * Red and green component, each normalized unsigned short. * @requires_gl30 Extension @gl_extension{ARB,texture_rg} - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats are available in + * OpenGL ES 3.0 and older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RG16 = GL_RG16, + #else + RG16 = GL_RG16_EXT, + #endif /** * RGB, each component normalized unsigned short. - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats are available in + * OpenGL ES 3.0 and older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RGB16 = GL_RGB16, + #else + RGB16 = GL_RGB16_EXT, + #endif /** * RGBA, each component normalized unsigned short. - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats are available in + * OpenGL ES 3.0 and older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RGBA16 = GL_RGBA16, + #else + RGBA16 = GL_RGBA16_EXT, + #endif /** * Red component, normalized signed short. * @requires_gl31 Extension @gl_extension{EXT,texture_snorm} - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats are available in + * OpenGL ES 3.0 and older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES R16Snorm = GL_R16_SNORM, + #else + R16Snorm = GL_R16_SNORM_EXT, + #endif /** * Red and green component, each normalized signed short. * @requires_gl31 Extension @gl_extension{EXT,texture_snorm} - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats are available in + * OpenGL ES 3.0 and older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RG16Snorm = GL_RG16_SNORM, + #else + RG16Snorm = GL_RG16_SNORM_EXT, + #endif /** * RGB, each component normalized signed short. * @requires_gl31 Extension @gl_extension{EXT,texture_snorm} - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats are available in + * OpenGL ES 3.0 and older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RGB16Snorm = GL_RGB16_SNORM, + #else + RGB16Snorm = GL_RGB16_SNORM_EXT, + #endif /** * RGBA, each component normalized signed short. * @requires_gl31 Extension @gl_extension{EXT,texture_snorm} - * @requires_gl Only byte-sized normalized formats are available in OpenGL - * ES and WebGL. + * @requires_gles31 Only byte-sized normalized formats are available in + * OpenGL ES 3.0 and older; not defined on ES2 + * @requires_es_extension OpenGL ES 3.1 and @gl_extension{EXT,texture_norm16} + * @requires_webgl_extension Extension @webgl_extension{EXT,texture_norm16} */ + #ifndef MAGNUM_TARGET_GLES RGBA16Snorm = GL_RGBA16_SNORM, + #else + RGBA16Snorm = GL_RGBA16_SNORM_EXT, + #endif #endif #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt b/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt index 7b6942cb3..01e6368c2 100644 --- a/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES2/Emscripten/extensions.txt @@ -25,6 +25,7 @@ extension EXT_texture_filter_anisotropic optional extension EXT_disjoint_timer_query optional extension EXT_texture_compression_rgtc optional extension EXT_texture_compression_bptc optional +extension EXT_texture_norm16 optional # These are used as a base for WEBGL_* extensions extension EXT_color_buffer_float optional extension EXT_texture_compression_s3tc optional diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h b/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h index f9d652067..0fba0ae1d 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h @@ -506,6 +506,17 @@ typedef khronos_uint64_t GLuint64; #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F +/* GL_EXT_texture_norm16 */ + +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_RGBA16_EXT 0x805B +#define GL_RGB16_EXT 0x8054 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGBA16_SNORM_EXT 0x8F9B + /* GL_EXT_texture_compression_s3tc */ #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 diff --git a/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt b/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt index 12432ba45..8de829ec4 100644 --- a/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt @@ -11,6 +11,7 @@ extension EXT_color_buffer_float optional extension EXT_texture_compression_rgtc optional extension EXT_texture_compression_bptc optional extension EXT_clip_cull_distance optional +extension EXT_texture_norm16 optional extension EXT_draw_buffers_indexed optional # WebGL has only OVR_multiview2, but we need the definitions from OVR_multiview extension OVR_multiview optional diff --git a/src/MagnumExternal/OpenGL/GLES3/extensions.txt b/src/MagnumExternal/OpenGL/GLES3/extensions.txt index 83dbeb272..8185431be 100644 --- a/src/MagnumExternal/OpenGL/GLES3/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES3/extensions.txt @@ -17,6 +17,7 @@ extension EXT_texture_border_clamp optional extension EXT_texture_buffer optional extension EXT_texture_cube_map_array optional extension EXT_primitive_bounding_box optional +extension EXT_texture_norm16 optional # extension KHR_texture_compression_astc_ldr optional extension KHR_debug optional extension KHR_blend_equation_advanced optional diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGL.h b/src/MagnumExternal/OpenGL/GLES3/flextGL.h index d4b769e89..e586a7b92 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGL.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGL.h @@ -1304,6 +1304,17 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen #define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE +/* GL_EXT_texture_norm16 */ + +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_RGBA16_EXT 0x805B +#define GL_RGB16_EXT 0x8054 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGBA16_SNORM_EXT 0x8F9B + /* GL_KHR_debug */ #define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h b/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h index a1663a5d7..a67942352 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h @@ -759,6 +759,17 @@ typedef struct __GLsync *GLsync; #define GL_CLIP_DISTANCE6_EXT 0x3006 #define GL_CLIP_DISTANCE7_EXT 0x3007 +/* GL_EXT_texture_norm16 */ + +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_RGBA16_EXT 0x805B +#define GL_RGB16_EXT 0x8054 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGBA16_SNORM_EXT 0x8F9B + /* GL_EXT_draw_buffers_indexed */ #define GL_BLEND_EQUATION_RGB 0x8009 diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h index c117abe4c..378b3d744 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h @@ -1296,6 +1296,17 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen #define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE +/* GL_EXT_texture_norm16 */ + +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_RGBA16_EXT 0x805B +#define GL_RGB16_EXT 0x8054 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGBA16_SNORM_EXT 0x8F9B + /* GL_KHR_debug */ #define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242