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