16dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
26dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \file blend.c
36dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Blending operations.
46dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
5afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
8813e56db511e783fcf1ad7bcfd40645451802bd7Brian Paul * Version:  6.5.1
95e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
10813e56db511e783fcf1ad7bcfd40645451802bd7Brian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
32fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "blend.h"
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h"
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "macros.h"
375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
4174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
4274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Check if given blend source factor is legal.
4374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * \return GL_TRUE if legal, GL_FALSE otherwise.
4474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
4574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paulstatic GLboolean
4674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paullegal_src_factor(const struct gl_context *ctx, GLenum factor)
4774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul{
4874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   switch (factor) {
4974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_SRC_COLOR:
5074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
5174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return ctx->Extensions.NV_blend_square;
5274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ZERO:
5374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE:
5474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_DST_COLOR:
5574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_DST_COLOR:
5674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_SRC_ALPHA:
5774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
5874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_DST_ALPHA:
5974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
6074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_SRC_ALPHA_SATURATE:
6101497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick      return GL_TRUE;
6274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_CONSTANT_COLOR:
6374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
6474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_CONSTANT_ALPHA:
6574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
6601497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick      return _mesa_is_desktop_gl(ctx) || ctx->API == API_OPENGLES2;
67f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_SRC1_COLOR:
68f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_SRC1_ALPHA:
69f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_ONE_MINUS_SRC1_COLOR:
70f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_ONE_MINUS_SRC1_ALPHA:
7101497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick      return _mesa_is_desktop_gl(ctx)
7201497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick         && ctx->Extensions.ARB_blend_func_extended;
7374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   default:
7474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_FALSE;
7574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
7674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul}
7774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
7874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
7974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
8074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Check if given blend destination factor is legal.
8174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * \return GL_TRUE if legal, GL_FALSE otherwise.
8274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
8374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paulstatic GLboolean
8474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paullegal_dst_factor(const struct gl_context *ctx, GLenum factor)
8574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul{
8674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   switch (factor) {
8774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_DST_COLOR:
8874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_DST_COLOR:
8974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return ctx->Extensions.NV_blend_square;
9074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ZERO:
9174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE:
9274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_SRC_COLOR:
9374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_SRC_COLOR:
9474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_SRC_ALPHA:
9574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_SRC_ALPHA:
9674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_DST_ALPHA:
9774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_DST_ALPHA:
9801497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick      return GL_TRUE;
9974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_CONSTANT_COLOR:
10074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_CONSTANT_COLOR:
10174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_CONSTANT_ALPHA:
10274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_ONE_MINUS_CONSTANT_ALPHA:
10301497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick      return _mesa_is_desktop_gl(ctx) || ctx->API == API_OPENGLES2;
104f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_SRC_ALPHA_SATURATE:
10501497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick      return (_mesa_is_desktop_gl(ctx)
10601497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick              && ctx->Extensions.ARB_blend_func_extended)
10701497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick         || _mesa_is_gles3(ctx);
108f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_SRC1_COLOR:
109f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_SRC1_ALPHA:
110f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_ONE_MINUS_SRC1_COLOR:
111f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   case GL_ONE_MINUS_SRC1_ALPHA:
11201497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick      return _mesa_is_desktop_gl(ctx)
11301497a356048ce23e089ad8ab8ab0102aae97b3cIan Romanick         && ctx->Extensions.ARB_blend_func_extended;
11474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   default:
11574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_FALSE;
11674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
11774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul}
11874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
11974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
12074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
12174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Check if src/dest RGB/A blend factors are legal.  If not generate
12274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * a GL error.
12374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * \return GL_TRUE if factors are legal, GL_FALSE otherwise.
12474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
12574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paulstatic GLboolean
12674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paulvalidate_blend_factors(struct gl_context *ctx, const char *func,
12774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                       GLenum sfactorRGB, GLenum dfactorRGB,
12874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                       GLenum sfactorA, GLenum dfactorA)
12974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul{
13074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!legal_src_factor(ctx, sfactorRGB)) {
13174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM,
13274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  "%s(sfactorRGB = %s)", func,
13374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  _mesa_lookup_enum_by_nr(sfactorRGB));
13474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_FALSE;
13574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
13674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
13774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!legal_dst_factor(ctx, dfactorRGB)) {
13874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM,
13974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  "%s(dfactorRGB = %s)", func,
14074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  _mesa_lookup_enum_by_nr(dfactorRGB));
14174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_FALSE;
14274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
14374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
14474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (sfactorA != sfactorRGB && !legal_src_factor(ctx, sfactorA)) {
14574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM,
14674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  "%s(sfactorA = %s)", func,
14774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  _mesa_lookup_enum_by_nr(sfactorA));
14874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_FALSE;
14974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
15074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
15174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (dfactorA != dfactorRGB && !legal_dst_factor(ctx, dfactorA)) {
15274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM,
15374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  "%s(dfactorA = %s)", func,
15474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  _mesa_lookup_enum_by_nr(dfactorA));
15574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_FALSE;
15674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
15774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
15874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   return GL_TRUE;
15974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul}
16074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
16174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
1626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Specify the blending operation.
1646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param sfactor source factor operator.
1666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dfactor destination factor operator.
1676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
16820a17e42d7fc9fe65aabe612fe1e513c3103d121Ian Romanick * \sa glBlendFunc, glBlendFuncSeparateEXT
1696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
170c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
171b34024bc6207efb460e621ccd9bc08b944b2c235Brian Paul_mesa_BlendFunc( GLenum sfactor, GLenum dfactor )
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1733a4bed8f088d6f7c558ad187c338cbcd6c692b5dBrian Paul   _mesa_BlendFuncSeparateEXT(sfactor, dfactor, sfactor, dfactor);
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
176175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholtstatic GLboolean
177175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholtblend_factor_is_dual_src(GLenum factor)
178175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt{
179175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt   return (factor == GL_SRC1_COLOR ||
180175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt	   factor == GL_SRC1_ALPHA ||
181175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt	   factor == GL_ONE_MINUS_SRC1_COLOR ||
182175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt	   factor == GL_ONE_MINUS_SRC1_ALPHA);
183175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt}
184175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt
185175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholtstatic void
186175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholtupdate_uses_dual_src(struct gl_context *ctx, int buf)
187175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt{
188175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt   ctx->Color.Blend[buf]._UsesDualSrc =
189175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt      (blend_factor_is_dual_src(ctx->Color.Blend[buf].SrcRGB) ||
190175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt       blend_factor_is_dual_src(ctx->Color.Blend[buf].DstRGB) ||
191175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt       blend_factor_is_dual_src(ctx->Color.Blend[buf].SrcA) ||
192175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt       blend_factor_is_dual_src(ctx->Color.Blend[buf].DstA));
193175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt}
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
19674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Set the separate blend source/dest factors for all draw buffers.
1976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param sfactorRGB RGB source factor operator.
1996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dfactorRGB RGB destination factor operator.
2006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param sfactorA alpha source factor operator.
2016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dfactorA alpha destination factor operator.
2026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
203c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
204ead285a9266bb5f80e68de122490a6afb88df6f3Brian Paul_mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
205ead285a9266bb5f80e68de122490a6afb88df6f3Brian Paul                            GLenum sfactorA, GLenum dfactorA )
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
20774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLuint buf, numBuffers;
20874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLboolean changed;
209fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
210cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
212d66965c9a1e932444c2538b4221df07fea4c557fBrian Paul   if (MESA_VERBOSE & VERBOSE_API)
2134753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glBlendFuncSeparate %s %s %s %s\n",
2144753d60dd070bb08d0116076bcc08025c86ce857Brian Paul                  _mesa_lookup_enum_by_nr(sfactorRGB),
2154753d60dd070bb08d0116076bcc08025c86ce857Brian Paul                  _mesa_lookup_enum_by_nr(dfactorRGB),
2164753d60dd070bb08d0116076bcc08025c86ce857Brian Paul                  _mesa_lookup_enum_by_nr(sfactorA),
2174753d60dd070bb08d0116076bcc08025c86ce857Brian Paul                  _mesa_lookup_enum_by_nr(dfactorA));
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
21974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!validate_blend_factors(ctx, "glBlendFuncSeparate",
22074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                               sfactorRGB, dfactorRGB,
22174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                               sfactorA, dfactorA)) {
22274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
22574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   numBuffers = ctx->Extensions.ARB_draw_buffers_blend
22674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ? ctx->Const.MaxDrawBuffers : 1;
22774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
22874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   changed = GL_FALSE;
22974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   for (buf = 0; buf < numBuffers; buf++) {
23074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      if (ctx->Color.Blend[buf].SrcRGB != sfactorRGB ||
23174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul          ctx->Color.Blend[buf].DstRGB != dfactorRGB ||
23274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul          ctx->Color.Blend[buf].SrcA != sfactorA ||
23374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul          ctx->Color.Blend[buf].DstA != dfactorA) {
23474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul         changed = GL_TRUE;
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
23674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      }
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
23874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!changed)
23974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
24174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   FLUSH_VERTICES(ctx, _NEW_COLOR);
24274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
24374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   for (buf = 0; buf < numBuffers; buf++) {
24474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].SrcRGB = sfactorRGB;
24574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].DstRGB = dfactorRGB;
24674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].SrcA = sfactorA;
24774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].DstA = dfactorA;
248175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt      update_uses_dual_src(ctx, buf);
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
25074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color._BlendFuncPerBuffer = GL_FALSE;
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
25274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (ctx->Driver.BlendFuncSeparate) {
25374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Driver.BlendFuncSeparate(ctx, sfactorRGB, dfactorRGB,
25474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                                    sfactorA, dfactorA);
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
25674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul}
25774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
25974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul#if _HAVE_FULL_GL
26074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
26174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
26274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
26374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Set blend source/dest factors for one color buffer/target.
26474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
26574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paulvoid GLAPIENTRY
26674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul_mesa_BlendFunci(GLuint buf, GLenum sfactor, GLenum dfactor)
26774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul{
26874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   _mesa_BlendFuncSeparatei(buf, sfactor, dfactor, sfactor, dfactor);
26974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul}
27074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
27174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
27274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
27374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Set separate blend source/dest factors for one color buffer/target.
27474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
27574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paulvoid GLAPIENTRY
27674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul_mesa_BlendFuncSeparatei(GLuint buf, GLenum sfactorRGB, GLenum dfactorRGB,
27774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                         GLenum sfactorA, GLenum dfactorA)
27874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul{
27974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GET_CURRENT_CONTEXT(ctx);
28074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
28174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
28274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!ctx->Extensions.ARB_draw_buffers_blend) {
28374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glBlendFunc[Separate]i()");
28474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
28574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
28674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
28774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (buf >= ctx->Const.MaxDrawBuffers) {
28874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glBlendFuncSeparatei(buffer=%u)",
28974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  buf);
290cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
29174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
29274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
29374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!validate_blend_factors(ctx, "glBlendFuncSeparatei",
29474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                               sfactorRGB, dfactorRGB,
29574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                               sfactorA, dfactorA)) {
29674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
29774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
29874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
29974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (ctx->Color.Blend[buf].SrcRGB == sfactorRGB &&
30074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul       ctx->Color.Blend[buf].DstRGB == dfactorRGB &&
30174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul       ctx->Color.Blend[buf].SrcA == sfactorA &&
30274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul       ctx->Color.Blend[buf].DstA == dfactorA)
30374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return; /* no change */
304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
305cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_COLOR);
306cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
30774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].SrcRGB = sfactorRGB;
30874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].DstRGB = dfactorRGB;
30974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].SrcA = sfactorA;
31074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].DstA = dfactorA;
311175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt   update_uses_dual_src(ctx, buf);
31274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color._BlendFuncPerBuffer = GL_TRUE;
31369cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell
31474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (ctx->Driver.BlendFuncSeparatei) {
31574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Driver.BlendFuncSeparatei(ctx, buf, sfactorRGB, dfactorRGB,
31674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                                     sfactorA, dfactorA);
31769cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell   }
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
32174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
32274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Check if given blend equation is legal.
32374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * \return GL_TRUE if legal, GL_FALSE otherwise.
32474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
325c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickstatic GLboolean
326113e8167de4500ea8b12176a938cbc4753f3a923Ian Romanicklegal_blend_equation(const struct gl_context *ctx, GLenum mode)
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
328a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   switch (mode) {
32974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_FUNC_ADD:
330b0824bd860f6d4b3ad28fc142c2eebd840ed6173Ian Romanick   case GL_FUNC_SUBTRACT:
331b0824bd860f6d4b3ad28fc142c2eebd840ed6173Ian Romanick   case GL_FUNC_REVERSE_SUBTRACT:
33274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_TRUE;
33374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_MIN:
33474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   case GL_MAX:
33574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return ctx->Extensions.EXT_blend_minmax;
33674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   default:
33774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return GL_FALSE;
338c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   }
339c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick}
340c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
341c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
342c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick/* This is really an extension function! */
343c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickvoid GLAPIENTRY
344c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick_mesa_BlendEquation( GLenum mode )
345c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick{
34674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLuint buf, numBuffers;
34774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLboolean changed;
348c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   GET_CURRENT_CONTEXT(ctx);
349c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   ASSERT_OUTSIDE_BEGIN_END(ctx);
350c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
351d66965c9a1e932444c2538b4221df07fea4c557fBrian Paul   if (MESA_VERBOSE & VERBOSE_API)
3522634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul      _mesa_debug(ctx, "glBlendEquation(%s)\n",
353c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick                  _mesa_lookup_enum_by_nr(mode));
354c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
355113e8167de4500ea8b12176a938cbc4753f3a923Ian Romanick   if (!legal_blend_equation(ctx, mode)) {
356c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation");
357c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      return;
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
36074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   numBuffers = ctx->Extensions.ARB_draw_buffers_blend
36174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ? ctx->Const.MaxDrawBuffers : 1;
36274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
36374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   changed = GL_FALSE;
36474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   for (buf = 0; buf < numBuffers; buf++) {
36574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      if (ctx->Color.Blend[buf].EquationRGB != mode ||
36674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul          ctx->Color.Blend[buf].EquationA != mode) {
36774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul         changed = GL_TRUE;
36874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul         break;
36974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      }
37074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
37174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!changed)
372cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
373be3d539dac3948458931be63fa3e97e072871550Brian Paul
374cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_COLOR);
37574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   for (buf = 0; buf < numBuffers; buf++) {
37674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].EquationRGB = mode;
37774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].EquationA = mode;
37874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
37974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color._BlendEquationPerBuffer = GL_FALSE;
380cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
381c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   if (ctx->Driver.BlendEquationSeparate)
382c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      (*ctx->Driver.BlendEquationSeparate)( ctx, mode, mode );
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
385a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul
38674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
38774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Set blend equation for one color buffer/target.
38874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
38974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paulvoid GLAPIENTRY
39074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul_mesa_BlendEquationi(GLuint buf, GLenum mode)
39174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul{
39274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GET_CURRENT_CONTEXT(ctx);
39374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
39474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
39574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (MESA_VERBOSE & VERBOSE_API)
39674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_debug(ctx, "glBlendEquationi(%u, %s)\n",
39774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  buf, _mesa_lookup_enum_by_nr(mode));
39874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
39974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (buf >= ctx->Const.MaxDrawBuffers) {
40074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glBlendFuncSeparatei(buffer=%u)",
40174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  buf);
40274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
40374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
40474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
405113e8167de4500ea8b12176a938cbc4753f3a923Ian Romanick   if (!legal_blend_equation(ctx, mode)) {
40674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquationi");
40774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
40874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
40974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
41074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (ctx->Color.Blend[buf].EquationRGB == mode &&
41174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul       ctx->Color.Blend[buf].EquationA == mode)
41274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;  /* no change */
41374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
41474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   FLUSH_VERTICES(ctx, _NEW_COLOR);
41574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].EquationRGB = mode;
41674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].EquationA = mode;
41774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color._BlendEquationPerBuffer = GL_TRUE;
41874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
41974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (ctx->Driver.BlendEquationSeparatei)
42074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Driver.BlendEquationSeparatei(ctx, buf, mode, mode);
42174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul}
42274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
42374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
424c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanickvoid GLAPIENTRY
425c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick_mesa_BlendEquationSeparateEXT( GLenum modeRGB, GLenum modeA )
426c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick{
42774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLuint buf, numBuffers;
42874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLboolean changed;
429c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   GET_CURRENT_CONTEXT(ctx);
430c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   ASSERT_OUTSIDE_BEGIN_END(ctx);
431c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
432d66965c9a1e932444c2538b4221df07fea4c557fBrian Paul   if (MESA_VERBOSE & VERBOSE_API)
4332634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul      _mesa_debug(ctx, "glBlendEquationSeparateEXT(%s %s)\n",
434c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick                  _mesa_lookup_enum_by_nr(modeRGB),
435c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick                  _mesa_lookup_enum_by_nr(modeA));
436c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
437c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   if ( (modeRGB != modeA) && !ctx->Extensions.EXT_blend_equation_separate ) {
438c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      _mesa_error(ctx, GL_INVALID_OPERATION,
439c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick		  "glBlendEquationSeparateEXT not supported by driver");
440c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      return;
441c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   }
442c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
443113e8167de4500ea8b12176a938cbc4753f3a923Ian Romanick   if (!legal_blend_equation(ctx, modeRGB)) {
444c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquationSeparateEXT(modeRGB)");
445c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      return;
446c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   }
447c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
448113e8167de4500ea8b12176a938cbc4753f3a923Ian Romanick   if (!legal_blend_equation(ctx, modeA)) {
449c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquationSeparateEXT(modeA)");
450c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      return;
451c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   }
452c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
45374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   numBuffers = ctx->Extensions.ARB_draw_buffers_blend
45474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ? ctx->Const.MaxDrawBuffers : 1;
455c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
45674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   changed = GL_FALSE;
45774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   for (buf = 0; buf < numBuffers; buf++) {
45874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      if (ctx->Color.Blend[buf].EquationRGB != modeRGB ||
45974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul          ctx->Color.Blend[buf].EquationA != modeA) {
46074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul         changed = GL_TRUE;
46174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul         break;
46274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      }
46374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
46474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (!changed)
465c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick      return;
466c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
467c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   FLUSH_VERTICES(ctx, _NEW_COLOR);
46874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   for (buf = 0; buf < numBuffers; buf++) {
46974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].EquationRGB = modeRGB;
47074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[buf].EquationA = modeA;
47174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
47274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color._BlendEquationPerBuffer = GL_FALSE;
473c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick
474c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick   if (ctx->Driver.BlendEquationSeparate)
47574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Driver.BlendEquationSeparate(ctx, modeRGB, modeA);
476c93105eb9e2499efb237fd89dba0cebd48f18375Ian Romanick}
47774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
47874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
47974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul/**
48074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Set separate blend equations for one color buffer/target.
48174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul */
482f4a98688113ef189ed2017b12d41915e2bc034deJosé Fonsecavoid GLAPIENTRY
48374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul_mesa_BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeA)
48474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul{
48574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GET_CURRENT_CONTEXT(ctx);
48674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
48774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
48874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (MESA_VERBOSE & VERBOSE_API)
4892634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul      _mesa_debug(ctx, "glBlendEquationSeparatei(%u, %s %s)\n", buf,
49074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  _mesa_lookup_enum_by_nr(modeRGB),
49174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  _mesa_lookup_enum_by_nr(modeA));
49274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
49374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (buf >= ctx->Const.MaxDrawBuffers) {
49474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glBlendEquationSeparatei(buffer=%u)",
49574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                  buf);
49674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
49774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
49874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
499113e8167de4500ea8b12176a938cbc4753f3a923Ian Romanick   if (!legal_blend_equation(ctx, modeRGB)) {
50074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquationSeparatei(modeRGB)");
50174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
50274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
50374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
504113e8167de4500ea8b12176a938cbc4753f3a923Ian Romanick   if (!legal_blend_equation(ctx, modeA)) {
50574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquationSeparatei(modeA)");
50674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;
50774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
50874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
50974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (ctx->Color.Blend[buf].EquationRGB == modeRGB &&
51074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul       ctx->Color.Blend[buf].EquationA == modeA)
51174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      return;  /* no change */
51274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
51374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   FLUSH_VERTICES(ctx, _NEW_COLOR);
51474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].EquationRGB = modeRGB;
51574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color.Blend[buf].EquationA = modeA;
51674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   ctx->Color._BlendEquationPerBuffer = GL_TRUE;
51774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
51874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   if (ctx->Driver.BlendEquationSeparatei)
51974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Driver.BlendEquationSeparatei(ctx, buf, modeRGB, modeA);
52074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul}
52174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
52274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
52374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
52474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul#endif /* _HAVE_FULL_GL */
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
5286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Set the blending color.
5296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param red red color component.
5316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param green green color component.
5326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param blue blue color component.
5336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param alpha alpha color component.
5346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glBlendColor().
5366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Clamps the parameters and updates gl_colorbuffer_attrib::BlendColor.  On a
5386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * change, flushes the vertices and notifies the driver via
5396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::BlendColor callback.
5406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
541c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
542ead285a9266bb5f80e68de122490a6afb88df6f3Brian Paul_mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
544cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat tmp[4];
545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
546cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
547cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
548e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   tmp[0] = red;
549e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   tmp[1] = green;
550e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   tmp[2] = blue;
551e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   tmp[3] = alpha;
552cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
553e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   if (TEST_EQ_4V(tmp, ctx->Color.BlendColorUnclamped))
554cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return;
555cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
556cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_COLOR);
557e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   COPY_4FV( ctx->Color.BlendColorUnclamped, tmp );
558e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
559e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   ctx->Color.BlendColor[0] = CLAMP(tmp[0], 0.0F, 1.0F);
560e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   ctx->Color.BlendColor[1] = CLAMP(tmp[1], 0.0F, 1.0F);
561e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   ctx->Color.BlendColor[2] = CLAMP(tmp[2], 0.0F, 1.0F);
562e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   ctx->Color.BlendColor[3] = CLAMP(tmp[3], 0.0F, 1.0F);
563be3d539dac3948458931be63fa3e97e072871550Brian Paul
564be3d539dac3948458931be63fa3e97e072871550Brian Paul   if (ctx->Driver.BlendColor)
565e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      (*ctx->Driver.BlendColor)(ctx, ctx->Color.BlendColor);
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
5671b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
5681b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
5696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
5706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Specify the alpha test function.
5716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param func alpha comparison function.
5736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ref reference value.
5746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies the parameters and updates gl_colorbuffer_attrib.
5766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * On a change, flushes the vertices and notifies the driver via
5776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::AlphaFunc callback.
5786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
579c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
5801b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul_mesa_AlphaFunc( GLenum func, GLclampf ref )
5811b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul{
5821b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   GET_CURRENT_CONTEXT(ctx);
5831b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
5841b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
5852634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul   if (MESA_VERBOSE & VERBOSE_API)
5862634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul      _mesa_debug(ctx, "glAlphaFunc(%s, %f)\n",
5872634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul                  _mesa_lookup_enum_by_nr(func), ref);
5882634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul
5891b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   switch (func) {
5901b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_NEVER:
5911b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_LESS:
5921b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_EQUAL:
5931b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_LEQUAL:
5941b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_GREATER:
5951b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_NOTEQUAL:
5961b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_GEQUAL:
5971b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   case GL_ALWAYS:
598e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      if (ctx->Color.AlphaFunc == func && ctx->Color.AlphaRefUnclamped == ref)
599fc80ad6e62fb2b53d53756593099330477a44c52Brian Paul         return; /* no change */
6001b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6011b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      FLUSH_VERTICES(ctx, _NEW_COLOR);
6021b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      ctx->Color.AlphaFunc = func;
603e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      ctx->Color.AlphaRefUnclamped = ref;
604e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      ctx->Color.AlphaRef = CLAMP(ref, 0.0F, 1.0F);
6051b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6061b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      if (ctx->Driver.AlphaFunc)
607e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák         ctx->Driver.AlphaFunc(ctx, func, ctx->Color.AlphaRef);
6081b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      return;
6091b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6101b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   default:
6111b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glAlphaFunc(func)" );
6121b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      return;
6131b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   }
6141b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul}
6151b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6161b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
6186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Specify a logic pixel operation for color index rendering.
6196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param opcode operation.
6216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies that \p opcode is a valid enum and updates
6236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellgl_colorbuffer_attrib::LogicOp.
6246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * On a change, flushes the vertices and notifies the driver via the
6256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::LogicOpcode callback.
6266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
627c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
6281b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul_mesa_LogicOp( GLenum opcode )
6291b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul{
6301b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   GET_CURRENT_CONTEXT(ctx);
6311b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
6321b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6332634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul   if (MESA_VERBOSE & VERBOSE_API)
6342634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul      _mesa_debug(ctx, "glLogicOp(%s)\n", _mesa_lookup_enum_by_nr(opcode));
6352634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul
6361b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   switch (opcode) {
6371b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_CLEAR:
6381b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_SET:
6391b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_COPY:
6401b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_COPY_INVERTED:
6411b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_NOOP:
6421b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_INVERT:
6431b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_AND:
6441b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_NAND:
6451b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_OR:
6461b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_NOR:
6471b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_XOR:
6481b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_EQUIV:
6491b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_AND_REVERSE:
6501b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_AND_INVERTED:
6511b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_OR_REVERSE:
6521b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      case GL_OR_INVERTED:
6531b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul	 break;
6541b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      default:
6551b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glLogicOp" );
6561b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul	 return;
6571b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   }
6581b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6591b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   if (ctx->Color.LogicOp == opcode)
6601b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      return;
6611b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6621b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   FLUSH_VERTICES(ctx, _NEW_COLOR);
6631b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   ctx->Color.LogicOp = opcode;
6641b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6651b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   if (ctx->Driver.LogicOpcode)
6661b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      ctx->Driver.LogicOpcode( ctx, opcode );
6671b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul}
6681b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
670c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
6711b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul_mesa_IndexMask( GLuint mask )
6721b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul{
6731b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   GET_CURRENT_CONTEXT(ctx);
6741b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
6751b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6761b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   if (ctx->Color.IndexMask == mask)
6771b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      return;
6781b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6791b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   FLUSH_VERTICES(ctx, _NEW_COLOR);
6801b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   ctx->Color.IndexMask = mask;
6811b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul}
6826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif
6831b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6841b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
6856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
6866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Enable or disable writing of frame buffer color components.
6876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param red whether to mask writing of the red color component.
6896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param green whether to mask writing of the green color component.
6906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param blue whether to mask writing of the blue color component.
6916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param alpha whether to mask writing of the alpha color component.
6926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glColorMask().
6946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
6956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Sets the appropriate value of gl_colorbuffer_attrib::ColorMask.  On a
6966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * change, flushes the vertices and notifies the driver via the
6976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::ColorMask callback.
6986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
699c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7001b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul_mesa_ColorMask( GLboolean red, GLboolean green,
7011b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul                 GLboolean blue, GLboolean alpha )
7021b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul{
7031b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   GET_CURRENT_CONTEXT(ctx);
7041b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   GLubyte tmp[4];
705fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   GLuint i;
706fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   GLboolean flushed;
7071b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
7081b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
7091b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   if (MESA_VERBOSE & VERBOSE_API)
7102634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul      _mesa_debug(ctx, "glColorMask(%d, %d, %d, %d)\n",
7112634e92dc0cecc364984bef9169a91bb96bafdcdBrian Paul                  red, green, blue, alpha);
7121b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
7131b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   /* Shouldn't have any information about channel depth in core mesa
7141b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul    * -- should probably store these as the native booleans:
7151b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul    */
7161b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   tmp[RCOMP] = red    ? 0xff : 0x0;
7171b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   tmp[GCOMP] = green  ? 0xff : 0x0;
7181b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   tmp[BCOMP] = blue   ? 0xff : 0x0;
7191b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   tmp[ACOMP] = alpha  ? 0xff : 0x0;
7201b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
721fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   flushed = GL_FALSE;
722fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
723fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      if (!TEST_EQ_4V(tmp, ctx->Color.ColorMask[i])) {
724fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul         if (!flushed) {
725fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul            FLUSH_VERTICES(ctx, _NEW_COLOR);
726fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul         }
727fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul         flushed = GL_TRUE;
728fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul         COPY_4UBV(ctx->Color.ColorMask[i], tmp);
729fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      }
730fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   }
731fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
732fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   if (ctx->Driver.ColorMask)
733fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      ctx->Driver.ColorMask( ctx, red, green, blue, alpha );
734fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul}
735fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
736fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
737fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul/**
738fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul * For GL_EXT_draw_buffers2 and GL3
739fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul */
740fd5511d27fc44096117c47ab503fb5b47f993061Brian Paulvoid GLAPIENTRY
741fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul_mesa_ColorMaskIndexed( GLuint buf, GLboolean red, GLboolean green,
742fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul                        GLboolean blue, GLboolean alpha )
743fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul{
744fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   GLubyte tmp[4];
745fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   GET_CURRENT_CONTEXT(ctx);
746fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
747fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
748fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   if (MESA_VERBOSE & VERBOSE_API)
749fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      _mesa_debug(ctx, "glColorMaskIndexed %u %d %d %d %d\n",
750fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul                  buf, red, green, blue, alpha);
751fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
752fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   if (buf >= ctx->Const.MaxDrawBuffers) {
753fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glColorMaskIndexed(buf=%u)", buf);
754fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      return;
755fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   }
756fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
757fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   /* Shouldn't have any information about channel depth in core mesa
758fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul    * -- should probably store these as the native booleans:
759fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul    */
760fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   tmp[RCOMP] = red    ? 0xff : 0x0;
761fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   tmp[GCOMP] = green  ? 0xff : 0x0;
762fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   tmp[BCOMP] = blue   ? 0xff : 0x0;
763fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   tmp[ACOMP] = alpha  ? 0xff : 0x0;
764fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul
765fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   if (TEST_EQ_4V(tmp, ctx->Color.ColorMask[buf]))
7661b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul      return;
7671b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
7681b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul   FLUSH_VERTICES(ctx, _NEW_COLOR);
769fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   COPY_4UBV(ctx->Color.ColorMask[buf], tmp);
7701b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul
771fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   if (ctx->Driver.ColorMaskIndexed)
772fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul      ctx->Driver.ColorMaskIndexed(ctx, buf, red, green, blue, alpha);
7731b258989462e907e45abbdf8743b0a75f22c02b3Brian Paul}
7746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
775a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul
776e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšákvoid GLAPIENTRY
7770b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul_mesa_ClampColorARB(GLenum target, GLenum clamp)
7780b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul{
7790b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   GET_CURRENT_CONTEXT(ctx);
7800b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul
7810b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
7820b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul
7830b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   if (clamp != GL_TRUE && clamp != GL_FALSE && clamp != GL_FIXED_ONLY_ARB) {
7840b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glClampColorARB(clamp)");
7850b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      return;
7860b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   }
7870b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul
7880b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   switch (target) {
7890b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   case GL_CLAMP_VERTEX_COLOR_ARB:
790e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      FLUSH_VERTICES(ctx, _NEW_LIGHT);
7910b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      ctx->Light.ClampVertexColor = clamp;
7920b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      break;
7930b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   case GL_CLAMP_FRAGMENT_COLOR_ARB:
794e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      FLUSH_VERTICES(ctx, _NEW_FRAG_CLAMP);
7950b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      ctx->Color.ClampFragmentColor = clamp;
7960b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      break;
7970b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   case GL_CLAMP_READ_COLOR_ARB:
798e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      FLUSH_VERTICES(ctx, _NEW_COLOR);
7990b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      ctx->Color.ClampReadColor = clamp;
8000b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      break;
8010b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   default:
8020b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glClampColorARB(target)");
8030b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul      return;
8040b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul   }
8050b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul}
8060b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul
8070b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul
8080b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul
8090b26e826bda0da7aeec9a79ee07fe21d54bb1263Brian Paul
8106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
8116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Initialization */
8126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/
8136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
815894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul * Initialization of the context's Color attribute group.
8166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
8176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context.
8186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
8196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initializes the related fields in the context color attribute group,
820f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * __struct gl_contextRec::Color.
8216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
822f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _mesa_init_color( struct gl_context * ctx )
8236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
82474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   GLuint i;
82574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
8266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Color buffer group */
827a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   ctx->Color.IndexMask = ~0u;
828fd5511d27fc44096117c47ab503fb5b47f993061Brian Paul   memset(ctx->Color.ColorMask, 0xff, sizeof(ctx->Color.ColorMask));
8296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.ClearIndex = 0;
830093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie   ASSIGN_4V( ctx->Color.ClearColor.f, 0, 0, 0, 0 );
8316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.AlphaEnabled = GL_FALSE;
8326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.AlphaFunc = GL_ALWAYS;
8336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.AlphaRef = 0;
8343728673bd1b974e54858fbab6ff62d3607b0d3f0Brian Paul   ctx->Color.BlendEnabled = 0x0;
83574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   for (i = 0; i < Elements(ctx->Color.Blend); i++) {
83674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[i].SrcRGB = GL_ONE;
83774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[i].DstRGB = GL_ZERO;
83874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[i].SrcA = GL_ONE;
83974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[i].DstA = GL_ZERO;
84074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[i].EquationRGB = GL_FUNC_ADD;
84174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul      ctx->Color.Blend[i].EquationA = GL_FUNC_ADD;
84274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul   }
8436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
844e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   ASSIGN_4V( ctx->Color.BlendColorUnclamped, 0.0, 0.0, 0.0, 0.0 );
8456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.IndexLogicOpEnabled = GL_FALSE;
8466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.ColorLogicOpEnabled = GL_FALSE;
8476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.LogicOp = GL_COPY;
8486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Color.DitherFlag = GL_TRUE;
8496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   if (ctx->Visual.doubleBufferMode) {
85153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul      ctx->Color.DrawBuffer[0] = GL_BACK;
8526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   }
8536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   else {
85453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul      ctx->Color.DrawBuffer[0] = GL_FRONT;
8556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   }
856ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
857ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   ctx->Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
858e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   ctx->Color._ClampFragmentColor = GL_TRUE;
859ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   ctx->Color.ClampReadColor = GL_FIXED_ONLY_ARB;
860e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   ctx->Color._ClampReadColor = GL_TRUE;
8616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
8626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/
864