13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/********************************************************** 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2008-2009 VMware, Inc. All rights reserved. 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * obtaining a copy of this software and associated documentation 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * files (the "Software"), to deal in the Software without 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * restriction, including without limitation the rights to use, copy, 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software, and to permit persons to whom the Software is 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * furnished to do so, subject to the following conditions: 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice shall be 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * included in all copies or substantial portions of the Software. 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE. 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **********************************************************/ 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 26760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_inlines.h" 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_defines.h" 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_math.h" 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_memory.h" 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "svga_context.h" 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "svga_hw_reg.h" 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE unsigned 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgsvga_translate_blend_factor(unsigned factor) 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (factor) { 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_ZERO: return SVGA3D_BLENDOP_ZERO; 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA: return SVGA3D_BLENDOP_SRCALPHA; 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_ONE: return SVGA3D_BLENDOP_ONE; 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_SRC_COLOR: return SVGA3D_BLENDOP_SRCCOLOR; 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_INV_SRC_COLOR: return SVGA3D_BLENDOP_INVSRCCOLOR; 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_DST_COLOR: return SVGA3D_BLENDOP_DESTCOLOR; 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_INV_DST_COLOR: return SVGA3D_BLENDOP_INVDESTCOLOR; 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_INV_SRC_ALPHA: return SVGA3D_BLENDOP_INVSRCALPHA; 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_DST_ALPHA: return SVGA3D_BLENDOP_DESTALPHA; 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_INV_DST_ALPHA: return SVGA3D_BLENDOP_INVDESTALPHA; 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: return SVGA3D_BLENDOP_SRCALPHASAT; 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_CONST_COLOR: return SVGA3D_BLENDOP_BLENDFACTOR; 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_INV_CONST_COLOR: return SVGA3D_BLENDOP_INVBLENDFACTOR; 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_CONST_ALPHA: return SVGA3D_BLENDOP_BLENDFACTOR; /* ? */ 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLENDFACTOR_INV_CONST_ALPHA: return SVGA3D_BLENDOP_INVBLENDFACTOR; /* ? */ 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(0); 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return SVGA3D_BLENDOP_ZERO; 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE unsigned 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgsvga_translate_blend_func(unsigned mode) 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (mode) { 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLEND_ADD: return SVGA3D_BLENDEQ_ADD; 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLEND_SUBTRACT: return SVGA3D_BLENDEQ_SUBTRACT; 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLEND_REVERSE_SUBTRACT: return SVGA3D_BLENDEQ_REVSUBTRACT; 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLEND_MIN: return SVGA3D_BLENDEQ_MINIMUM; 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_BLEND_MAX: return SVGA3D_BLENDEQ_MAXIMUM; 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(0); 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return SVGA3D_BLENDEQ_ADD; 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void * 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgsvga_create_blend_state(struct pipe_context *pipe, 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const struct pipe_blend_state *templ) 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct svga_blend_state *blend = CALLOC_STRUCT( svga_blend_state ); 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Fill in the per-rendertarget blend state. We currently only 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * have one rendertarget. 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for (i = 0; i < 1; i++) { 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* No way to set this in SVGA3D, and no way to correctly implement it on 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * top of D3D9 API. Instead we try to simulate with various blend modes. 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (templ->logicop_enable) { 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org switch (templ->logicop_func) { 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_XOR: 95760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org case PIPE_LOGICOP_INVERT: 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->need_white_fragments = TRUE; 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_ONE; 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_ONE; 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_SUBTRACT; 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_CLEAR: 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_ZERO; 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_ZERO; 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MINIMUM; 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_COPY: 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = FALSE; 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_COPY_INVERTED: 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_INVSRCCOLOR; 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_ZERO; 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_ADD; 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_NOOP: 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_ZERO; 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_DESTCOLOR; 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_ADD; 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_SET: 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_ONE; 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_ONE; 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MAXIMUM; 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_AND: 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Approximate with minimum - works for the 0 & anything case: */ 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_SRCCOLOR; 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_DESTCOLOR; 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MINIMUM; 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_AND_REVERSE: 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_SRCCOLOR; 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_INVDESTCOLOR; 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MINIMUM; 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_AND_INVERTED: 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_INVSRCCOLOR; 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_DESTCOLOR; 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MINIMUM; 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_OR: 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Approximate with maximum - works for the 1 | anything case: */ 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_SRCCOLOR; 1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_DESTCOLOR; 1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MAXIMUM; 1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_OR_REVERSE: 1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_SRCCOLOR; 1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_INVDESTCOLOR; 1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MAXIMUM; 1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_OR_INVERTED: 1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = TRUE; 1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].srcblend = SVGA3D_BLENDOP_INVSRCCOLOR; 1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend = SVGA3D_BLENDOP_DESTCOLOR; 1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq = SVGA3D_BLENDEQ_MAXIMUM; 1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_NAND: 1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_NOR: 1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org case PIPE_LOGICOP_EQUIV: 1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Fill these in with plausible values */ 1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blend_enable = FALSE; 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org default: 1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(0); 1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org break; 1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 179760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].blend_enable = templ->rt[0].blend_enable; 1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 181760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (templ->rt[0].blend_enable) { 182760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].srcblend = svga_translate_blend_factor(templ->rt[0].rgb_src_factor); 183760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].dstblend = svga_translate_blend_factor(templ->rt[0].rgb_dst_factor); 184760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].blendeq = svga_translate_blend_func(templ->rt[0].rgb_func); 185760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].srcblend_alpha = svga_translate_blend_factor(templ->rt[0].alpha_src_factor); 186760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].dstblend_alpha = svga_translate_blend_factor(templ->rt[0].alpha_dst_factor); 187760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].blendeq_alpha = svga_translate_blend_func(templ->rt[0].alpha_func); 1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (blend->rt[i].srcblend_alpha != blend->rt[i].srcblend || 1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].dstblend_alpha != blend->rt[i].dstblend || 1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].blendeq_alpha != blend->rt[i].blendeq) 1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org { 1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org blend->rt[i].separate_alpha_blend_enable = TRUE; 1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 198760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org blend->rt[i].writemask = templ->rt[0].colormask; 1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return blend; 2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void svga_bind_blend_state(struct pipe_context *pipe, 2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org void *blend) 2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct svga_context *svga = svga_context(pipe); 2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org svga->curr.blend = (struct svga_blend_state*)blend; 2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org svga->dirty |= SVGA_NEW_BLEND; 2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void svga_delete_blend_state(struct pipe_context *pipe, void *blend) 2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE(blend); 2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void svga_set_blend_color( struct pipe_context *pipe, 2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const struct pipe_blend_color *blend_color ) 2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct svga_context *svga = svga_context(pipe); 2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org svga->curr.blend_color = *blend_color; 2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 226760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org svga->dirty |= SVGA_NEW_BLEND_COLOR; 2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid svga_init_blend_functions( struct svga_context *svga ) 2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org svga->pipe.create_blend_state = svga_create_blend_state; 2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org svga->pipe.bind_blend_state = svga_bind_blend_state; 2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org svga->pipe.delete_blend_state = svga_delete_blend_state; 2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org svga->pipe.set_blend_color = svga_set_blend_color; 2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 241