17d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca/**************************************************************************
27d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca *
37d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Copyright 2009 VMware, Inc.
47d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * All Rights Reserved.
57d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca *
67d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
77d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * copy of this software and associated documentation files (the
87d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * "Software"), to deal in the Software without restriction, including
97d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * the following conditions:
137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca *
147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * The above copyright notice and this permission notice (including the
157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * of the Software.
177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca *
187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
197d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca *
267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca **************************************************************************/
277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca/**
307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * @file
315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Blend LLVM IR generation -- AoS layout.
325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * AoS blending is in general much slower than SoA, but there are some cases
345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * where it might be faster. In particular, if a pixel is rendered only once
355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * then the overhead of tiling and untiling will dominate over the speedup that
365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * SoA gives. So we might want to detect such cases and fallback to AoS in the
375811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * future, but for now this function is here for historical/benchmarking
385811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * purposes.
395811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
405811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Run lp_blend_test after any change to this file.
417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca *
427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */
447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#include "pipe/p_state.h"
4738f6f23fcf37247fd709d1c612d08bfa9b124e69José Fonseca#include "util/u_debug.h"
480b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton#include "util/u_format.h"
497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
50d75129dd13c2aac4053340487b87127420449ee8Brian Paul#include "gallivm/lp_bld_type.h"
51d75129dd13c2aac4053340487b87127420449ee8Brian Paul#include "gallivm/lp_bld_const.h"
52d75129dd13c2aac4053340487b87127420449ee8Brian Paul#include "gallivm/lp_bld_arit.h"
53d75129dd13c2aac4053340487b87127420449ee8Brian Paul#include "gallivm/lp_bld_logic.h"
54d75129dd13c2aac4053340487b87127420449ee8Brian Paul#include "gallivm/lp_bld_swizzle.h"
5516b081f1b0acf3158423c9fbed69c85807ce5276James Benton#include "gallivm/lp_bld_bitarit.h"
56d75129dd13c2aac4053340487b87127420449ee8Brian Paul#include "gallivm/lp_bld_debug.h"
57d75129dd13c2aac4053340487b87127420449ee8Brian Paul
582529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca#include "lp_bld_blend.h"
597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca/**
6264611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * We may the same values several times, so we keep them here to avoid
6364611e086dbefa2003773ab541c0381b5713e18dJosé Fonseca * recomputing them. Also reusing the values allows us to do simplifications
647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * that LLVM optimization passes wouldn't normally be able to do.
657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */
662529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecastruct lp_build_blend_aos_context
677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{
68a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca   struct lp_build_context base;
69fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
707d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef src;
71fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   LLVMValueRef src_alpha;
7267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger   LLVMValueRef src1;
738b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger   LLVMValueRef src1_alpha;
747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef dst;
757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef const_;
76fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   LLVMValueRef const_alpha;
7704480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger   boolean has_dst_alpha;
787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef inv_src;
80fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   LLVMValueRef inv_src_alpha;
817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef inv_dst;
827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef inv_const;
83fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   LLVMValueRef inv_const_alpha;
847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef saturate;
857d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef rgb_src_factor;
877d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef alpha_src_factor;
887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef rgb_dst_factor;
897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LLVMValueRef alpha_dst_factor;
907d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca};
917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef
942529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecalp_build_blend_factor_unswizzled(struct lp_build_blend_aos_context *bld,
957d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca                                 unsigned factor,
967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca                                 boolean alpha)
977d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{
98fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   LLVMValueRef src_alpha = bld->src_alpha ? bld->src_alpha : bld->src;
998b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger   LLVMValueRef src1_alpha = bld->src1_alpha ? bld->src1_alpha : bld->src1;
100fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   LLVMValueRef const_alpha = bld->const_alpha ? bld->const_alpha : bld->const_;
101fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
1027d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   switch (factor) {
1037d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_ZERO:
104a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->base.zero;
1057d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_ONE:
106a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->base.one;
1077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC_COLOR:
108a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->src;
109fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   case PIPE_BLENDFACTOR_SRC_ALPHA:
110fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      return src_alpha;
1117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_DST_COLOR:
1127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_DST_ALPHA:
113a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->dst;
1147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
1157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      if(alpha)
116a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca         return bld->base.one;
1177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      else {
118e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger         /*
11904480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger          * If there's no dst alpha the complement is zero but for unclamped
12004480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger          * float inputs min can be non-zero (negative).
121e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger          */
12204480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger         if (!bld->has_dst_alpha) {
123e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger            if (!bld->saturate)
124e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger               bld->saturate = lp_build_min(&bld->base, src_alpha, bld->base.zero);
125e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger         }
126e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger         else {
127e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger            if(!bld->inv_dst)
128e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger               bld->inv_dst = lp_build_comp(&bld->base, bld->dst);
129e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger            if(!bld->saturate)
130e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger               bld->saturate = lp_build_min(&bld->base, src_alpha, bld->inv_dst);
131e57b98bad33b13ba02b11144709dd09af2ea8c95Roland Scheidegger         }
132a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca         return bld->saturate;
1337d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      }
1347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_CONST_COLOR:
135a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->const_;
136fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   case PIPE_BLENDFACTOR_CONST_ALPHA:
137fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      return const_alpha;
1387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC1_COLOR:
13967906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger      return bld->src1;
1408b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger   case PIPE_BLENDFACTOR_SRC1_ALPHA:
1418b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger      return src1_alpha;
1427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_SRC_COLOR:
143a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      if(!bld->inv_src)
144a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca         bld->inv_src = lp_build_comp(&bld->base, bld->src);
145a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->inv_src;
146fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
147fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      if(!bld->inv_src_alpha)
148fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         bld->inv_src_alpha = lp_build_comp(&bld->base, src_alpha);
149fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      return bld->inv_src_alpha;
1507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_DST_COLOR:
1517d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_DST_ALPHA:
152a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      if(!bld->inv_dst)
153a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca         bld->inv_dst = lp_build_comp(&bld->base, bld->dst);
154a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->inv_dst;
1557d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_CONST_COLOR:
156a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      if(!bld->inv_const)
157a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca         bld->inv_const = lp_build_comp(&bld->base, bld->const_);
158a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->inv_const;
159fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
160fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      if(!bld->inv_const_alpha)
161fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         bld->inv_const_alpha = lp_build_comp(&bld->base, const_alpha);
162fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      return bld->inv_const_alpha;
1637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
16467906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger      return lp_build_comp(&bld->base, bld->src1);
1658b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger   case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
1668b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger      return lp_build_comp(&bld->base, src1_alpha);
1677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   default:
1687d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      assert(0);
169a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca      return bld->base.zero;
1707d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   }
1717d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}
1727d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
1737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
1747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecaenum lp_build_blend_swizzle {
1757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   LP_BUILD_BLEND_SWIZZLE_RGBA = 0,
1760bfc579bd435b4d0c258258440866840c473f681Vinson Lee   LP_BUILD_BLEND_SWIZZLE_AAAA = 1
1777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca};
1787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
1797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
1807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca/**
1817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * How should we shuffle the base factor.
1827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */
1837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic enum lp_build_blend_swizzle
1847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecalp_build_blend_factor_swizzle(unsigned factor)
1857d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{
1867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   switch (factor) {
1877d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_ONE:
1887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_ZERO:
1897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC_COLOR:
1907d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_DST_COLOR:
1917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_CONST_COLOR:
1927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC1_COLOR:
1937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_SRC_COLOR:
1947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_DST_COLOR:
1957d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_CONST_COLOR:
1967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
1977d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      return LP_BUILD_BLEND_SWIZZLE_RGBA;
1987d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC_ALPHA:
1997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_DST_ALPHA:
2007d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
2017d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_SRC1_ALPHA:
2027d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_CONST_ALPHA:
2037d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
2047d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_DST_ALPHA:
2057d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
2067d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
2077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      return LP_BUILD_BLEND_SWIZZLE_AAAA;
2087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   default:
2097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      assert(0);
2107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca      return LP_BUILD_BLEND_SWIZZLE_RGBA;
2117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   }
2127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}
2137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
2147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
2157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef
2162529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecalp_build_blend_swizzle(struct lp_build_blend_aos_context *bld,
2177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca                       LLVMValueRef rgb,
2187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca                       LLVMValueRef alpha,
2197d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca                       enum lp_build_blend_swizzle rgb_swizzle,
220fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                       unsigned alpha_swizzle,
221fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                       unsigned num_channels)
2227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{
22383ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca   LLVMValueRef swizzled_rgb;
22483ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca
22583ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca   switch (rgb_swizzle) {
22683ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca   case LP_BUILD_BLEND_SWIZZLE_RGBA:
22783ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca      swizzled_rgb = rgb;
22883ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca      break;
22983ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca   case LP_BUILD_BLEND_SWIZZLE_AAAA:
230fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      swizzled_rgb = lp_build_swizzle_scalar_aos(&bld->base, rgb, alpha_swizzle, num_channels);
23183ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca      break;
23283ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca   default:
23383ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca      assert(0);
23483ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca      swizzled_rgb = bld->base.undef;
2359e922444403d704f9ed0cf50e510fba53c736b57José Fonseca   }
23683ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca
23783ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca   if (rgb != alpha) {
2386ed726b8fc6210a41fe325591e1428d19f419108José Fonseca      swizzled_rgb = lp_build_select_aos(&bld->base, 1 << alpha_swizzle,
239fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         alpha, swizzled_rgb,
240fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         num_channels);
2417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   }
24283ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca
24383ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca   return swizzled_rgb;
2447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}
2457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
2465778970f15af253ce9d279516287602f28153548José Fonseca/**
2475778970f15af253ce9d279516287602f28153548José Fonseca * @sa http://www.opengl.org/sdk/docs/man/xhtml/glBlendFuncSeparate.xml
2485778970f15af253ce9d279516287602f28153548José Fonseca */
2497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef
2502529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecalp_build_blend_factor(struct lp_build_blend_aos_context *bld,
2517d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca                      unsigned rgb_factor,
2527d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca                      unsigned alpha_factor,
253fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                      unsigned alpha_swizzle,
254fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                      unsigned num_channels)
2557d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{
2568684ffc141ed024ab1d42fcba31d8517288fac40James Benton   LLVMValueRef rgb_factor_, alpha_factor_;
2577d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   enum lp_build_blend_swizzle rgb_swizzle;
2587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
259fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák   if (alpha_swizzle == PIPE_SWIZZLE_X && num_channels == 1) {
260fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      return lp_build_blend_factor_unswizzled(bld, alpha_factor, TRUE);
261fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   }
262fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
2638684ffc141ed024ab1d42fcba31d8517288fac40James Benton   rgb_factor_ = lp_build_blend_factor_unswizzled(bld, rgb_factor, FALSE);
2647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
265fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák   if (alpha_swizzle != PIPE_SWIZZLE_NONE) {
2668684ffc141ed024ab1d42fcba31d8517288fac40James Benton      rgb_swizzle   = lp_build_blend_factor_swizzle(rgb_factor);
2678684ffc141ed024ab1d42fcba31d8517288fac40James Benton      alpha_factor_ = lp_build_blend_factor_unswizzled(bld, alpha_factor, TRUE);
26804480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger      return lp_build_blend_swizzle(bld, rgb_factor_, alpha_factor_, rgb_swizzle,
26904480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger                                    alpha_swizzle, num_channels);
2708684ffc141ed024ab1d42fcba31d8517288fac40James Benton   } else {
2718684ffc141ed024ab1d42fcba31d8517288fac40James Benton      return rgb_factor_;
2727d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   }
2737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}
2747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
2757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
27616b081f1b0acf3158423c9fbed69c85807ce5276James Benton/**
27716b081f1b0acf3158423c9fbed69c85807ce5276James Benton * Performs blending of src and dst pixels
27816b081f1b0acf3158423c9fbed69c85807ce5276James Benton *
27916b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param blend         the blend state of the shader variant
28016b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param cbuf_format   format of the colour buffer
28116b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param type          data type of the pixel vector
2828c84a82383fe56bc1a8977ce42de36f71ffc108eRoland Scheidegger * @param rt            render target index
28316b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param src           blend src
2848b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger * @param src_alpha     blend src alpha (if not included in src)
28567906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger * @param src1          second blend src (for dual source blend)
2868b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger * @param src1_alpha    second blend src alpha (if not included in src1)
28716b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param dst           blend dst
28816b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param mask          optional mask to apply to the blending result
28916b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param const_        const blend color
2908b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger * @param const_alpha   const blend color alpha (if not included in const_)
29116b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param swizzle       swizzle values for RGBA
29216b081f1b0acf3158423c9fbed69c85807ce5276James Benton *
29316b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @return the result of blending src and dst
29416b081f1b0acf3158423c9fbed69c85807ce5276James Benton */
2957d043162c5d9150947d9341cfa22192bd4c70fdeJosé FonsecaLLVMValueRef
296efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_blend_aos(struct gallivm_state *gallivm,
2972529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca                   const struct pipe_blend_state *blend,
29848b01e6a1003d997778df8d36f7004ab1f1be629Brian Paul                   enum pipe_format cbuf_format,
299b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                   struct lp_type type,
300f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul                   unsigned rt,
3012529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca                   LLVMValueRef src,
302fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                   LLVMValueRef src_alpha,
30367906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger                   LLVMValueRef src1,
3048b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger                   LLVMValueRef src1_alpha,
3052529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca                   LLVMValueRef dst,
30616b081f1b0acf3158423c9fbed69c85807ce5276James Benton                   LLVMValueRef mask,
3072529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca                   LLVMValueRef const_,
308fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                   LLVMValueRef const_alpha,
309fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                   const unsigned char swizzle[4],
310fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                   int nr_channels)
3117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{
3128684ffc141ed024ab1d42fcba31d8517288fac40James Benton   const struct pipe_rt_blend_state * state = &blend->rt[rt];
3131d3789bccbbcc814fd7b339e9f5b5631e30d9f0eJames Benton   const struct util_format_description * desc;
3142529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca   struct lp_build_blend_aos_context bld;
3158684ffc141ed024ab1d42fcba31d8517288fac40James Benton   LLVMValueRef src_factor, dst_factor;
3160b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton   LLVMValueRef result;
317fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák   unsigned alpha_swizzle = PIPE_SWIZZLE_NONE;
318fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   unsigned i;
319e7fc21434d2c5a9177a427950be5029ff4db43eeJosé Fonseca
3208c84a82383fe56bc1a8977ce42de36f71ffc108eRoland Scheidegger   desc = util_format_description(cbuf_format);
3211d3789bccbbcc814fd7b339e9f5b5631e30d9f0eJames Benton
322a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca   /* Setup build context */
323a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca   memset(&bld, 0, sizeof bld);
324efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_context_init(&bld.base, gallivm, type);
325a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca   bld.src = src;
32667906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger   bld.src1 = src1;
327a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca   bld.dst = dst;
328a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca   bld.const_ = const_;
329fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   bld.src_alpha = src_alpha;
3308b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger   bld.src1_alpha = src1_alpha;
331fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   bld.const_alpha = const_alpha;
33204480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger   bld.has_dst_alpha = FALSE;
333fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
334fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   /* Find the alpha channel if not provided seperately */
335fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   if (!src_alpha) {
336fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      for (i = 0; i < 4; ++i) {
337fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         if (swizzle[i] == 3) {
338fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton            alpha_swizzle = i;
339fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         }
340fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      }
34104480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger      /*
34204480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger       * Note that we may get src_alpha included from source (and 4 channels)
34304480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger       * even if the destination doesn't have an alpha channel (for rgbx
34404480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger       * formats). Generally this shouldn't make much of a difference (we're
34504480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger       * relying on blend factors being sanitized already if there's no
34604480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger       * dst alpha).
34704480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger       */
34804480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger      bld.has_dst_alpha = desc->swizzle[3] <= PIPE_SWIZZLE_W;
349fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   }
3508684ffc141ed024ab1d42fcba31d8517288fac40James Benton
3511cead8845b95643582903f054255d20b3de3e19aJosé Fonseca   if (blend->logicop_enable) {
3521cead8845b95643582903f054255d20b3de3e19aJosé Fonseca      if(!type.floating) {
3531cead8845b95643582903f054255d20b3de3e19aJosé Fonseca         result = lp_build_logicop(gallivm->builder, blend->logicop_func, src, dst);
3541cead8845b95643582903f054255d20b3de3e19aJosé Fonseca      }
3551cead8845b95643582903f054255d20b3de3e19aJosé Fonseca      else {
3561cead8845b95643582903f054255d20b3de3e19aJosé Fonseca         result = src;
3571cead8845b95643582903f054255d20b3de3e19aJosé Fonseca      }
3581cead8845b95643582903f054255d20b3de3e19aJosé Fonseca   } else if (!state->blend_enable) {
3590b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton      result = src;
3600b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton   } else {
36104480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger      boolean rgb_alpha_same = (state->rgb_src_factor == state->rgb_dst_factor &&
36204480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger                                state->alpha_src_factor == state->alpha_dst_factor) ||
36304480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger                               nr_channels == 1;
3648684ffc141ed024ab1d42fcba31d8517288fac40James Benton
3658684ffc141ed024ab1d42fcba31d8517288fac40James Benton      src_factor = lp_build_blend_factor(&bld, state->rgb_src_factor,
366fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         state->alpha_src_factor,
367fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         alpha_swizzle,
368fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         nr_channels);
369fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
3708684ffc141ed024ab1d42fcba31d8517288fac40James Benton      dst_factor = lp_build_blend_factor(&bld, state->rgb_dst_factor,
371fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         state->alpha_dst_factor,
372fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         alpha_swizzle,
373fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         nr_channels);
3748684ffc141ed024ab1d42fcba31d8517288fac40James Benton
3758684ffc141ed024ab1d42fcba31d8517288fac40James Benton      result = lp_build_blend(&bld.base,
3768684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              state->rgb_func,
3778684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              state->rgb_src_factor,
3788684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              state->rgb_dst_factor,
3798684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              src,
3808684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              dst,
3818684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              src_factor,
3828684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              dst_factor,
3838684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              rgb_alpha_same,
3848684ffc141ed024ab1d42fcba31d8517288fac40James Benton                              false);
3858684ffc141ed024ab1d42fcba31d8517288fac40James Benton
38604480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger      if(state->rgb_func != state->alpha_func && nr_channels > 1 &&
38704480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger                            alpha_swizzle != PIPE_SWIZZLE_NONE) {
3880b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton         LLVMValueRef alpha;
3897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
3908684ffc141ed024ab1d42fcba31d8517288fac40James Benton         alpha = lp_build_blend(&bld.base,
3918684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                state->alpha_func,
3928684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                state->alpha_src_factor,
3938684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                state->alpha_dst_factor,
3948684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                src,
3958684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                dst,
3968684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                src_factor,
3978684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                dst_factor,
3988684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                rgb_alpha_same,
3998684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                false);
4008684ffc141ed024ab1d42fcba31d8517288fac40James Benton
4018684ffc141ed024ab1d42fcba31d8517288fac40James Benton         result = lp_build_blend_swizzle(&bld,
4028684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                         result,
4038684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                         alpha,
4048684ffc141ed024ab1d42fcba31d8517288fac40James Benton                                         LP_BUILD_BLEND_SWIZZLE_RGBA,
405fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         alpha_swizzle,
406fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton                                         nr_channels);
4070b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton      }
4087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   }
4097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
41016b081f1b0acf3158423c9fbed69c85807ce5276James Benton   /* Check if color mask is necessary */
411fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton   if (!util_format_colormask_full(desc, state->colormask)) {
41216b081f1b0acf3158423c9fbed69c85807ce5276James Benton      LLVMValueRef color_mask;
4137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca
41404480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger      color_mask = lp_build_const_mask_aos_swizzled(gallivm, bld.base.type,
41504480a04b10524e156cb01d5f7bd8ec02fcc4a67Roland Scheidegger                                                    state->colormask, nr_channels, swizzle);
41616b081f1b0acf3158423c9fbed69c85807ce5276James Benton      lp_build_name(color_mask, "color_mask");
41716b081f1b0acf3158423c9fbed69c85807ce5276James Benton
41816b081f1b0acf3158423c9fbed69c85807ce5276James Benton      /* Combine with input mask if necessary */
41916b081f1b0acf3158423c9fbed69c85807ce5276James Benton      if (mask) {
420fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         /* We can be blending floating values but masks are always integer... */
421fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         unsigned floating = bld.base.type.floating;
422fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         bld.base.type.floating = 0;
423fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
42416b081f1b0acf3158423c9fbed69c85807ce5276James Benton         mask = lp_build_and(&bld.base, color_mask, mask);
425fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
426fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         bld.base.type.floating = floating;
42716b081f1b0acf3158423c9fbed69c85807ce5276James Benton      } else {
42816b081f1b0acf3158423c9fbed69c85807ce5276James Benton         mask = color_mask;
42916b081f1b0acf3158423c9fbed69c85807ce5276James Benton      }
43016b081f1b0acf3158423c9fbed69c85807ce5276James Benton   }
4310b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton
43216b081f1b0acf3158423c9fbed69c85807ce5276James Benton   /* Apply mask, if one exists */
43316b081f1b0acf3158423c9fbed69c85807ce5276James Benton   if (mask) {
4340b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton      result = lp_build_select(&bld.base, mask, result, dst);
4357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca   }
4360b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton
4370b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton   return result;
4387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}
439