diff options
author | Eric Anholt <eric@anholt.net> | 2012-05-17 15:31:40 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2012-05-23 10:45:43 -0700 |
commit | 175ad8050e3337f7065306017ea4eb8eae599f6d (patch) | |
tree | 9aa14587f323a5b4db3cb130866f50686165c241 /src/mesa/main/blend.c | |
parent | 68216f35814ab8d292f37b8c0fa0a5f181b7f20d (diff) | |
download | external_mesa3d-175ad8050e3337f7065306017ea4eb8eae599f6d.zip external_mesa3d-175ad8050e3337f7065306017ea4eb8eae599f6d.tar.gz external_mesa3d-175ad8050e3337f7065306017ea4eb8eae599f6d.tar.bz2 |
mesa: Keep a computed value for dual source blend func with each buffer.
The i965 driver needed this as well for hardware setup, so instead of
duplicating the logic, just save it off.
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'src/mesa/main/blend.c')
-rw-r--r-- | src/mesa/main/blend.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c index bc446ed..5bc40a0 100644 --- a/src/mesa/main/blend.c +++ b/src/mesa/main/blend.c @@ -166,6 +166,24 @@ _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ) _mesa_BlendFuncSeparateEXT(sfactor, dfactor, sfactor, dfactor); } +static GLboolean +blend_factor_is_dual_src(GLenum factor) +{ + return (factor == GL_SRC1_COLOR || + factor == GL_SRC1_ALPHA || + factor == GL_ONE_MINUS_SRC1_COLOR || + factor == GL_ONE_MINUS_SRC1_ALPHA); +} + +static void +update_uses_dual_src(struct gl_context *ctx, int buf) +{ + ctx->Color.Blend[buf]._UsesDualSrc = + (blend_factor_is_dual_src(ctx->Color.Blend[buf].SrcRGB) || + blend_factor_is_dual_src(ctx->Color.Blend[buf].DstRGB) || + blend_factor_is_dual_src(ctx->Color.Blend[buf].SrcA) || + blend_factor_is_dual_src(ctx->Color.Blend[buf].DstA)); +} /** * Set the separate blend source/dest factors for all draw buffers. @@ -220,6 +238,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, ctx->Color.Blend[buf].DstRGB = dfactorRGB; ctx->Color.Blend[buf].SrcA = sfactorA; ctx->Color.Blend[buf].DstA = dfactorA; + update_uses_dual_src(ctx, buf); } ctx->Color._BlendFuncPerBuffer = GL_FALSE; @@ -282,6 +301,7 @@ _mesa_BlendFuncSeparatei(GLuint buf, GLenum sfactorRGB, GLenum dfactorRGB, ctx->Color.Blend[buf].DstRGB = dfactorRGB; ctx->Color.Blend[buf].SrcA = sfactorA; ctx->Color.Blend[buf].DstA = dfactorA; + update_uses_dual_src(ctx, buf); ctx->Color._BlendFuncPerBuffer = GL_TRUE; if (ctx->Driver.BlendFuncSeparatei) { |