[Mesa-dev] [PATCH v2 08/16] mesa: Track the current advanced blending mode.

Francisco Jerez currojerez at riseup.net
Mon Aug 22 20:01:20 UTC 2016


Kenneth Graunke <kenneth at whitecape.org> writes:

> This will be useful for a number of things:
> - Checking the current advanced blending mode against the shader's
>   blend_support_* qualifiers.
> - Disabling hardware blending when emulating advanced blending.
> - Uploading the current advanced blending mode as a state var.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>

Reviewed-by: Francisco Jerez <currojerez at riseup.net>

> ---
>  src/mesa/main/blend.c  | 54 ++++++++++++++++++++++++++++++++++++++------------
>  src/mesa/main/mtypes.h |  9 +++++++++
>  2 files changed, 50 insertions(+), 13 deletions(-)
>
> diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c
> index fe83e59..de6d3c4 100644
> --- a/src/mesa/main/blend.c
> +++ b/src/mesa/main/blend.c
> @@ -355,36 +355,57 @@ legal_simple_blend_equation(const struct gl_context *ctx, GLenum mode)
>     }
>  }
>  
> -
> -/**
> - * Return true if \p mode is one of the advanced blending equations
> - * defined by GL_KHR_blend_equation_advanced.
> - */
> -static bool
> -legal_advanced_blend_equation(const struct gl_context *ctx, GLenum mode)
> +static enum gl_advanced_blend_mode
> +advanced_blend_mode_from_gl_enum(GLenum mode)
>  {
>     switch (mode) {
>     case GL_MULTIPLY_KHR:
> +      return BLEND_MULTIPLY;
>     case GL_SCREEN_KHR:
> +      return BLEND_SCREEN;
>     case GL_OVERLAY_KHR:
> +      return BLEND_OVERLAY;
>     case GL_DARKEN_KHR:
> +      return BLEND_DARKEN;
>     case GL_LIGHTEN_KHR:
> +      return BLEND_LIGHTEN;
>     case GL_COLORDODGE_KHR:
> +      return BLEND_COLORDODGE;
>     case GL_COLORBURN_KHR:
> +      return BLEND_COLORBURN;
>     case GL_HARDLIGHT_KHR:
> +      return BLEND_HARDLIGHT;
>     case GL_SOFTLIGHT_KHR:
> +      return BLEND_SOFTLIGHT;
>     case GL_DIFFERENCE_KHR:
> +      return BLEND_DIFFERENCE;
>     case GL_EXCLUSION_KHR:
> +      return BLEND_EXCLUSION;
>     case GL_HSL_HUE_KHR:
> +      return BLEND_HSL_HUE;
>     case GL_HSL_SATURATION_KHR:
> +      return BLEND_HSL_SATURATION;
>     case GL_HSL_COLOR_KHR:
> +      return BLEND_HSL_COLOR;
>     case GL_HSL_LUMINOSITY_KHR:
> -      return _mesa_has_KHR_blend_equation_advanced(ctx);
> +      return BLEND_HSL_LUMINOSITY;
>     default:
> -      return false;
> +      return BLEND_NONE;
>     }
>  }
>  
> +/**
> + * If \p mode is one of the advanced blending equations defined by
> + * GL_KHR_blend_equation_advanced (and the extension is supported),
> + * return the corresponding BLEND_* enum.  Otherwise, return BLEND_NONE
> + * (which can also be treated as false).
> + */
> +static enum gl_advanced_blend_mode
> +advanced_blend_mode(const struct gl_context *ctx, GLenum mode)
> +{
> +   return _mesa_has_KHR_blend_equation_advanced(ctx) ?
> +          advanced_blend_mode_from_gl_enum(mode) : BLEND_NONE;
> +}
>  
>  /* This is really an extension function! */
>  void GLAPIENTRY
> @@ -394,6 +415,7 @@ _mesa_BlendEquation( GLenum mode )
>     const unsigned numBuffers = num_buffers(ctx);
>     unsigned buf;
>     bool changed = false;
> +   enum gl_advanced_blend_mode advanced_mode = advanced_blend_mode(ctx, mode);
>  
>     if (MESA_VERBOSE & VERBOSE_API)
>        _mesa_debug(ctx, "glBlendEquation(%s)\n",
> @@ -420,8 +442,8 @@ _mesa_BlendEquation( GLenum mode )
>     if (!changed)
>        return;
>  
> -   if (!legal_simple_blend_equation(ctx, mode) &&
> -       !legal_advanced_blend_equation(ctx, mode)) {
> +
> +   if (!legal_simple_blend_equation(ctx, mode) && !advanced_mode) {
>        _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation");
>        return;
>     }
> @@ -433,6 +455,7 @@ _mesa_BlendEquation( GLenum mode )
>        ctx->Color.Blend[buf].EquationA = mode;
>     }
>     ctx->Color._BlendEquationPerBuffer = GL_FALSE;
> +   ctx->Color._AdvancedBlendMode = advanced_mode;
>  
>     if (ctx->Driver.BlendEquationSeparate)
>        ctx->Driver.BlendEquationSeparate(ctx, mode, mode);
> @@ -446,6 +469,7 @@ void GLAPIENTRY
>  _mesa_BlendEquationiARB(GLuint buf, GLenum mode)
>  {
>     GET_CURRENT_CONTEXT(ctx);
> +   enum gl_advanced_blend_mode advanced_mode = advanced_blend_mode(ctx, mode);
>  
>     if (MESA_VERBOSE & VERBOSE_API)
>        _mesa_debug(ctx, "glBlendEquationi(%u, %s)\n",
> @@ -457,8 +481,7 @@ _mesa_BlendEquationiARB(GLuint buf, GLenum mode)
>        return;
>     }
>  
> -   if (!legal_simple_blend_equation(ctx, mode) &&
> -       !legal_advanced_blend_equation(ctx, mode)) {
> +   if (!legal_simple_blend_equation(ctx, mode) && !advanced_mode) {
>        _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquationi");
>        return;
>     }
> @@ -471,6 +494,9 @@ _mesa_BlendEquationiARB(GLuint buf, GLenum mode)
>     ctx->Color.Blend[buf].EquationRGB = mode;
>     ctx->Color.Blend[buf].EquationA = mode;
>     ctx->Color._BlendEquationPerBuffer = GL_TRUE;
> +
> +   if (buf == 0)
> +      ctx->Color._AdvancedBlendMode = advanced_mode;
>  }
>  
>  
> @@ -537,6 +563,7 @@ _mesa_BlendEquationSeparate( GLenum modeRGB, GLenum modeA )
>        ctx->Color.Blend[buf].EquationA = modeA;
>     }
>     ctx->Color._BlendEquationPerBuffer = GL_FALSE;
> +   ctx->Color._AdvancedBlendMode = BLEND_NONE;
>  
>     if (ctx->Driver.BlendEquationSeparate)
>        ctx->Driver.BlendEquationSeparate(ctx, modeRGB, modeA);
> @@ -586,6 +613,7 @@ _mesa_BlendEquationSeparateiARB(GLuint buf, GLenum modeRGB, GLenum modeA)
>     ctx->Color.Blend[buf].EquationRGB = modeRGB;
>     ctx->Color.Blend[buf].EquationA = modeA;
>     ctx->Color._BlendEquationPerBuffer = GL_TRUE;
> +   ctx->Color._AdvancedBlendMode = BLEND_NONE;
>  }
>  
>  
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 08e7bff..46db719 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -452,6 +452,15 @@ struct gl_colorbuffer_attrib
>     GLboolean _BlendFuncPerBuffer;
>     /** Are the blend equations currently different for each buffer/target? */
>     GLboolean _BlendEquationPerBuffer;
> +
> +   /**
> +    * Which advanced blending mode is in use (or BLEND_NONE).
> +    *
> +    * KHR_blend_equation_advanced only allows advanced blending with a single
> +    * draw buffer, and NVX_blend_equation_advanced_multi_draw_buffer still
> +    * requires all draw buffers to match, so we only need a single value.
> +    */
> +   enum gl_advanced_blend_mode _AdvancedBlendMode;
>     /*@}*/
>  
>     /** 
> -- 
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160822/ce3b1eca/attachment.sig>


More information about the mesa-dev mailing list