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