Browse Source

GL: exposed clip / cull distance APIs.

pull/427/merge
Vladimír Vondruš 6 years ago
parent
commit
d366e0e7a0
  1. 5
      doc/changelog.dox
  2. 6
      doc/opengl-mapping.dox
  3. 5
      doc/opengl-support.dox
  4. 3
      src/Magnum/GL/Context.cpp
  5. 19
      src/Magnum/GL/Extensions.h
  6. 6
      src/Magnum/GL/Implementation/RendererState.h
  7. 81
      src/Magnum/GL/Renderer.cpp
  8. 236
      src/Magnum/GL/Renderer.h
  9. 21
      src/Magnum/Platform/gl-info.cpp
  10. 1
      src/MagnumExternal/OpenGL/GLES2/extensions.txt
  11. 12
      src/MagnumExternal/OpenGL/GLES2/flextGL.h
  12. 12
      src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h
  13. 1
      src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt
  14. 1
      src/MagnumExternal/OpenGL/GLES3/extensions.txt
  15. 14
      src/MagnumExternal/OpenGL/GLES3/flextGL.h
  16. 14
      src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h
  17. 14
      src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h

5
doc/changelog.dox

@ -93,6 +93,11 @@ See also:
@gl_extension{ARB,tessellation_shader} / @gl_extension{EXT,tessellation_shader} @gl_extension{ARB,tessellation_shader} / @gl_extension{EXT,tessellation_shader}
support (see [mosra/magnum#164](https://github.com/mosra/magnum/issues/164)) support (see [mosra/magnum#164](https://github.com/mosra/magnum/issues/164))
- Implemented @ref GL::PipelineStatisticsQuery from GL 4.6 - 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 - Recognizing @gl_extension{AMD,shader_explicit_vertex_parameter} desktop
and @gl_extension{NV,fragment_shader_barycentric} desktop / ES extensions. and @gl_extension{NV,fragment_shader_barycentric} desktop / ES extensions.
These add only shading language features. These add only shading language features.

6
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_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_SIZE} | @ref GL::AbstractShaderProgram::maxAtomicCounterBufferSize()
@def_gl{MAX_ATOMIC_COUNTER_BUFFER_BINDINGS} | @ref GL::Buffer::maxAtomicCounterBindings() @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_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_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{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_INVOCATIONS,ARB,compute_variable_group_size} | |
@def_gl_extension{MAX_COMPUTE_FIXED_GROUP_SIZE,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_COUNT} | @ref GL::AbstractShaderProgram::maxComputeWorkGroupCount()
@def_gl{MAX_COMPUTE_WORK_GROUP_INVOCATIONS} | @ref GL::AbstractShaderProgram::maxComputeWorkGroupInvocations() @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_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_LOGGED_MESSAGES} | @ref GL::DebugOutput::maxLoggedMessages()
@def_gl{MAX_DEBUG_MESSAGE_LENGTH} | @ref GL::DebugOutput::maxMessageLength() @def_gl{MAX_DEBUG_MESSAGE_LENGTH} | @ref GL::DebugOutput::maxMessageLength()
@def_gl{MAX_DEBUG_GROUP_STACK_DEPTH} | @ref GL::DebugGroup::maxStackDepth() @def_gl{MAX_DEBUG_GROUP_STACK_DEPTH} | @ref GL::DebugGroup::maxStackDepth()

5
doc/opengl-support.dox

