From 1850210de4811289f1487af7babdfe52faa4475d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 3 Mar 2023 23:06:53 +0100 Subject: [PATCH] GL: expose Renderer::Feature::SampleAlphaToCoverage and related APIs. I need alpha to coverage for rendering line caps with MSAA, took it as an opportunity to expose the other related features as well. Fun how I survived 12+ years without needing those. --- doc/changelog.dox | 4 ++++ doc/opengl-mapping.dox | 2 +- src/Magnum/GL/Renderer.cpp | 4 ++++ src/Magnum/GL/Renderer.h | 41 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 59956f611..7cbe36428 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -149,6 +149,10 @@ See also: - Exposed @gl_extension{ARB,buffer_storage} as @ref GL::Buffer::setStorage() together with additions to @ref GL::Buffer::MapFlag +- Exposed missing @ref GL::Renderer::Feature::SampleAlphaToCoverage, + @relativeref{GL::Renderer,Feature::SampleAlphaToOne}, + @relativeref{GL::Renderer,Feature::SampleCoverage} and + @ref GL::Renderer::setSampleCoverage() GL 1.3 APIs - A new @cpp "nv-egl-crashy-query-device-attrib" @ce workaround for a crash happening during EGL initialization in recent NVidia drivers. See @ref opengl-workarounds and [mosra/magnum#491](https://github.com/mosra/magnum/pull/491) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index c657960af..b718c44a2 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -352,7 +352,7 @@ OpenGL function | Matching API OpenGL function | Matching API --------------------------------------- | ------------ -@fn_gl{SampleCoverage} | | +@fn_gl{SampleCoverage} | @ref GL::Renderer::setSampleCoverage() @fn_gl{SampleMaski} | | @fn_gl{SamplerParameter} | | @fn_gl{Scissor} | @ref GL::Renderer::setScissor() diff --git a/src/Magnum/GL/Renderer.cpp b/src/Magnum/GL/Renderer.cpp index 0e59c3305..9aa1ef926 100644 --- a/src/Magnum/GL/Renderer.cpp +++ b/src/Magnum/GL/Renderer.cpp @@ -147,6 +147,10 @@ void Renderer::setPointSize(const Float size) { } #endif +void Renderer::setSampleCoverage(const Float value, const bool invert) { + glSampleCoverage(value, invert); +} + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) void Renderer::setMinSampleShading(const Float value) { Context::current().state().renderer.minSampleShadingImplementation(value); diff --git a/src/Magnum/GL/Renderer.h b/src/Magnum/GL/Renderer.h index 0dc53863f..18209e5f5 100644 --- a/src/Magnum/GL/Renderer.h +++ b/src/Magnum/GL/Renderer.h @@ -450,6 +450,38 @@ class MAGNUM_GL_EXPORT Renderer { RasterizerDiscard = GL_RASTERIZER_DISCARD, #endif + /** + * Transforms a fragment's alpha value into a coverage value to + * determine its contribution to the final pixel value in a + * multisampled framebuffer. + * @m_since_latest + * @see @ref Feature::SampleAlphaToOne, + * @ref Feature::SampleCoverage, @ref setSampleCoverage() + */ + SampleAlphaToCoverage = GL_SAMPLE_ALPHA_TO_COVERAGE, + + #ifndef MAGNUM_TARGET_GLES + /** + * Replaces each sample alpha value by the maximum representable + * alpha value. + * @m_since_latest + * @see @ref Feature::SampleAlphaToCoverage, + * @ref Feature::SampleCoverage, @ref setSampleCoverage() + * @requires_gl Sample alpha to one is not available in OpenGL ES + * and WebGL. + */ + SampleAlphaToOne = GL_SAMPLE_ALPHA_TO_ONE, + #endif + + /** + * Combines the fragment coverage with the coverage value set in + * @ref setSampleCoverage(). + * @m_since_latest + * @see @ref Feature::SampleAlphaToCoverage, + * @ref Feature::SampleAlphaToOne + */ + SampleCoverage = GL_SAMPLE_COVERAGE, + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * Sample shading. @@ -863,6 +895,15 @@ class MAGNUM_GL_EXPORT Renderer { static void setPointSize(Float size); #endif + /** + * @brief Set sample coverage parameters + * @m_since_latest + * + * Initial value is @cpp 1.0f @ce and @cpp false @ce. + * @see @ref Feature::SampleCoverage, @fn_gl_keyword{SampleCoverage} + */ + static void setSampleCoverage(Float value, bool invert); + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * @brief Set min sample shading value