16debc8078a7170c26d826e62e2b6542e85813a6cBrian/************************************************************************** 26debc8078a7170c26d826e62e2b6542e85813a6cBrian * 36debc8078a7170c26d826e62e2b6542e85813a6cBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 46debc8078a7170c26d826e62e2b6542e85813a6cBrian * All Rights Reserved. 56debc8078a7170c26d826e62e2b6542e85813a6cBrian * 66debc8078a7170c26d826e62e2b6542e85813a6cBrian * Permission is hereby granted, free of charge, to any person obtaining a 76debc8078a7170c26d826e62e2b6542e85813a6cBrian * copy of this software and associated documentation files (the 86debc8078a7170c26d826e62e2b6542e85813a6cBrian * "Software"), to deal in the Software without restriction, including 96debc8078a7170c26d826e62e2b6542e85813a6cBrian * without limitation the rights to use, copy, modify, merge, publish, 106debc8078a7170c26d826e62e2b6542e85813a6cBrian * distribute, sub license, and/or sell copies of the Software, and to 116debc8078a7170c26d826e62e2b6542e85813a6cBrian * permit persons to whom the Software is furnished to do so, subject to 126debc8078a7170c26d826e62e2b6542e85813a6cBrian * the following conditions: 136debc8078a7170c26d826e62e2b6542e85813a6cBrian * 146debc8078a7170c26d826e62e2b6542e85813a6cBrian * The above copyright notice and this permission notice (including the 156debc8078a7170c26d826e62e2b6542e85813a6cBrian * next paragraph) shall be included in all copies or substantial portions 166debc8078a7170c26d826e62e2b6542e85813a6cBrian * of the Software. 176debc8078a7170c26d826e62e2b6542e85813a6cBrian * 186debc8078a7170c26d826e62e2b6542e85813a6cBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 196debc8078a7170c26d826e62e2b6542e85813a6cBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 206debc8078a7170c26d826e62e2b6542e85813a6cBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 216debc8078a7170c26d826e62e2b6542e85813a6cBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 226debc8078a7170c26d826e62e2b6542e85813a6cBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 236debc8078a7170c26d826e62e2b6542e85813a6cBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 246debc8078a7170c26d826e62e2b6542e85813a6cBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 256debc8078a7170c26d826e62e2b6542e85813a6cBrian * 266debc8078a7170c26d826e62e2b6542e85813a6cBrian **************************************************************************/ 276debc8078a7170c26d826e62e2b6542e85813a6cBrian 286debc8078a7170c26d826e62e2b6542e85813a6cBrian /* 296debc8078a7170c26d826e62e2b6542e85813a6cBrian * Authors: 306debc8078a7170c26d826e62e2b6542e85813a6cBrian * Keith Whitwell <keith@tungstengraphics.com> 316debc8078a7170c26d826e62e2b6542e85813a6cBrian * Brian Paul 326debc8078a7170c26d826e62e2b6542e85813a6cBrian */ 336debc8078a7170c26d826e62e2b6542e85813a6cBrian 346debc8078a7170c26d826e62e2b6542e85813a6cBrian 356debc8078a7170c26d826e62e2b6542e85813a6cBrian#include "st_context.h" 366debc8078a7170c26d826e62e2b6542e85813a6cBrian#include "st_atom.h" 37e16c045b83f5c5b4f4064df67623bb76b46b6619Zack Rusin 38943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell#include "pipe/p_context.h" 39943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell#include "pipe/p_defines.h" 40339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 416debc8078a7170c26d826e62e2b6542e85813a6cBrian 427d95efde0a0e13e13c59444703bc47eb13926385Brian#include "main/macros.h" 436debc8078a7170c26d826e62e2b6542e85813a6cBrian 446debc8078a7170c26d826e62e2b6542e85813a6cBrian/** 45943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell * Convert GLenum blend tokens to pipe tokens. 466debc8078a7170c26d826e62e2b6542e85813a6cBrian * Both blend factors and blend funcs are accepted. 476debc8078a7170c26d826e62e2b6542e85813a6cBrian */ 486debc8078a7170c26d826e62e2b6542e85813a6cBrianstatic GLuint 49ce0f2e88e3f71427dabf0dc37900ce0b47ae8003Briantranslate_blend(GLenum blend) 506debc8078a7170c26d826e62e2b6542e85813a6cBrian{ 516debc8078a7170c26d826e62e2b6542e85813a6cBrian switch (blend) { 526debc8078a7170c26d826e62e2b6542e85813a6cBrian /* blend functions */ 536debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_FUNC_ADD: 54943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLEND_ADD; 556debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_FUNC_SUBTRACT: 56943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLEND_SUBTRACT; 576debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_FUNC_REVERSE_SUBTRACT: 58943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLEND_REVERSE_SUBTRACT; 596debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_MIN: 60943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLEND_MIN; 616debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_MAX: 62943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLEND_MAX; 636debc8078a7170c26d826e62e2b6542e85813a6cBrian 646debc8078a7170c26d826e62e2b6542e85813a6cBrian /* blend factors */ 656debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_ONE: 66943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_ONE; 676debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_SRC_COLOR: 68943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_SRC_COLOR; 696debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_SRC_ALPHA: 70943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_SRC_ALPHA; 716debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_DST_ALPHA: 72943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_DST_ALPHA; 736debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_DST_COLOR: 74943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_DST_COLOR; 756debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_SRC_ALPHA_SATURATE: 76943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE; 776debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_CONSTANT_COLOR: 78943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_CONST_COLOR; 796debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_CONSTANT_ALPHA: 80943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_CONST_ALPHA; 81a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie case GL_SRC1_COLOR: 82943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_SRC1_COLOR; 83a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie case GL_SRC1_ALPHA: 84943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_SRC1_ALPHA; 856debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_ZERO: 86943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_ZERO; 876debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_ONE_MINUS_SRC_COLOR: 88943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_INV_SRC_COLOR; 896debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_ONE_MINUS_SRC_ALPHA: 90943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_INV_SRC_ALPHA; 916debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_ONE_MINUS_DST_COLOR: 92943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_INV_DST_COLOR; 93ce0f2e88e3f71427dabf0dc37900ce0b47ae8003Brian case GL_ONE_MINUS_DST_ALPHA: 94ce0f2e88e3f71427dabf0dc37900ce0b47ae8003Brian return PIPE_BLENDFACTOR_INV_DST_ALPHA; 956debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_ONE_MINUS_CONSTANT_COLOR: 96943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_INV_CONST_COLOR; 976debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_ONE_MINUS_CONSTANT_ALPHA: 98943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_INV_CONST_ALPHA; 99a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie case GL_ONE_MINUS_SRC1_COLOR: 100943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_INV_SRC1_COLOR; 101a21df965075f6fa1bf27039490ad65b9f78548e6Dave Airlie case GL_ONE_MINUS_SRC1_ALPHA: 102943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_BLENDFACTOR_INV_SRC1_ALPHA; 1036debc8078a7170c26d826e62e2b6542e85813a6cBrian default: 104ce0f2e88e3f71427dabf0dc37900ce0b47ae8003Brian assert("invalid GL token in translate_blend()" == NULL); 1056debc8078a7170c26d826e62e2b6542e85813a6cBrian return 0; 1066debc8078a7170c26d826e62e2b6542e85813a6cBrian } 1076debc8078a7170c26d826e62e2b6542e85813a6cBrian} 1086debc8078a7170c26d826e62e2b6542e85813a6cBrian 1096debc8078a7170c26d826e62e2b6542e85813a6cBrian 1106debc8078a7170c26d826e62e2b6542e85813a6cBrian/** 111943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell * Convert GLenum logicop tokens to pipe tokens. 1126debc8078a7170c26d826e62e2b6542e85813a6cBrian */ 1136debc8078a7170c26d826e62e2b6542e85813a6cBrianstatic GLuint 114ce0f2e88e3f71427dabf0dc37900ce0b47ae8003Briantranslate_logicop(GLenum logicop) 1156debc8078a7170c26d826e62e2b6542e85813a6cBrian{ 1166debc8078a7170c26d826e62e2b6542e85813a6cBrian switch (logicop) { 1176debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_CLEAR: 118943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_CLEAR; 1196debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_NOR: 120943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_NOR; 1216debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_AND_INVERTED: 122943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_AND_INVERTED; 1236debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_COPY_INVERTED: 124943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_COPY_INVERTED; 1256debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_AND_REVERSE: 126943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_AND_REVERSE; 1276debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_INVERT: 128943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_INVERT; 1296debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_XOR: 130943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_XOR; 1316debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_NAND: 132943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_NAND; 1336debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_AND: 134943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_AND; 1356debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_EQUIV: 136943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_EQUIV; 1376debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_NOOP: 138943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_NOOP; 1396debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_OR_INVERTED: 140943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_OR_INVERTED; 1416debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_COPY: 142943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_COPY; 1436debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_OR_REVERSE: 144943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_OR_REVERSE; 1456debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_OR: 146943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_OR; 1476debc8078a7170c26d826e62e2b6542e85813a6cBrian case GL_SET: 148943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell return PIPE_LOGICOP_SET; 1496debc8078a7170c26d826e62e2b6542e85813a6cBrian default: 150ce0f2e88e3f71427dabf0dc37900ce0b47ae8003Brian assert("invalid GL token in translate_logicop()" == NULL); 1516debc8078a7170c26d826e62e2b6542e85813a6cBrian return 0; 1526debc8078a7170c26d826e62e2b6542e85813a6cBrian } 1536debc8078a7170c26d826e62e2b6542e85813a6cBrian} 1546debc8078a7170c26d826e62e2b6542e85813a6cBrian 1559bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger/** 1569bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger * Figure out if colormasks are different per rt. 1579bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger */ 1589bc80ff17496feda3b47cf40e577976237f87957Roland Scheideggerstatic GLboolean 15999feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paulcolormask_per_rt(const struct gl_context *ctx) 1605fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger{ 1619bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger /* a bit suboptimal have to compare lots of values */ 1625fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger unsigned i; 1635fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger for (i = 1; i < ctx->Const.MaxDrawBuffers; i++) { 1649bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger if (memcmp(ctx->Color.ColorMask[0], ctx->Color.ColorMask[i], 4)) { 1659bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger return GL_TRUE; 1665fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 1675fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 1689bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger return GL_FALSE; 1699bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger} 1709bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger 1719bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger/** 17274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul * Figure out if blend enables/state are different per rt. 1739bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger */ 1749bc80ff17496feda3b47cf40e577976237f87957Roland Scheideggerstatic GLboolean 17599feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paulblend_per_rt(const struct gl_context *ctx) 1769bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger{ 1779bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger if (ctx->Color.BlendEnabled && 1789bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger (ctx->Color.BlendEnabled != ((1 << ctx->Const.MaxDrawBuffers) - 1))) { 17974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul /* This can only happen if GL_EXT_draw_buffers2 is enabled */ 18074713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul return GL_TRUE; 18174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul } 18274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul if (ctx->Color._BlendFuncPerBuffer || ctx->Color._BlendEquationPerBuffer) { 18374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul /* this can only happen if GL_ARB_draw_buffers_blend is enabled */ 1849bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger return GL_TRUE; 1859bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger } 1869bc80ff17496feda3b47cf40e577976237f87957Roland Scheidegger return GL_FALSE; 1875fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger} 1886debc8078a7170c26d826e62e2b6542e85813a6cBrian 1896debc8078a7170c26d826e62e2b6542e85813a6cBrianstatic void 1906debc8078a7170c26d826e62e2b6542e85813a6cBrianupdate_blend( struct st_context *st ) 1916debc8078a7170c26d826e62e2b6542e85813a6cBrian{ 192339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_blend_state *blend = &st->state.blend; 19399feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul const struct gl_context *ctx = st->ctx; 1945fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger unsigned num_state = 1; 195a476ca1fd1b4e76e31c9babfd7fb2a54a09f21d3Fabian Bieler unsigned i, j; 1966debc8078a7170c26d826e62e2b6542e85813a6cBrian 197339e7ec6805e6de8794514c0a935081b5d36d38fBrian memset(blend, 0, sizeof(*blend)); 1986debc8078a7170c26d826e62e2b6542e85813a6cBrian 19999feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (blend_per_rt(ctx) || colormask_per_rt(ctx)) { 20099feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul num_state = ctx->Const.MaxDrawBuffers; 2015fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->independent_blend_enable = 1; 2025fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 2033538bffa7287ebef5f2dc4d2e4491aaf6e68b09eIan Romanick if (ctx->Color.ColorLogicOpEnabled) { 2046debc8078a7170c26d826e62e2b6542e85813a6cBrian /* logicop enabled */ 205339e7ec6805e6de8794514c0a935081b5d36d38fBrian blend->logicop_enable = 1; 20699feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul blend->logicop_func = translate_logicop(ctx->Color.LogicOp); 2076debc8078a7170c26d826e62e2b6542e85813a6cBrian } 20899feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul else if (ctx->Color.BlendEnabled) { 2096debc8078a7170c26d826e62e2b6542e85813a6cBrian /* blending enabled */ 210a476ca1fd1b4e76e31c9babfd7fb2a54a09f21d3Fabian Bieler for (i = 0, j = 0; i < num_state; i++) { 2116debc8078a7170c26d826e62e2b6542e85813a6cBrian 21299feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul blend->rt[i].blend_enable = (ctx->Color.BlendEnabled >> i) & 0x1; 2135fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger 21499feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Extensions.ARB_draw_buffers_blend) 215a476ca1fd1b4e76e31c9babfd7fb2a54a09f21d3Fabian Bieler j = i; 216a476ca1fd1b4e76e31c9babfd7fb2a54a09f21d3Fabian Bieler 21774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul blend->rt[i].rgb_func = 21899feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul translate_blend(ctx->Color.Blend[j].EquationRGB); 21974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul 22099feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Color.Blend[i].EquationRGB == GL_MIN || 22199feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul ctx->Color.Blend[i].EquationRGB == GL_MAX) { 2225fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger /* Min/max are special */ 2235fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 2245fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ONE; 2255fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 2265fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger else { 22774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul blend->rt[i].rgb_src_factor = 22899feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul translate_blend(ctx->Color.Blend[j].SrcRGB); 22974713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul blend->rt[i].rgb_dst_factor = 23099feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul translate_blend(ctx->Color.Blend[j].DstRGB); 2315fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 2325fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger 23374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul blend->rt[i].alpha_func = 23499feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul translate_blend(ctx->Color.Blend[j].EquationA); 23574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul 23699feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Color.Blend[i].EquationA == GL_MIN || 23799feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul ctx->Color.Blend[i].EquationA == GL_MAX) { 2385fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger /* Min/max are special */ 2395fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 2405fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ONE; 2415fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 2425fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger else { 24374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul blend->rt[i].alpha_src_factor = 24499feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul translate_blend(ctx->Color.Blend[j].SrcA); 24574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul blend->rt[i].alpha_dst_factor = 24699feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul translate_blend(ctx->Color.Blend[j].DstA); 2475fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 248111880798a7b67b79af3f7986e3297268c4b778aBrian } 2496debc8078a7170c26d826e62e2b6542e85813a6cBrian } 2506debc8078a7170c26d826e62e2b6542e85813a6cBrian else { 2516debc8078a7170c26d826e62e2b6542e85813a6cBrian /* no blending / logicop */ 2526debc8078a7170c26d826e62e2b6542e85813a6cBrian } 2536debc8078a7170c26d826e62e2b6542e85813a6cBrian 25486352ff70d8c9a31fe0ebb4d02ce4bb4644fe54aBrian /* Colormask - maybe reverse these bits? */ 2555fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger for (i = 0; i < num_state; i++) { 25699feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Color.ColorMask[i][0]) 2575fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].colormask |= PIPE_MASK_R; 25899feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Color.ColorMask[i][1]) 2595fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].colormask |= PIPE_MASK_G; 26099feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Color.ColorMask[i][2]) 2615fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].colormask |= PIPE_MASK_B; 26299feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Color.ColorMask[i][3]) 2635fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger blend->rt[i].colormask |= PIPE_MASK_A; 2645fae36147e1067ac8b1eb5bcade2f9b1dbf29aa4Roland Scheidegger } 26586352ff70d8c9a31fe0ebb4d02ce4bb4644fe54aBrian 26699feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Color.DitherFlag) 267339e7ec6805e6de8794514c0a935081b5d36d38fBrian blend->dither = 1; 26886352ff70d8c9a31fe0ebb4d02ce4bb4644fe54aBrian 26999feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Multisample.Enabled) { 270127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* unlike in gallium/d3d10 these operations are only performed 271127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger if msaa is enabled */ 27299feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Multisample.SampleAlphaToCoverage) 273127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger blend->alpha_to_coverage = 1; 27499feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul if (ctx->Multisample.SampleAlphaToOne) 275127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger blend->alpha_to_one = 1; 276127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger } 277127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 278339e7ec6805e6de8794514c0a935081b5d36d38fBrian cso_set_blend(st->cso_context, blend); 279284efcfc27aaeb447e0898ae3342e9fee20c584aBrian 2807d95efde0a0e13e13c59444703bc47eb13926385Brian { 2817d95efde0a0e13e13c59444703bc47eb13926385Brian struct pipe_blend_color bc; 28299feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul COPY_4FV(bc.color, ctx->Color.BlendColorUnclamped); 2837d95efde0a0e13e13c59444703bc47eb13926385Brian cso_set_blend_color(st->cso_context, &bc); 284284efcfc27aaeb447e0898ae3342e9fee20c584aBrian } 2856debc8078a7170c26d826e62e2b6542e85813a6cBrian} 2866debc8078a7170c26d826e62e2b6542e85813a6cBrian 2876debc8078a7170c26d826e62e2b6542e85813a6cBrian 2886debc8078a7170c26d826e62e2b6542e85813a6cBrianconst struct st_tracked_state st_update_blend = { 28954507125e735ffa595e252282eaabf38095c21e1Alan Hourihane "st_update_blend", /* name */ 29054507125e735ffa595e252282eaabf38095c21e1Alan Hourihane { /* dirty */ 291127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger (_NEW_COLOR | _NEW_MULTISAMPLE), /* XXX _NEW_BLEND someday? */ /* mesa */ 29254507125e735ffa595e252282eaabf38095c21e1Alan Hourihane 0, /* st */ 2936debc8078a7170c26d826e62e2b6542e85813a6cBrian }, 29454507125e735ffa595e252282eaabf38095c21e1Alan Hourihane update_blend, /* update */ 2956debc8078a7170c26d826e62e2b6542e85813a6cBrian}; 296