@ -248,7 +248,7 @@ GLSL 4.50 | done
@gl_extension{ARB,ES3_1_compatibility} | done @gl_extension{ARB,ES3_1_compatibility} | done
@gl_extension{ARB,clip_control} | | @gl_extension{ARB,clip_control} | |
@gl_extension{ARB,conditional_render_inverted} | done @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,derivative_control} | done (shading language only)
@gl_extension{ARB,direct_state_access} | done for implemented functionality (except VAOs) @gl_extension{ARB,direct_state_access} | done for implemented functionality (except VAOs)
@gl_extension{ARB,get_texture_sub_image} | done @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_dxt3,ANGLE_texture_compression_dxt} | done
@gl_extension2{ANGLE,texture_compression_dxt5,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,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} | missing renderer setup and limit query
@gl_extension{ARM,shader_framebuffer_fetch_depth_stencil} | done (shading language only) @gl_extension{ARM,shader_framebuffer_fetch_depth_stencil} | done (shading language only)
@gl_extension{EXT,texture_filter_anisotropic} | done @gl_extension{EXT,texture_filter_anisotropic} | done
@ -470,6 +471,7 @@ Extension | Status
@gl_extension{EXT,sRGB_R8} | done @gl_extension{EXT,sRGB_R8} | done
@gl_extension{EXT,sRGB_RG8} | done @gl_extension{EXT,sRGB_RG8} | done
@gl_extension{EXT,polygon_offset_clamp} | | @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_rgtc} | done
@gl_extension{EXT,texture_compression_bptc} | done @gl_extension{EXT,texture_compression_bptc} | done
@gl_extension{EXT,texture_compression_s3tc_srgb} | done @gl_extension{EXT,texture_compression_s3tc_srgb} | done
@ -546,6 +548,7 @@ Extension | Status
@webgl_extension{EXT,color_buffer_float} | | @webgl_extension{EXT,color_buffer_float} | |
@webgl_extension{EXT,texture_compression_rgtc} | done @webgl_extension{EXT,texture_compression_rgtc} | done
@webgl_extension{EXT,texture_compression_bptc} | done @webgl_extension{EXT,texture_compression_bptc} | done
@webgl_extension{EXT,clip_cull_distance} | done
@webgl_extension{EXT,draw_buffers_indexed} | done @webgl_extension{EXT,draw_buffers_indexed} | done
@webgl_extension{OES,texture_float_linear} | done @webgl_extension{OES,texture_float_linear} | done
@webgl_extension{OVR,multiview2} | | @webgl_extension{OVR,multiview2} | |

3
src/Magnum/GL/Context.cpp

