From d366e0e7a01f651569df58bb0fd0fea450c0d75b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 29 Apr 2020 20:19:32 +0200 Subject: [PATCH] GL: exposed clip / cull distance APIs. --- doc/changelog.dox | 5 + doc/opengl-mapping.dox | 6 +- doc/opengl-support.dox | 5 +- src/Magnum/GL/Context.cpp | 3 + src/Magnum/GL/Extensions.h | 19 +- src/Magnum/GL/Implementation/RendererState.h | 6 + src/Magnum/GL/Renderer.cpp | 81 ++++++ src/Magnum/GL/Renderer.h | 236 +++++++++++++++++- src/Magnum/Platform/gl-info.cpp | 21 ++ .../OpenGL/GLES2/extensions.txt | 1 + src/MagnumExternal/OpenGL/GLES2/flextGL.h | 12 + .../OpenGL/GLES2/flextGLWindowsDesktop.h | 12 + .../OpenGL/GLES3/Emscripten/extensions.txt | 1 + .../OpenGL/GLES3/extensions.txt | 1 + src/MagnumExternal/OpenGL/GLES3/flextGL.h | 14 ++ .../OpenGL/GLES3/flextGLEmscripten.h | 14 ++ .../OpenGL/GLES3/flextGLWindowsDesktop.h | 14 ++ 17 files changed, 438 insertions(+), 13 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 271c73642..192d5bf67 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -93,6 +93,11 @@ See also: @gl_extension{ARB,tessellation_shader} / @gl_extension{EXT,tessellation_shader} support (see [mosra/magnum#164](https://github.com/mosra/magnum/issues/164)) - Implemented @ref GL::PipelineStatisticsQuery from GL 4.6 +- Implemented @ref GL:Renderer::Feature::ClipDistance0 through + @ref GL:Renderer::Feature::ClipDistance7 and related limit queries as well + as exposing the @gl_extension{APPLE,clip_distance} / + @gl_extension{EXT,clip_cull_distance} ES and + @webgl_extension{EXT,clip_cull_distance} WebGL extensions - Recognizing @gl_extension{AMD,shader_explicit_vertex_parameter} desktop and @gl_extension{NV,fragment_shader_barycentric} desktop / ES extensions. These add only shading language features. diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index c8b5431cd..c103a9b30 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -469,10 +469,10 @@ glGet() parameter | Matching API @def_gl{MAX_3D_TEXTURE_SIZE}, \n @def_gl{MAX_ARRAY_TEXTURE_LAYERS}, \n @def_gl{MAX_CUBE_MAP_TEXTURE_SIZE}, \n @def_gl{MAX_RECTANGLE_TEXTURE_SIZE}, \n @def_gl{MAX_TEXTURE_SIZE} | @ref GL::Texture::maxSize(), \n @ref GL::TextureArray::maxSize(), \n @ref GL::CubeMapTexture::maxSize(), \n @ref GL::CubeMapTextureArray::maxSize(), \n @ref GL::RectangleTexture::maxSize(), \n @ref GL::BufferTexture::maxSize(), \n @ref GL::MultisampleTexture::maxSize() @def_gl{MAX_ATOMIC_COUNTER_BUFFER_SIZE} | @ref GL::AbstractShaderProgram::maxAtomicCounterBufferSize() @def_gl{MAX_ATOMIC_COUNTER_BUFFER_BINDINGS} | @ref GL::Buffer::maxAtomicCounterBindings() -@def_gl{MAX_CLIP_DISTANCES} | | +@def_gl{MAX_CLIP_DISTANCES} | @ref GL::Renderer::maxClipDistances() @def_gl{MAX_COLOR_ATTACHMENTS} | @ref GL::Framebuffer::maxColorAttachments() @def_gl{MAX_COLOR_TEXTURE_SAMPLES}, \n @def_gl{MAX_DEPTH_TEXTURE_SAMPLES}, \n @def_gl{MAX_INTEGER_SAMPLES} | @ref GL::AbstractTexture::maxColorSamples(), \n @ref GL::AbstractTexture::maxDepthSamples(), \n @ref GL::AbstractTexture::maxIntegerSamples() -@def_gl{MAX_COMBINED_CLIP_AND_CULL_DISTANCES} | | +@def_gl{MAX_COMBINED_CLIP_AND_CULL_DISTANCES} | @ref GL::Renderer::maxCombinedClipAndCullDistances() @def_gl{MAX_COMBINED_SHADER_OUTPUT_RESOURCES} | @ref GL::AbstractShaderProgram::maxCombinedShaderOutputResources() @def_gl_extension{MAX_COMPUTE_FIXED_GROUP_INVOCATIONS,ARB,compute_variable_group_size} | | @def_gl_extension{MAX_COMPUTE_FIXED_GROUP_SIZE,ARB,compute_variable_group_size} | | @@ -482,7 +482,7 @@ glGet() parameter | Matching API @def_gl{MAX_COMPUTE_WORK_GROUP_COUNT} | @ref GL::AbstractShaderProgram::maxComputeWorkGroupCount() @def_gl{MAX_COMPUTE_WORK_GROUP_INVOCATIONS} | @ref GL::AbstractShaderProgram::maxComputeWorkGroupInvocations() @def_gl{MAX_COMPUTE_WORK_GROUP_SIZE} | @ref GL::AbstractShaderProgram::maxComputeWorkGroupSize() -@def_gl{MAX_CULL_DISTANCES} | | +@def_gl{MAX_CULL_DISTANCES} | @ref GL::Renderer::maxCullDistances() @def_gl{MAX_DEBUG_LOGGED_MESSAGES} | @ref GL::DebugOutput::maxLoggedMessages() @def_gl{MAX_DEBUG_MESSAGE_LENGTH} | @ref GL::DebugOutput::maxMessageLength() @def_gl{MAX_DEBUG_GROUP_STACK_DEPTH} | @ref GL::DebugGroup::maxStackDepth() diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 626a7bd6c..c840889bb 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -248,7 +248,7 @@ GLSL 4.50 | done @gl_extension{ARB,ES3_1_compatibility} | done @gl_extension{ARB,clip_control} | | @gl_extension{ARB,conditional_render_inverted} | done -@gl_extension{ARB,cull_distance} | | +@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 (except VAOs) @gl_extension{ARB,get_texture_sub_image} | done @@ -448,6 +448,7 @@ Extension | Status @gl_extension2{ANGLE,texture_compression_dxt3,ANGLE_texture_compression_dxt} | done @gl_extension2{ANGLE,texture_compression_dxt5,ANGLE_texture_compression_dxt} | 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 @@ -470,6 +471,7 @@ Extension | Status @gl_extension{EXT,sRGB_R8} | done @gl_extension{EXT,sRGB_RG8} | 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 @@ -546,6 +548,7 @@ Extension | Status @webgl_extension{EXT,color_buffer_float} | | @webgl_extension{EXT,texture_compression_rgtc} | done @webgl_extension{EXT,texture_compression_bptc} | done +@webgl_extension{EXT,clip_cull_distance} | 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/Context.cpp b/src/Magnum/GL/Context.cpp index a1645823e..88284d14a 100644 --- a/src/Magnum/GL/Context.cpp +++ b/src/Magnum/GL/Context.cpp @@ -266,6 +266,7 @@ constexpr Extension ExtensionList[]{ _extension(EXT,texture_compression_rgtc), _extension(EXT,texture_compression_bptc), #ifndef MAGNUM_TARGET_GLES2 + _extension(EXT,clip_cull_distance), _extension(EXT,draw_buffers_indexed), #endif _extension(OES,texture_float_linear), @@ -309,6 +310,7 @@ constexpr Extension ExtensionList[]{ _extension(ANGLE,texture_compression_dxt3), _extension(ANGLE,texture_compression_dxt5), _extension(APPLE,texture_format_BGRA8888), + _extension(APPLE,clip_distance), _extension(ARM,shader_framebuffer_fetch), _extension(ARM,shader_framebuffer_fetch_depth_stencil), _extension(EXT,texture_filter_anisotropic), @@ -334,6 +336,7 @@ constexpr Extension ExtensionList[]{ #endif _extension(EXT,polygon_offset_clamp), #ifndef MAGNUM_TARGET_GLES2 + _extension(EXT,clip_cull_distance), _extension(EXT,texture_compression_rgtc), _extension(EXT,texture_compression_bptc), #endif diff --git a/src/Magnum/GL/Extensions.h b/src/Magnum/GL/Extensions.h index e18d13f83..309923aff 100644 --- a/src/Magnum/GL/Extensions.h +++ b/src/Magnum/GL/Extensions.h @@ -296,7 +296,8 @@ namespace ANGLE { _extension(10,EXT,texture_compression_rgtc, GLES200, None) // #38 _extension(11,EXT,texture_compression_bptc, GLES200, None) // #39 #ifndef MAGNUM_TARGET_GLES2 - _extension(12,EXT,draw_buffers_indexed, GLES300, None) // #45 + _extension(12,EXT,clip_cull_distance, GLES300, None) // #43 + _extension(13,EXT,draw_buffers_indexed, GLES300, None) // #45 #endif } namespace OES { #ifdef MAGNUM_TARGET_GLES2 @@ -359,12 +360,13 @@ namespace ANDROID { #ifdef MAGNUM_TARGET_GLES2 _extension( 11,APPLE,texture_max_level, GLES200, GLES300) // #80 #endif + _extension( 12,APPLE,clip_distance, GLES200, None) // #193 } namespace ARM { #ifdef MAGNUM_TARGET_GLES2 - _extension( 12,ARM,rgba8, GLES200, GLES300) // #82 + _extension( 13,ARM,rgba8, GLES200, GLES300) // #82 #endif - _extension( 13,ARM,shader_framebuffer_fetch, GLES200, None) // #165 - _extension( 14,ARM,shader_framebuffer_fetch_depth_stencil, GLES200, None) // #166 + _extension( 14,ARM,shader_framebuffer_fetch, GLES200, None) // #165 + _extension( 15,ARM,shader_framebuffer_fetch_depth_stencil, GLES200, None) // #166 } namespace EXT { _extension( 19,EXT,texture_filter_anisotropic, GLES200, None) // #41 #ifdef MAGNUM_TARGET_GLES2 @@ -437,12 +439,13 @@ namespace ANDROID { #endif _extension( 64,EXT,polygon_offset_clamp, GLES200, None) // #252 #ifndef MAGNUM_TARGET_GLES2 - _extension( 65,EXT,texture_compression_rgtc, GLES300, None) // #286 - _extension( 66,EXT,texture_compression_bptc, GLES300, None) // #287 + _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 #endif - _extension( 67,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289 + _extension( 68,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289 } namespace IMG { - _extension( 68,IMG,texture_compression_pvrtc, GLES200, None) // #54 + _extension( 69,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 diff --git a/src/Magnum/GL/Implementation/RendererState.h b/src/Magnum/GL/Implementation/RendererState.h index ef978041c..11f7de2ea 100644 --- a/src/Magnum/GL/Implementation/RendererState.h +++ b/src/Magnum/GL/Implementation/RendererState.h @@ -93,6 +93,12 @@ struct RendererState { #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) GLint maxPatchVertexCount{}; #endif + #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) + GLint maxClipDistances{}; + #endif + #ifndef MAGNUM_TARGET_GLES2 + GLint maxCullDistances{}, maxCombinedClipAndCullDistances{}; + #endif /* Bool parameter is ugly, but this is implementation detail of internal API so who cares */ diff --git a/src/Magnum/GL/Renderer.cpp b/src/Magnum/GL/Renderer.cpp index 6c2b5aec4..66b409b37 100644 --- a/src/Magnum/GL/Renderer.cpp +++ b/src/Magnum/GL/Renderer.cpp @@ -197,6 +197,87 @@ void Renderer::setPatchDefaultOuterLevel(const Vector4& levels) { } #endif +#if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) +UnsignedInt Renderer::maxClipDistances() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isVersionSupported(Version::GL300)) + return 0; + #elif defined(MAGNUM_TARGET_GLES2) + if(!Context::current().isExtensionSupported()) + return 0; + #else + if(!Context::current().isExtensionSupported()) + return 0; + #endif + + GLint& value = Context::current().state().renderer->maxClipDistances; + + /* Get the value, if not already cached */ + if(value == 0) + glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_CLIP_DISTANCES + #elif defined(MAGNUM_TARGET_GLES2) + GL_MAX_CLIP_DISTANCES_APPLE + #else + GL_MAX_CLIP_DISTANCES_EXT + #endif + , &value); + + return value; +} +#endif + +#ifndef MAGNUM_TARGET_GLES2 +UnsignedInt Renderer::maxCullDistances() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + return 0; + #else + if(!Context::current().isExtensionSupported()) + return 0; + #endif + + GLint& value = Context::current().state().renderer->maxCullDistances; + + /* Get the value, if not already cached */ + if(value == 0) + glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_CULL_DISTANCES + #else + GL_MAX_CULL_DISTANCES_EXT + #endif + , &value); + + return value; +} + +UnsignedInt Renderer::maxCombinedClipAndCullDistances() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + return 0; + #else + if(!Context::current().isExtensionSupported()) + return 0; + #endif + + GLint& value = Context::current().state().renderer->maxCombinedClipAndCullDistances; + + /* Get the value, if not already cached */ + if(value == 0) + glGetIntegerv( + #ifndef MAGNUM_TARGET_GLES + GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES + #else + GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT + #endif + , &value); + + return value; +} +#endif + void Renderer::setScissor(const Range2Di& rectangle) { glScissor(rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY()); } diff --git a/src/Magnum/GL/Renderer.h b/src/Magnum/GL/Renderer.h index c2d0b8e55..423fe5d55 100644 --- a/src/Magnum/GL/Renderer.h +++ b/src/Magnum/GL/Renderer.h @@ -50,7 +50,6 @@ namespace Implementation { struct RendererState; } @todo @gl_extension{ARB,viewport_array} @todo `GL_POINT_SIZE_GRANULARITY`, `GL_POINT_SIZE_RANGE` (?) @todo `GL_STEREO`, `GL_DOUBLEBUFFER` (?) -@todo `GL_MAX_CLIP_DISTANCES`... */ class MAGNUM_GL_EXPORT Renderer { friend Context; @@ -104,6 +103,192 @@ class MAGNUM_GL_EXPORT Renderer { */ Blending = GL_BLEND, + #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) + /** + * Clip geometry against user-defined half-space 0. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 0. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance0 = GL_CLIP_DISTANCE0, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance0 = GL_CLIP_DISTANCE0_APPLE, + #else + ClipDistance0 = GL_CLIP_DISTANCE0_EXT, + #endif + + /** + * Clip against user-defined half-space 1. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 1. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance1 = GL_CLIP_DISTANCE1, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance1 = GL_CLIP_DISTANCE1_APPLE, + #else + ClipDistance1 = GL_CLIP_DISTANCE1_EXT, + #endif + + /** + * Clip against user-defined half-space 2. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 2. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance2 = GL_CLIP_DISTANCE2, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance2 = GL_CLIP_DISTANCE2_APPLE, + #else + ClipDistance2 = GL_CLIP_DISTANCE2_EXT, + #endif + + /** + * Clip against user-defined half-space 3. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 3. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance3 = GL_CLIP_DISTANCE3, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance3 = GL_CLIP_DISTANCE3_APPLE, + #else + ClipDistance3 = GL_CLIP_DISTANCE3_EXT, + #endif + + /** + * Clip against user-defined half-space 4. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 4. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance4 = GL_CLIP_DISTANCE4, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance4 = GL_CLIP_DISTANCE4_APPLE, + #else + ClipDistance4 = GL_CLIP_DISTANCE4_EXT, + #endif + + /** + * Clip against user-defined half-space 5. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 5. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance5 = GL_CLIP_DISTANCE5, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance5 = GL_CLIP_DISTANCE5_APPLE, + #else + ClipDistance5 = GL_CLIP_DISTANCE5_EXT, + #endif + + /** + * Clip against user-defined half-space 6. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 6. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance6 = GL_CLIP_DISTANCE6, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance6 = GL_CLIP_DISTANCE6_APPLE, + #else + ClipDistance6 = GL_CLIP_DISTANCE6_EXT, + #endif + + /** + * Clip against user-defined half-space 7. This enables + * use of the @glsl gl_ClipDistance[] @ce / + * @glsl gl_CullDistance[] @ce GLSL builtin at index 7. + * @see @ref maxClipDistances(), @ref maxCullDistances(), + * @ref maxCombinedClipAndCullDistances() + * @requires_gl30 Shader-defined clip distances are not available + * in OpenGL 2.1. + * @requires_es_extension Extension + * @gl_extension{APPLE,clip_distance} or + * @gl_extension{EXT,clip_cull_distance} + * @requires_webgl_extension WebGL 2.0 and extension + * @webgl_extension{EXT,clip_cull_distance} + * @m_since_latest + */ + #ifndef MAGNUM_TARGET_GLES + ClipDistance7 = GL_CLIP_DISTANCE7, + #elif defined(MAGNUM_TARGET_GLES2) + ClipDistance7 = GL_CLIP_DISTANCE7_APPLE, + #else + ClipDistance7 = GL_CLIP_DISTANCE7_EXT, + #endif + #endif + #ifndef MAGNUM_TARGET_WEBGL /** * Debug output. Disabled by default unless the GL context was @@ -756,6 +941,55 @@ class MAGNUM_GL_EXPORT Renderer { static void setPatchDefaultOuterLevel(const Vector4& levels); #endif + #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) + /** + * @brief Max supported clip distance count + * @m_since_latest + * + * The result is cached, repeated queries don't result in repeated + * OpenGL calls. If neither OpenGL 3.0 nor + * @gl_extension{APPLE,clip_distance} / + * @gl_extension{EXT,clip_cull_distance} ES extension nor + * @webgl_extension{EXT,clip_cull_distance} WebGL extension is + * available, returns @cpp 0 @ce. + * @see @fn_gl{Get} with @def_gl_keyword{MAX_CLIP_DISTANCES} + * @requires_webgl20 Not defined in WebGL 1.0 builds. + */ + static UnsignedInt maxClipDistances(); + #endif + + #ifndef MAGNUM_TARGET_GLES2 + /** + * @brief Max supported cull distance count + * @m_since_latest + * + * The result is cached, repeated queries don't result in repeated + * OpenGL calls. If neither @gl_extension{ARB,cull_distance} (part of + * OpenGL 4.5) nor @gl_extension{EXT,clip_cull_distance} ES / + * @webgl_extension{EXT,clip_cull_distance} WebGL extension is + * available, returns @cpp 0 @ce. + * @see @fn_gl{Get} with @def_gl_keyword{MAX_CULL_DISTANCES} + * @requires_gles30 Not defined in OpenGL ES 2.0 builds. + * @requires_webgl20 Not defined in WebGL 1.0 builds. + */ + static UnsignedInt maxCullDistances(); + + /** + * @brief Max supported combined clip and cull distance count + * @m_since_latest + * + * The result is cached, repeated queries don't result in repeated + * OpenGL calls. If neither @gl_extension{ARB,cull_distance} (part of + * OpenGL 4.5) nor @gl_extension{EXT,clip_cull_distance} ES / + * @webgl_extension{EXT,clip_cull_distance} WebGL extension is + * available, returns @cpp 0 @ce. + * @see @fn_gl{Get} with @def_gl_keyword{MAX_COMBINED_CLIP_AND_CULL_DISTANCES} + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_webgl20 Not defined in WebGL 1.0 builds. + */ + static UnsignedInt maxCombinedClipAndCullDistances(); + #endif + /* Since 1.8.17, the original short-hand group closing doesn't work anymore. FFS. */ /** diff --git a/src/Magnum/Platform/gl-info.cpp b/src/Magnum/Platform/gl-info.cpp index f470fa8e0..07750fc72 100644 --- a/src/Magnum/Platform/gl-info.cpp +++ b/src/Magnum/Platform/gl-info.cpp @@ -417,6 +417,9 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat _l(GL::Mesh::maxElementsVertices()) #endif _lvec(GL::Renderer::lineWidthRange()) + #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) + _l(GL::Renderer::maxClipDistances()) + #endif _l(GL::Renderbuffer::maxSize()) #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) _l(GL::Renderbuffer::maxSamples()) @@ -461,6 +464,24 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat } #endif + #ifndef MAGNUM_TARGET_GLES2 + #ifndef MAGNUM_TARGET_GLES + if(c.isExtensionSupported()) + #else + if(c.isExtensionSupported()) + #endif + { + #ifndef MAGNUM_TARGET_GLES + _h(ARB::cull_distance) + #else + _h(EXT::clip_cull_distance) + #endif + + _l(GL::Renderer::maxCullDistances()) + _l(GL::Renderer::maxCombinedClipAndCullDistances()) + } + #endif + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) #ifndef MAGNUM_TARGET_GLES if(c.isExtensionSupported()) diff --git a/src/MagnumExternal/OpenGL/GLES2/extensions.txt b/src/MagnumExternal/OpenGL/GLES2/extensions.txt index 7e4ca5ee5..b1de39367 100644 --- a/src/MagnumExternal/OpenGL/GLES2/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES2/extensions.txt @@ -10,6 +10,7 @@ extension ANGLE_instanced_arrays optional extension ANGLE_depth_texture optional extension APPLE_framebuffer_multisample optional extension APPLE_texture_max_level optional +extension APPLE_clip_distance optional extension ARM_rgba8 optional extension EXT_texture_type_2_10_10_10_REV optional extension EXT_discard_framebuffer optional diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGL.h b/src/MagnumExternal/OpenGL/GLES2/flextGL.h index 0404048b5..c03f89fdd 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGL.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGL.h @@ -452,6 +452,18 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen #define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +/* GL_APPLE_clip_distance */ + +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 + /* GL_EXT_texture_type_2_10_10_10_REV */ #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h index 76865a0c5..8ddc6549c 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h @@ -447,6 +447,18 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen #define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +/* GL_APPLE_clip_distance */ + +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 + /* GL_EXT_texture_type_2_10_10_10_REV */ #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 diff --git a/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt b/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt index 9e8e9b8b8..12432ba45 100644 --- a/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt @@ -10,6 +10,7 @@ extension EXT_disjoint_timer_query optional 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_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 1fbecfa48..2a3fafed6 100644 --- a/src/MagnumExternal/OpenGL/GLES3/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES3/extensions.txt @@ -59,6 +59,7 @@ extension EXT_shader_integer_mix optional extension EXT_texture_sRGB_R8 optional extension EXT_texture_sRGB_RG8 optional extension EXT_polygon_offset_clamp optional +extension EXT_clip_cull_distance optional extension EXT_texture_compression_rgtc optional extension EXT_texture_compression_bptc optional extension EXT_texture_compression_s3tc_srgb optional diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGL.h b/src/MagnumExternal/OpenGL/GLES3/flextGL.h index 5e5a30b5f..aa3263a4d 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGL.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGL.h @@ -1567,6 +1567,20 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen #define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +/* GL_EXT_clip_cull_distance */ + +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 + /* GL_EXT_texture_compression_rgtc */ #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h b/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h index 3545cb2aa..419ba2fa5 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h @@ -745,6 +745,20 @@ typedef struct __GLsync *GLsync; #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F +/* GL_EXT_clip_cull_distance */ + +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 + /* 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 44a4dca5b..f415c414c 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h @@ -1559,6 +1559,20 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen #define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +/* GL_EXT_clip_cull_distance */ + +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 + /* GL_EXT_texture_compression_rgtc */ #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB