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