diff --git a/doc/changelog.dox b/doc/changelog.dox index 5d26f8f6e..d9d1af5c9 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -59,6 +59,9 @@ See also: can be over @cpp 1.0f @ce only in non-forward-compatible contexts, a new @cpp "mesa-forward-compatible-line-width-range" @ce workaround fixes that for Mesa. See @ref opengl-workarounds for more information. +- Implemented the @gl_extension{ARB,sample_shading} desktop extension and the + equivalent functionality in OpenGL ES 3.2 / @gl_extension{OES,sample_shading} + ES3 extension @subsubsection changelog-latest-new-math Math library diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 708998e6e..d3baed418 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -294,7 +294,7 @@ OpenGL function | Matching API @fn_gl_extension{MakeTextureHandleNonResident,ARB,bindless_texture} | | @fn_gl{MapBuffer}, \n `glMapNamedBuffer()`, \n @fn_gl_extension{MapNamedBuffer,EXT,direct_state_access}, \n @fn_gl{MapBufferRange}, \n `glMapNamedBufferRange()`, \n @fn_gl_extension{MapNamedBufferRange,EXT,direct_state_access}, \n @fn_gl{UnmapBuffer}, \n `glUnmapNamedBuffer()`, \n @fn_gl_extension{UnmapNamedBuffer,EXT,direct_state_access} | @ref GL::Buffer::map(), @ref GL::Buffer::unmap() @fn_gl{MemoryBarrier}, \n `glMemoryBarrierByRegion()` | @ref GL::Renderer::setMemoryBarrier(), \n @ref GL::Renderer::setMemoryBarrierByRegion() -@fn_gl{MinSampleShading} | | +@fn_gl{MinSampleShading} | @ref GL::Renderer::setMinSampleShading() @fn_gl{MultiDrawArrays}, \n @fn_gl{MultiDrawElements}, \n @fn_gl{MultiDrawElementsBaseVertex} | @ref GL::MeshView::draw(AbstractShaderProgram&, std::initializer_list>) @fn_gl{MultiDrawArraysIndirectCount}, \n @fn_gl{MultiDrawElementsIndirectCount} | | diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 2189ca637..f58f5327c 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -135,7 +135,7 @@ Extension | Status ------------------------------------------- | ------ GLSL 4.00 | done @gl_extension{ARB,draw_buffers_blend} | | -@gl_extension{ARB,sample_shading} | | +@gl_extension{ARB,sample_shading} | done @gl_extension{ARB,texture_cube_map_array} | done @gl_extension{ARB,texture_gather} | missing limit queries @gl_extension{ARB,texture_query_lod} | done (shading language only) @@ -353,7 +353,7 @@ Extension | Status @gl_extension2{KHR,blend_equation_advanced,blend_equation_advanced} | done @gl_extension{KHR,robustness} | | @gl_extension{KHR,robust_buffer_access_behavior} | done (nothing to do) -@gl_extension{OES,sample_shading} | | +@gl_extension{OES,sample_shading} | done @gl_extension{OES,sample_variables} | done (shading language only) @gl_extension{OES,shader_image_atomic} | done (shading language only) @gl_extension{OES,shader_multisample_interpolation} | | diff --git a/src/Magnum/GL/Implementation/RendererState.cpp b/src/Magnum/GL/Implementation/RendererState.cpp index 9c017c25f..b036f16d3 100644 --- a/src/Magnum/GL/Implementation/RendererState.cpp +++ b/src/Magnum/GL/Implementation/RendererState.cpp @@ -95,6 +95,17 @@ RendererState::RendererState(Context& context, std::vector& extensi { lineWidthRangeImplementation = &Renderer::lineWidthRangeImplementationDefault; } + + #ifndef MAGNUM_TARGET_GLES + minSampleShadingImplementation = &Renderer::minSampleShadingImplementationDefault; + #elif !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + if(context.isVersionSupported(Version::GLES320)) + minSampleShadingImplementation = &Renderer::minSampleShadingImplementationDefault; + else if(context.isExtensionSupported()) + minSampleShadingImplementation = &Renderer::minSampleShadingImplementationOES; + else + minSampleShadingImplementation = nullptr; + #endif } RendererState::PixelStorage::PixelStorage(): diff --git a/src/Magnum/GL/Implementation/RendererState.h b/src/Magnum/GL/Implementation/RendererState.h index c45e58716..ff294e205 100644 --- a/src/Magnum/GL/Implementation/RendererState.h +++ b/src/Magnum/GL/Implementation/RendererState.h @@ -38,6 +38,9 @@ struct RendererState { Range1D(*lineWidthRangeImplementation)(); void(*clearDepthfImplementation)(GLfloat); + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + void(*minSampleShadingImplementation)(GLfloat); + #endif #ifndef MAGNUM_TARGET_WEBGL Renderer::GraphicsResetStatus(*graphicsResetStatusImplementation)(); diff --git a/src/Magnum/GL/Renderer.cpp b/src/Magnum/GL/Renderer.cpp index 920bdfcda..302b5076b 100644 --- a/src/Magnum/GL/Renderer.cpp +++ b/src/Magnum/GL/Renderer.cpp @@ -133,6 +133,22 @@ void Renderer::setPointSize(const Float size) { } #endif +#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) +void Renderer::setMinSampleShading(const Float value) { + (Context::current().state().renderer->minSampleShadingImplementation)(value); +} + +void Renderer::minSampleShadingImplementationDefault(const GLfloat value) { + glMinSampleShading(value); +} + +#ifdef MAGNUM_TARGET_GLES +void Renderer::minSampleShadingImplementationOES(const GLfloat value) { + glMinSampleShadingOES(value); +} +#endif +#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 c274a638b..970c6d360 100644 --- a/src/Magnum/GL/Renderer.h +++ b/src/Magnum/GL/Renderer.h @@ -262,11 +262,18 @@ class MAGNUM_GL_EXPORT Renderer { RasterizerDiscard = GL_RASTERIZER_DISCARD, #endif + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** - * Scissor test - * @see @ref setScissor() + * Sample shading. + * @see @ref setMinSampleShading() + * @requires_gl40 Extension @gl_extension{ARB,sample_shading} + * @requires_gles32 Extension @gl_extension{ANDROID,extension_pack_es31a} + * / @gl_extension{OES,sample_shading} + * @requires_gles30 Sample shading is not defined in OpenGL ES 2.0. + * @requires_gles Sample shading is not available in WebGL. */ - ScissorTest = GL_SCISSOR_TEST, + SampleShading = GL_SAMPLE_SHADING, + #endif #ifndef MAGNUM_TARGET_GLES /** @@ -279,6 +286,12 @@ class MAGNUM_GL_EXPORT Renderer { SeamlessCubeMapTexture = GL_TEXTURE_CUBE_MAP_SEAMLESS, #endif + /** + * Scissor test + * @see @ref setScissor() + */ + ScissorTest = GL_SCISSOR_TEST, + /** * Stencil test * @see @ref setClearStencil(), @ref setStencilFunction(), @@ -599,6 +612,20 @@ class MAGNUM_GL_EXPORT Renderer { static void setPointSize(Float size); #endif + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + /** + * @brief Set min sample shading value + * + * @see @ref Feature::SampleShading, @fn_gl_keyword{MinSampleShading} + * @requires_gl40 Extension @gl_extension{ARB,sample_shading} + * @requires_gles32 Extension @gl_extension{ANDROID,extension_pack_es31a} / + * @gl_extension{OES,sample_shading} + * @requires_gles30 Sample shading is not defined in OpenGL ES 2.0. + * @requires_gles Sample shading is not available in WebGL. + */ + static void setMinSampleShading(Float value); + #endif + /*@}*/ /** @{ @name Scissor operations */ @@ -1653,6 +1680,13 @@ class MAGNUM_GL_EXPORT Renderer { #endif static void MAGNUM_GL_LOCAL clearDepthfImplementationES(GLfloat depth); + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + static MAGNUM_GL_LOCAL void minSampleShadingImplementationDefault(GLfloat value); + #ifdef MAGNUM_TARGET_GLES + static MAGNUM_GL_LOCAL void minSampleShadingImplementationOES(GLfloat value); + #endif + #endif + #ifndef MAGNUM_TARGET_WEBGL static GraphicsResetStatus MAGNUM_GL_LOCAL graphicsResetStatusImplementationDefault(); static GraphicsResetStatus MAGNUM_GL_LOCAL graphicsResetStatusImplementationRobustness();