From 2ad49aa3517d30dadb1d24db854c4f918b4d1d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 11 Sep 2015 20:50:46 +0200 Subject: [PATCH] Support for KHR_blend_equation_advanced{,_coherent}. --- doc/opengl-mapping.dox | 2 +- doc/opengl-support.dox | 8 +- src/Magnum/Renderer.h | 218 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 221 insertions(+), 7 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index c2d59d70f..aa7a8c87b 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -68,7 +68,7 @@ OpenGL function | Matching API @fn_gl{BindTransformFeedback} | not needed, handled internally in @ref TransformFeedback @fn_gl{BindVertexArray} | not needed, handled internally in @ref Mesh @fn_gl{BindVertexBuffer}, \n `glVertexArrayVertexBuffer()`, \n @fn_gl_extension{VertexArrayBindVertexBuffer,EXT,direct_state_access} \n @fn_gl{BindVertexBuffers}, \n `glVertexArrayVertexBuffers()` | | -@fn_gl_extension{BlendBarrier,KHR,blend_equation_advanced} | | +@fn_gl_extension{BlendBarrier,KHR,blend_equation_advanced} | @ref Renderer::blendBarrier() @fn_gl{BlendColor} | @ref Renderer::setBlendColor() @fn_gl{BlendEquation}, \n @fn_gl{BlendEquationSeparate} | @ref Renderer::setBlendEquation() @fn_gl{BlendFunc}, \n @fn_gl{BlendFuncSeparate} | @ref Renderer::setBlendFunction() diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 5a2935505..00f4e6000 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -246,8 +246,8 @@ Extension | Status @extension{ARB,pipeline_statistics_query} | | @extension{ARB,sparse_buffer} | | @extension{ARB,transform_feedback_overflow_query} | | -@extension{KHR,blend_equation_advanced} | | -@extension3{KHR,blend_equation_advanced_coherent,blend_equation_advanced} | | +@extension{KHR,blend_equation_advanced} | done +@extension3{KHR,blend_equation_advanced_coherent,blend_equation_advanced} | done @subsection opengl-support-extensions-vendor Vendor OpenGL extensions @@ -375,8 +375,8 @@ Extension | Status @es_extension2{KHR,texture_compression_astc_ldr,texture_compression_astc_hdr} | done @es_extension2{KHR,texture_compression_astc_hdr,texture_compression_astc_hdr} | done @es_extension{KHR,debug} | see above -@es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} | | -@es_extension2{KHR,blend_equation_advanced_coherent,blend_equation_advanced} | | +@es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} | done +@es_extension2{KHR,blend_equation_advanced_coherent,blend_equation_advanced} | done @es_extension{KHR,robustness} | | @es_extension{KHR,robust_buffer_access_behavior} | done (nothing to do) @es_extension{KHR,context_flush_control} | | diff --git a/src/Magnum/Renderer.h b/src/Magnum/Renderer.h index 439768dcd..412167f3d 100644 --- a/src/Magnum/Renderer.h +++ b/src/Magnum/Renderer.h @@ -77,6 +77,18 @@ class MAGNUM_EXPORT Renderer { * @see @ref enable(), @ref disable(), @ref setFeature() */ enum class Feature: GLenum { + #ifndef MAGNUM_TARGET_WEBGL + /** + * Coherent advanced blending. Enabled by default if desktop/ES + * extension @extension3{KHR,blend_equation_advanced_coherent,blend_equation_advanced} + * is available. See @ref blendBarrier() for more information. + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in WebGL. + */ + BlendAdvancedCoherent = GL_BLEND_ADVANCED_COHERENT_KHR, + #endif + /** * Blending * @see @ref setBlendEquation(), @ref setBlendFunction(), @@ -760,9 +772,191 @@ class MAGNUM_EXPORT Renderer { * in WebGL 1.0. */ #ifndef MAGNUM_TARGET_GLES2 - Max = GL_MAX + Max = GL_MAX, #else - Max = GL_MAX_EXT + Max = GL_MAX_EXT, + #endif + + #ifndef MAGNUM_TARGET_WEBGL + /** + * Multiply. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + Multiply = GL_MULTIPLY_KHR, + + /** + * Screen. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + Screen = GL_SCREEN_KHR, + + /** + * Overlay. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + Overlay = GL_OVERLAY_KHR, + + /** + * Darken. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + Darken = GL_DARKEN_KHR, + + /** + * Lighten. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + Lighten = GL_LIGHTEN_KHR, + + /** + * Color dodge. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + ColorDodge = GL_COLORDODGE_KHR, + + /** + * Color burn. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + ColorBurn = GL_COLORBURN_KHR, + + /** + * Hard light. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + HardLight = GL_HARDLIGHT_KHR, + + /** + * Soft light. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + SoftLight = GL_SOFTLIGHT_KHR, + + /** + * Difference. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + Difference = GL_DIFFERENCE_KHR, + + /** + * Exclusion. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + Exclusion = GL_EXCLUSION_KHR, + + /** + * HSL hue. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + HslHue = GL_HSL_HUE_KHR, + + /** + * HSL saturation. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + HslSaturation = GL_HSL_SATURATION_KHR, + + /** + * HSL color. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + HslColor = GL_HSL_COLOR_KHR, + + /** + * HSL luminosity. Not accepted as separate parameters in + * @ref setBlendEquation(BlendEquation, BlendEquation), only in + * @ref setBlendEquation(BlendEquation). + * @see @ref blendBarrier() + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in + * WebGL. + */ + HslLuminosity = GL_HSL_LUMINOSITY_KHR #endif }; @@ -950,6 +1144,26 @@ class MAGNUM_EXPORT Renderer { */ static void setBlendColor(const Color4& color); + #ifndef MAGNUM_TARGET_WEBGL + /** + * @brief Blend barrier + * + * Specifies a boundary between passes when using advanced blend + * equations to ensure that each sample in the framebuffer is not + * touched more than once. + * + * This is needed either when desktop/ES extension + * @extension3{KHR,blend_equation_advanced_coherent,blend_equation_advanced} + * is not available or when @extension3{KHR,blend_equation_advanced_coherent,blend_equation_advanced} + * is available and @ref Feature::BlendAdvancedCoherent is turned off. + * @see @ref BlendEquation, @fn_gl_extension{BlendBarrier,KHR,blend_equation_advanced} + * @requires_extension Extension @extension{KHR,blend_equation_advanced} + * @requires_es_extension Extension @es_extension2{KHR,blend_equation_advanced,blend_equation_advanced} + * @requires_gles Advanced blend equations are not available in WebGL. + */ + static void blendBarrier() { glBlendBarrierKHR(); } + #endif + /*@}*/ #ifndef MAGNUM_TARGET_GLES