X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fblend.c;h=382c27d710b43397d8f40578facb30d2d7c95bf0;hb=cd1cefae9146fc14b35ee93a04bdb1b1590fba7b;hp=621969de24482e4f8616bc1b1256173fa7566016;hpb=5e3bc0c2a2bcdf59949410f94c9b705fc1281ce8;p=mesa.git diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c index 621969de244..382c27d710b 100644 --- a/src/mesa/main/blend.c +++ b/src/mesa/main/blend.c @@ -1,10 +1,10 @@ -/* $Id: blend.c,v 1.26 2000/11/22 07:32:16 joukj Exp $ */ +/* $Id: blend.c,v 1.32 2001/03/29 16:50:31 brianp Exp $ */ /* * Mesa 3-D graphics library * Version: 3.5 * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -25,7 +25,6 @@ */ - #ifdef PC_HEADER #include "all.h" #else @@ -41,19 +40,20 @@ void _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ) { + GET_CURRENT_CONTEXT(ctx); - ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glBlendFunc"); + ASSERT_OUTSIDE_BEGIN_END(ctx); if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) fprintf(stderr, "glBlendFunc %s %s\n", - gl_lookup_enum_by_nr(sfactor), - gl_lookup_enum_by_nr(dfactor)); + _mesa_lookup_enum_by_nr(sfactor), + _mesa_lookup_enum_by_nr(dfactor)); switch (sfactor) { case GL_SRC_COLOR: case GL_ONE_MINUS_SRC_COLOR: if (!ctx->Extensions.NV_blend_square) { - gl_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" ); + _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" ); return; } /* fall-through */ @@ -70,10 +70,9 @@ _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ) case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: - ctx->Color.BlendSrcRGB = ctx->Color.BlendSrcA = sfactor; break; default: - gl_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" ); + _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" ); return; } @@ -81,7 +80,7 @@ _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ) case GL_DST_COLOR: case GL_ONE_MINUS_DST_COLOR: if (!ctx->Extensions.NV_blend_square) { - gl_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" ); + _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" ); return; } /* fall-through */ @@ -97,18 +96,24 @@ _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ) case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: - ctx->Color.BlendDstRGB = ctx->Color.BlendDstA = dfactor; break; default: - gl_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" ); + _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" ); return; } - if (ctx->Driver.BlendFunc) { - (*ctx->Driver.BlendFunc)( ctx, sfactor, dfactor ); - } + if (ctx->Color.BlendDstRGB == dfactor && + ctx->Color.BlendSrcRGB == sfactor && + ctx->Color.BlendDstA == dfactor && + ctx->Color.BlendSrcA == sfactor) + return; - ctx->NewState |= _NEW_COLOR; + FLUSH_VERTICES(ctx, _NEW_COLOR); + ctx->Color.BlendDstRGB = ctx->Color.BlendDstA = dfactor; + ctx->Color.BlendSrcRGB = ctx->Color.BlendSrcA = sfactor; + + if (ctx->Driver.BlendFunc) + ctx->Driver.BlendFunc( ctx, sfactor, dfactor ); } @@ -118,20 +123,20 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA ) { GET_CURRENT_CONTEXT(ctx); - ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glBlendFuncSeparate"); + ASSERT_OUTSIDE_BEGIN_END(ctx); if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) - fprintf(stderr, "glBlendFuncSeperate %s %s %s %s\n", - gl_lookup_enum_by_nr(sfactorRGB), - gl_lookup_enum_by_nr(dfactorRGB), - gl_lookup_enum_by_nr(sfactorA), - gl_lookup_enum_by_nr(dfactorA)); + fprintf(stderr, "glBlendFuncSeparate %s %s %s %s\n", + _mesa_lookup_enum_by_nr(sfactorRGB), + _mesa_lookup_enum_by_nr(dfactorRGB), + _mesa_lookup_enum_by_nr(sfactorA), + _mesa_lookup_enum_by_nr(dfactorA)); switch (sfactorRGB) { case GL_SRC_COLOR: case GL_ONE_MINUS_SRC_COLOR: if (!ctx->Extensions.NV_blend_square) { - gl_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)"); return; } /* fall-through */ @@ -148,10 +153,9 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: - ctx->Color.BlendSrcRGB = sfactorRGB; break; default: - gl_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)"); return; } @@ -159,7 +163,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, case GL_DST_COLOR: case GL_ONE_MINUS_DST_COLOR: if (!ctx->Extensions.NV_blend_square) { - gl_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)"); return; } /* fall-through */ @@ -175,10 +179,9 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: - ctx->Color.BlendDstRGB = dfactorRGB; break; default: - gl_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)"); return; } @@ -186,7 +189,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, case GL_SRC_COLOR: case GL_ONE_MINUS_SRC_COLOR: if (!ctx->Extensions.NV_blend_square) { - gl_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)"); return; } /* fall-through */ @@ -203,10 +206,9 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: - ctx->Color.BlendSrcA = sfactorA; break; default: - gl_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)"); return; } @@ -214,7 +216,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, case GL_DST_COLOR: case GL_ONE_MINUS_DST_COLOR: if (!ctx->Extensions.NV_blend_square) { - gl_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)"); return; } /* fall-through */ @@ -230,14 +232,24 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, case GL_ONE_MINUS_CONSTANT_COLOR: case GL_CONSTANT_ALPHA: case GL_ONE_MINUS_CONSTANT_ALPHA: - ctx->Color.BlendDstA = dfactorA; break; default: - gl_error( ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)" ); + _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)" ); return; } - ctx->NewState |= _NEW_COLOR; + if (ctx->Color.BlendSrcRGB == sfactorRGB && + ctx->Color.BlendDstRGB == dfactorRGB && + ctx->Color.BlendSrcA == sfactorA && + ctx->Color.BlendDstA == dfactorA) + return; + + FLUSH_VERTICES(ctx, _NEW_COLOR); + + ctx->Color.BlendSrcRGB = sfactorRGB; + ctx->Color.BlendDstRGB = dfactorRGB; + ctx->Color.BlendSrcA = sfactorA; + ctx->Color.BlendDstA = dfactorA; if (ctx->Driver.BlendFuncSeparate) { (*ctx->Driver.BlendFuncSeparate)( ctx, sfactorRGB, dfactorRGB, @@ -252,55 +264,56 @@ void _mesa_BlendEquation( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); - ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glBlendEquation"); + ASSERT_OUTSIDE_BEGIN_END(ctx); if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) fprintf(stderr, "glBlendEquation %s\n", - gl_lookup_enum_by_nr(mode)); + _mesa_lookup_enum_by_nr(mode)); switch (mode) { + case GL_FUNC_ADD_EXT: + break; case GL_MIN_EXT: case GL_MAX_EXT: - case GL_FUNC_ADD_EXT: - if (ctx->Extensions.EXT_blend_minmax) { - ctx->Color.BlendEquation = mode; - } - else { - gl_error(ctx, GL_INVALID_ENUM, "glBlendEquation"); + if (!ctx->Extensions.EXT_blend_minmax && + !ctx->Extensions.ARB_imaging) { + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation"); return; } + break; case GL_LOGIC_OP: - ctx->Color.BlendEquation = mode; + if (!ctx->Extensions.EXT_blend_logic_op) { + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation"); + return; + } break; case GL_FUNC_SUBTRACT_EXT: case GL_FUNC_REVERSE_SUBTRACT_EXT: - if (ctx->Extensions.EXT_blend_subtract) { - ctx->Color.BlendEquation = mode; - } - else { - gl_error(ctx, GL_INVALID_ENUM, "glBlendEquation"); + if (!ctx->Extensions.EXT_blend_subtract && + !ctx->Extensions.ARB_imaging) { + _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation"); return; } break; default: - gl_error( ctx, GL_INVALID_ENUM, "glBlendEquation" ); + _mesa_error( ctx, GL_INVALID_ENUM, "glBlendEquation" ); return; } + if (ctx->Color.BlendEquation == mode) + return; + + FLUSH_VERTICES(ctx, _NEW_COLOR); + ctx->Color.BlendEquation = mode; + /* This is needed to support 1.1's RGB logic ops AND * 1.0's blending logicops. */ - if (mode==GL_LOGIC_OP && ctx->Color.BlendEnabled) { - ctx->Color.ColorLogicOpEnabled = GL_TRUE; - } - else { - ctx->Color.ColorLogicOpEnabled = GL_FALSE; - } - - ctx->NewState |= _NEW_COLOR; + ctx->Color.ColorLogicOpEnabled = (mode==GL_LOGIC_OP && + ctx->Color.BlendEnabled); if (ctx->Driver.BlendEquation) - ctx->Driver.BlendEquation( ctx, mode ); + (*ctx->Driver.BlendEquation)( ctx, mode ); } @@ -308,11 +321,21 @@ _mesa_BlendEquation( GLenum mode ) void _mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { + GLfloat tmp[4]; GET_CURRENT_CONTEXT(ctx); - ctx->Color.BlendColor[0] = CLAMP( red, 0.0F, 1.0F ); - ctx->Color.BlendColor[1] = CLAMP( green, 0.0F, 1.0F ); - ctx->Color.BlendColor[2] = CLAMP( blue, 0.0F, 1.0F ); - ctx->Color.BlendColor[3] = CLAMP( alpha, 0.0F, 1.0F ); - ctx->NewState |= _NEW_COLOR; -} + ASSERT_OUTSIDE_BEGIN_END(ctx); + + tmp[0] = CLAMP( red, 0.0, 1.0 ); + tmp[1] = CLAMP( green, 0.0, 1.0 ); + tmp[2] = CLAMP( blue, 0.0, 1.0 ); + tmp[3] = CLAMP( alpha, 0.0, 1.0 ); + if (TEST_EQ_4V(tmp, ctx->Color.BlendColor)) + return; + + FLUSH_VERTICES(ctx, _NEW_COLOR); + COPY_4FV( ctx->Color.BlendColor, tmp ); + + if (ctx->Driver.BlendColor) + (*ctx->Driver.BlendColor)(ctx, tmp); +}