@ -266,6 +266,7 @@ constexpr Extension ExtensionList[]{
_extension(EXT,texture_compression_rgtc), _extension(EXT,texture_compression_rgtc),
_extension(EXT,texture_compression_bptc), _extension(EXT,texture_compression_bptc),
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
_extension(EXT,clip_cull_distance),
_extension(EXT,draw_buffers_indexed), _extension(EXT,draw_buffers_indexed),
#endif #endif
_extension(OES,texture_float_linear), _extension(OES,texture_float_linear),
@ -309,6 +310,7 @@ constexpr Extension ExtensionList[]{
_extension(ANGLE,texture_compression_dxt3), _extension(ANGLE,texture_compression_dxt3),
_extension(ANGLE,texture_compression_dxt5), _extension(ANGLE,texture_compression_dxt5),
_extension(APPLE,texture_format_BGRA8888), _extension(APPLE,texture_format_BGRA8888),
_extension(APPLE,clip_distance),
_extension(ARM,shader_framebuffer_fetch), _extension(ARM,shader_framebuffer_fetch),
_extension(ARM,shader_framebuffer_fetch_depth_stencil), _extension(ARM,shader_framebuffer_fetch_depth_stencil),
_extension(EXT,texture_filter_anisotropic), _extension(EXT,texture_filter_anisotropic),
@ -334,6 +336,7 @@ constexpr Extension ExtensionList[]{
#endif #endif
_extension(EXT,polygon_offset_clamp), _extension(EXT,polygon_offset_clamp),
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
_extension(EXT,clip_cull_distance),
_extension(EXT,texture_compression_rgtc), _extension(EXT,texture_compression_rgtc),
_extension(EXT,texture_compression_bptc), _extension(EXT,texture_compression_bptc),
#endif #endif

19
src/Magnum/GL/Extensions.h

@ -296,7 +296,8 @@ namespace ANGLE {
_extension(10,EXT,texture_compression_rgtc, GLES200, None) // #38 _extension(10,EXT,texture_compression_rgtc, GLES200, None) // #38
_extension(11,EXT,texture_compression_bptc, GLES200, None) // #39 _extension(11,EXT,texture_compression_bptc, GLES200, None) // #39
#ifndef MAGNUM_TARGET_GLES2 #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 #endif
} namespace OES { } namespace OES {
#ifdef MAGNUM_TARGET_GLES2 #ifdef MAGNUM_TARGET_GLES2
@ -359,12 +360,13 @@ namespace ANDROID {
#ifdef MAGNUM_TARGET_GLES2 #ifdef MAGNUM_TARGET_GLES2
_extension( 11,APPLE,texture_max_level, GLES200, GLES300) // #80 _extension( 11,APPLE,texture_max_level, GLES200, GLES300) // #80
#endif #endif
_extension( 12,APPLE,clip_distance, GLES200, None) // #193
} namespace ARM { } namespace ARM {
#ifdef MAGNUM_TARGET_GLES2 #ifdef MAGNUM_TARGET_GLES2
_extension( 12,ARM,rgba8, GLES200, GLES300) // #82 _extension( 13,ARM,rgba8, GLES200, GLES300) // #82
#endif #endif
_extension( 13,ARM,shader_framebuffer_fetch, GLES200, None) // #165 _extension( 14,ARM,shader_framebuffer_fetch, GLES200, None) // #165
_extension( 14,ARM,shader_framebuffer_fetch_depth_stencil, GLES200, None) // #166 _extension( 15,ARM,shader_framebuffer_fetch_depth_stencil, GLES200, None) // #166
} namespace EXT { } namespace EXT {
_extension( 19,EXT,texture_filter_anisotropic, GLES200, None) // #41 _extension( 19,EXT,texture_filter_anisotropic, GLES200, None) // #41
#ifdef MAGNUM_TARGET_GLES2 #ifdef MAGNUM_TARGET_GLES2
@ -437,12 +439,13 @@ namespace ANDROID {
#endif #endif
_extension( 64,EXT,polygon_offset_clamp, GLES200, None) // #252 _extension( 64,EXT,polygon_offset_clamp, GLES200, None) // #252
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
_extension( 65,EXT,texture_compression_rgtc, GLES300, None) // #286 _extension( 65,EXT,clip_cull_distance, GLES300, None) // #257
_extension( 66,EXT,texture_compression_bptc, GLES300, None) // #287 _extension( 66,EXT,texture_compression_rgtc, GLES300, None) // #286
_extension( 67,EXT,texture_compression_bptc, GLES300, None) // #287
#endif #endif
_extension( 67,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289 _extension( 68,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289
} namespace IMG { } namespace IMG {
_extension( 68,IMG,texture_compression_pvrtc, GLES200, None) // #54 _extension( 69,IMG,texture_compression_pvrtc, GLES200, None) // #54
} namespace KHR { } namespace KHR {
_extension( 70,KHR,texture_compression_astc_ldr,GLES200, GLES320) // #117 _extension( 70,KHR,texture_compression_astc_ldr,GLES200, GLES320) // #117
_extension( 71,KHR,texture_compression_astc_hdr,GLES200, None) // #117 _extension( 71,KHR,texture_compression_astc_hdr,GLES200, None) // #117

6
src/Magnum/GL/Implementation/RendererState.h

@ -93,6 +93,12 @@ struct RendererState {
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
GLint maxPatchVertexCount{}; GLint maxPatchVertexCount{};
#endif #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 /* Bool parameter is ugly, but this is implementation detail of internal
API so who cares */ API so who cares */

81
src/Magnum/GL/Renderer.cpp

@ -197,6 +197,87 @@ void Renderer::setPatchDefaultOuterLevel(const Vector4& levels) {
} }
#endif #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<Extensions::APPLE::clip_distance>())
return 0;
#else
if(!Context::current().isExtensionSupported<Extensions::EXT::clip_cull_distance>())
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<Extensions::ARB::cull_distance>())
return 0;
#else
if(!Context::current().isExtensionSupported<Extensions::EXT::clip_cull_distance>())
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<Extensions::ARB::cull_distance>())
return 0;
#else
if(!Context::current().isExtensionSupported<Extensions::EXT::clip_cull_distance>())
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) { void Renderer::setScissor(const Range2Di& rectangle) {
glScissor(rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY()); glScissor(rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY());
} }

236
src/Magnum/GL/Renderer.h

@ -50,7 +50,6 @@ namespace Implementation { struct RendererState; }
@todo @gl_extension{ARB,viewport_array} @todo @gl_extension{ARB,viewport_array}
@todo `GL_POINT_SIZE_GRANULARITY`, `GL_POINT_SIZE_RANGE` (?) @todo `GL_POINT_SIZE_GRANULARITY`, `GL_POINT_SIZE_RANGE` (?)
@todo `GL_STEREO`, `GL_DOUBLEBUFFER` (?) @todo `GL_STEREO`, `GL_DOUBLEBUFFER` (?)
@todo `GL_MAX_CLIP_DISTANCES`...
*/ */
class MAGNUM_GL_EXPORT Renderer { class MAGNUM_GL_EXPORT Renderer {
friend Context; friend Context;
@ -104,6 +103,192 @@ class MAGNUM_GL_EXPORT Renderer {
*/ */
Blending = GL_BLEND, 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 #ifndef MAGNUM_TARGET_WEBGL
/** /**
* Debug output. Disabled by default unless the GL context was * 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); static void setPatchDefaultOuterLevel(const Vector4& levels);
#endif #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 /* Since 1.8.17, the original short-hand group closing doesn't work
anymore. FFS. */ anymore. FFS. */
/** /**

21
src/Magnum/Platform/gl-info.cpp

@ -417,6 +417,9 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat
_l(GL::Mesh::maxElementsVertices()) _l(GL::Mesh::maxElementsVertices())
#endif #endif
_lvec(GL::Renderer::lineWidthRange()) _lvec(GL::Renderer::lineWidthRange())
#if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL))
_l(GL::Renderer::maxClipDistances())
#endif
_l(GL::Renderbuffer::maxSize()) _l(GL::Renderbuffer::maxSize())
#if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2))
_l(GL::Renderbuffer::maxSamples()) _l(GL::Renderbuffer::maxSamples())
@ -461,6 +464,24 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat
} }
#endif #endif
#ifndef MAGNUM_TARGET_GLES2
#ifndef MAGNUM_TARGET_GLES
if(c.isExtensionSupported<GL::Extensions::ARB::cull_distance>())
#else
if(c.isExtensionSupported<GL::Extensions::EXT::clip_cull_distance>())
#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) #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
if(c.isExtensionSupported<GL::Extensions::ARB::compute_shader>()) if(c.isExtensionSupported<GL::Extensions::ARB::compute_shader>())

1
src/MagnumExternal/OpenGL/GLES2/extensions.txt vendored

@ -10,6 +10,7 @@ extension ANGLE_instanced_arrays optional
extension ANGLE_depth_texture optional extension ANGLE_depth_texture optional
extension APPLE_framebuffer_multisample optional extension APPLE_framebuffer_multisample optional
extension APPLE_texture_max_level optional extension APPLE_texture_max_level optional
extension APPLE_clip_distance optional
extension ARM_rgba8 optional extension ARM_rgba8 optional
extension EXT_texture_type_2_10_10_10_REV optional extension EXT_texture_type_2_10_10_10_REV optional
extension EXT_discard_framebuffer optional extension EXT_discard_framebuffer optional

12
src/MagnumExternal/OpenGL/GLES2/flextGL.h vendored

@ -452,6 +452,18 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen
#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D #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 */ /* GL_EXT_texture_type_2_10_10_10_REV */
#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368

12
src/MagnumExternal/OpenGL/GLES2/flextGLWindowsDesktop.h vendored

@ -447,6 +447,18 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen
#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D #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 */ /* GL_EXT_texture_type_2_10_10_10_REV */
#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368

1
src/MagnumExternal/OpenGL/GLES3/Emscripten/extensions.txt vendored

@ -10,6 +10,7 @@ extension EXT_disjoint_timer_query optional
extension EXT_color_buffer_float optional extension EXT_color_buffer_float optional
extension EXT_texture_compression_rgtc optional extension EXT_texture_compression_rgtc optional
extension EXT_texture_compression_bptc optional extension EXT_texture_compression_bptc optional
extension EXT_clip_cull_distance optional
extension EXT_draw_buffers_indexed optional extension EXT_draw_buffers_indexed optional
# WebGL has only OVR_multiview2, but we need the definitions from OVR_multiview # WebGL has only OVR_multiview2, but we need the definitions from OVR_multiview
extension OVR_multiview optional extension OVR_multiview optional

1
src/MagnumExternal/OpenGL/GLES3/extensions.txt vendored

@ -59,6 +59,7 @@ extension EXT_shader_integer_mix optional
extension EXT_texture_sRGB_R8 optional extension EXT_texture_sRGB_R8 optional
extension EXT_texture_sRGB_RG8 optional extension EXT_texture_sRGB_RG8 optional
extension EXT_polygon_offset_clamp optional extension EXT_polygon_offset_clamp optional
extension EXT_clip_cull_distance optional
extension EXT_texture_compression_rgtc optional extension EXT_texture_compression_rgtc optional
extension EXT_texture_compression_bptc optional extension EXT_texture_compression_bptc optional
extension EXT_texture_compression_s3tc_srgb optional extension EXT_texture_compression_s3tc_srgb optional

14
src/MagnumExternal/OpenGL/GLES3/flextGL.h vendored

@ -1567,6 +1567,20 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen
#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B #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 */ /* GL_EXT_texture_compression_rgtc */
#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB

14
src/MagnumExternal/OpenGL/GLES3/flextGLEmscripten.h vendored

@ -745,6 +745,20 @@ typedef struct __GLsync *GLsync;
#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E
#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F #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 */ /* GL_EXT_draw_buffers_indexed */
#define GL_BLEND_EQUATION_RGB 0x8009 #define GL_BLEND_EQUATION_RGB 0x8009

14
src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h vendored

@ -1559,6 +1559,20 @@ typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLen
#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B #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 */ /* GL_EXT_texture_compression_rgtc */
#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB

Loading…
Cancel
Save