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; 697d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 707d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef src; 717d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef dst; 727d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef const_; 737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef inv_src; 757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef inv_dst; 767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef inv_const; 777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef saturate; 787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef rgb_src_factor; 807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef alpha_src_factor; 817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef rgb_dst_factor; 827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef alpha_dst_factor; 837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}; 847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 857d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef 872529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecalp_build_blend_factor_unswizzled(struct lp_build_blend_aos_context *bld, 887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca unsigned factor, 897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca boolean alpha) 907d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca switch (factor) { 927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ZERO: 93a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->base.zero; 947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ONE: 95a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->base.one; 967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_COLOR: 977d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA: 98a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->src; 997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_COLOR: 1007d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_ALPHA: 101a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->dst; 1027d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 1037d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca if(alpha) 104a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->base.one; 1057d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca else { 106a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca if(!bld->inv_dst) 107a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld->inv_dst = lp_build_comp(&bld->base, bld->dst); 108a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca if(!bld->saturate) 109a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld->saturate = lp_build_min(&bld->base, bld->src, bld->inv_dst); 110a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->saturate; 1117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 1127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_COLOR: 1137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_ALPHA: 114a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->const_; 1157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_COLOR: 1167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_ALPHA: 1177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* TODO */ 1187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 119a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->base.zero; 1207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_COLOR: 1217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 122a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca if(!bld->inv_src) 123a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld->inv_src = lp_build_comp(&bld->base, bld->src); 124a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->inv_src; 1257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_COLOR: 1267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_ALPHA: 127a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca if(!bld->inv_dst) 128a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld->inv_dst = lp_build_comp(&bld->base, bld->dst); 129a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->inv_dst; 1307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_COLOR: 1317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 132a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca if(!bld->inv_const) 133a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld->inv_const = lp_build_comp(&bld->base, bld->const_); 134a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->inv_const; 1357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 1367d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 1377d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* TODO */ 1387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 139a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->base.zero; 1407d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 1417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 142a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca return bld->base.zero; 1437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 1447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 1457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1477d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecaenum lp_build_blend_swizzle { 1487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LP_BUILD_BLEND_SWIZZLE_RGBA = 0, 1490bfc579bd435b4d0c258258440866840c473f681Vinson Lee LP_BUILD_BLEND_SWIZZLE_AAAA = 1 1507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}; 1517d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1527d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca/** 1547d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * How should we shuffle the base factor. 1557d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 1567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic enum lp_build_blend_swizzle 1577d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecalp_build_blend_factor_swizzle(unsigned factor) 1587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 1597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca switch (factor) { 1607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ONE: 1617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ZERO: 1627d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_COLOR: 1637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_COLOR: 1647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_COLOR: 1657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_COLOR: 1667d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_COLOR: 1677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_COLOR: 1687d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_COLOR: 1697d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 1707d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return LP_BUILD_BLEND_SWIZZLE_RGBA; 1717d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA: 1727d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_ALPHA: 1737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 1747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_ALPHA: 1757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_ALPHA: 1767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 1777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_ALPHA: 1787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 1797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 1807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return LP_BUILD_BLEND_SWIZZLE_AAAA; 1817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 1827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 1837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return LP_BUILD_BLEND_SWIZZLE_RGBA; 1847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 1857d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 1867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1877d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef 1892529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecalp_build_blend_swizzle(struct lp_build_blend_aos_context *bld, 1907d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef rgb, 1917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef alpha, 1927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca enum lp_build_blend_swizzle rgb_swizzle, 193a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca unsigned alpha_swizzle) 1947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 19583ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca LLVMValueRef swizzled_rgb; 19683ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca 19783ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca switch (rgb_swizzle) { 19883ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca case LP_BUILD_BLEND_SWIZZLE_RGBA: 19983ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca swizzled_rgb = rgb; 20083ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca break; 20183ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca case LP_BUILD_BLEND_SWIZZLE_AAAA: 20234ea50f6720d6aca970613da560a1f25f5b5772cJosé Fonseca swizzled_rgb = lp_build_swizzle_scalar_aos(&bld->base, rgb, alpha_swizzle); 20383ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca break; 20483ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca default: 20583ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca assert(0); 20683ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca swizzled_rgb = bld->base.undef; 2079e922444403d704f9ed0cf50e510fba53c736b57José Fonseca } 20883ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca 20983ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca if (rgb != alpha) { 2106ed726b8fc6210a41fe325591e1428d19f419108José Fonseca swizzled_rgb = lp_build_select_aos(&bld->base, 1 << alpha_swizzle, 2116ed726b8fc6210a41fe325591e1428d19f419108José Fonseca alpha, swizzled_rgb); 2127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 21383ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca 21483ced5a918fd597fe2cb2991ff9732920354718cJosé Fonseca return swizzled_rgb; 2157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 2167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2185778970f15af253ce9d279516287602f28153548José Fonseca/** 2195778970f15af253ce9d279516287602f28153548José Fonseca * @sa http://www.opengl.org/sdk/docs/man/xhtml/glBlendFuncSeparate.xml 2205778970f15af253ce9d279516287602f28153548José Fonseca */ 2217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef 2222529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecalp_build_blend_factor(struct lp_build_blend_aos_context *bld, 2237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca unsigned rgb_factor, 2247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca unsigned alpha_factor, 225a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca unsigned alpha_swizzle) 2267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 2278684ffc141ed024ab1d42fcba31d8517288fac40James Benton LLVMValueRef rgb_factor_, alpha_factor_; 2287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca enum lp_build_blend_swizzle rgb_swizzle; 2297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2308684ffc141ed024ab1d42fcba31d8517288fac40James Benton rgb_factor_ = lp_build_blend_factor_unswizzled(bld, rgb_factor, FALSE); 2317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2328684ffc141ed024ab1d42fcba31d8517288fac40James Benton if (alpha_swizzle != UTIL_FORMAT_SWIZZLE_NONE) { 2338684ffc141ed024ab1d42fcba31d8517288fac40James Benton rgb_swizzle = lp_build_blend_factor_swizzle(rgb_factor); 2348684ffc141ed024ab1d42fcba31d8517288fac40James Benton alpha_factor_ = lp_build_blend_factor_unswizzled(bld, alpha_factor, TRUE); 2358684ffc141ed024ab1d42fcba31d8517288fac40James Benton return lp_build_blend_swizzle(bld, rgb_factor_, alpha_factor_, rgb_swizzle, alpha_swizzle); 2368684ffc141ed024ab1d42fcba31d8517288fac40James Benton } else { 2378684ffc141ed024ab1d42fcba31d8517288fac40James Benton return rgb_factor_; 2387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 2397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 2407d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 24216b081f1b0acf3158423c9fbed69c85807ce5276James Benton/** 24316b081f1b0acf3158423c9fbed69c85807ce5276James Benton * Performs blending of src and dst pixels 24416b081f1b0acf3158423c9fbed69c85807ce5276James Benton * 24516b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param blend the blend state of the shader variant 24616b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param cbuf_format format of the colour buffer 24716b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param type data type of the pixel vector 24816b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param rt rt number 24916b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param src blend src 25016b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param dst blend dst 25116b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param mask optional mask to apply to the blending result 25216b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param const_ const blend color 25316b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @param swizzle swizzle values for RGBA 25416b081f1b0acf3158423c9fbed69c85807ce5276James Benton * 25516b081f1b0acf3158423c9fbed69c85807ce5276James Benton * @return the result of blending src and dst 25616b081f1b0acf3158423c9fbed69c85807ce5276James Benton */ 2577d043162c5d9150947d9341cfa22192bd4c70fdeJosé FonsecaLLVMValueRef 258efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_blend_aos(struct gallivm_state *gallivm, 2592529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca const struct pipe_blend_state *blend, 2600b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton const enum pipe_format *cbuf_format, 261b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 262f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul unsigned rt, 2632529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef src, 2642529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef dst, 26516b081f1b0acf3158423c9fbed69c85807ce5276James Benton LLVMValueRef mask, 2662529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef const_, 2670b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton const unsigned char swizzle[4]) 2687d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 2698684ffc141ed024ab1d42fcba31d8517288fac40James Benton const struct pipe_rt_blend_state * state = &blend->rt[rt]; 2702529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca struct lp_build_blend_aos_context bld; 2718684ffc141ed024ab1d42fcba31d8517288fac40James Benton LLVMValueRef src_factor, dst_factor; 2720b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton LLVMValueRef result; 2730b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton unsigned alpha_swizzle = swizzle[3]; 2740b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton boolean fullcolormask; 275e7fc21434d2c5a9177a427950be5029ff4db43eeJosé Fonseca 276a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca /* Setup build context */ 277a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca memset(&bld, 0, sizeof bld); 278efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_context_init(&bld.base, gallivm, type); 279a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld.src = src; 280a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld.dst = dst; 281a6622e6c544d3530a463d6a274a15bfae58f7cccJosé Fonseca bld.const_ = const_; 2827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2838684ffc141ed024ab1d42fcba31d8517288fac40James Benton if (swizzle[3] > UTIL_FORMAT_SWIZZLE_W || swizzle[3] == swizzle[0]) 2848684ffc141ed024ab1d42fcba31d8517288fac40James Benton alpha_swizzle = UTIL_FORMAT_SWIZZLE_NONE; 2858684ffc141ed024ab1d42fcba31d8517288fac40James Benton 2868684ffc141ed024ab1d42fcba31d8517288fac40James Benton if (!state->blend_enable) { 2870b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton result = src; 2880b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton } else { 2898684ffc141ed024ab1d42fcba31d8517288fac40James Benton boolean rgb_alpha_same = state->rgb_src_factor == state->rgb_dst_factor && state->alpha_src_factor == state->alpha_dst_factor; 2908684ffc141ed024ab1d42fcba31d8517288fac40James Benton assert(rgb_alpha_same || alpha_swizzle != UTIL_FORMAT_SWIZZLE_NONE); 2918684ffc141ed024ab1d42fcba31d8517288fac40James Benton 2928684ffc141ed024ab1d42fcba31d8517288fac40James Benton src_factor = lp_build_blend_factor(&bld, state->rgb_src_factor, 2938684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->alpha_src_factor, alpha_swizzle); 2948684ffc141ed024ab1d42fcba31d8517288fac40James Benton dst_factor = lp_build_blend_factor(&bld, state->rgb_dst_factor, 2958684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->alpha_dst_factor, alpha_swizzle); 2968684ffc141ed024ab1d42fcba31d8517288fac40James Benton 2978684ffc141ed024ab1d42fcba31d8517288fac40James Benton result = lp_build_blend(&bld.base, 2988684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->rgb_func, 2998684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->rgb_src_factor, 3008684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->rgb_dst_factor, 3018684ffc141ed024ab1d42fcba31d8517288fac40James Benton src, 3028684ffc141ed024ab1d42fcba31d8517288fac40James Benton dst, 3038684ffc141ed024ab1d42fcba31d8517288fac40James Benton src_factor, 3048684ffc141ed024ab1d42fcba31d8517288fac40James Benton dst_factor, 3058684ffc141ed024ab1d42fcba31d8517288fac40James Benton rgb_alpha_same, 3068684ffc141ed024ab1d42fcba31d8517288fac40James Benton false); 3078684ffc141ed024ab1d42fcba31d8517288fac40James Benton 3088684ffc141ed024ab1d42fcba31d8517288fac40James Benton if(state->rgb_func != state->alpha_func && alpha_swizzle != UTIL_FORMAT_SWIZZLE_NONE) { 3090b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton LLVMValueRef alpha; 3107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3118684ffc141ed024ab1d42fcba31d8517288fac40James Benton alpha = lp_build_blend(&bld.base, 3128684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->alpha_func, 3138684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->alpha_src_factor, 3148684ffc141ed024ab1d42fcba31d8517288fac40James Benton state->alpha_dst_factor, 3158684ffc141ed024ab1d42fcba31d8517288fac40James Benton src, 3168684ffc141ed024ab1d42fcba31d8517288fac40James Benton dst, 3178684ffc141ed024ab1d42fcba31d8517288fac40James Benton src_factor, 3188684ffc141ed024ab1d42fcba31d8517288fac40James Benton dst_factor, 3198684ffc141ed024ab1d42fcba31d8517288fac40James Benton rgb_alpha_same, 3208684ffc141ed024ab1d42fcba31d8517288fac40James Benton false); 3218684ffc141ed024ab1d42fcba31d8517288fac40James Benton 3228684ffc141ed024ab1d42fcba31d8517288fac40James Benton result = lp_build_blend_swizzle(&bld, 3238684ffc141ed024ab1d42fcba31d8517288fac40James Benton result, 3248684ffc141ed024ab1d42fcba31d8517288fac40James Benton alpha, 3258684ffc141ed024ab1d42fcba31d8517288fac40James Benton LP_BUILD_BLEND_SWIZZLE_RGBA, 3268684ffc141ed024ab1d42fcba31d8517288fac40James Benton alpha_swizzle); 3270b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton } 3287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 3297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 33016b081f1b0acf3158423c9fbed69c85807ce5276James Benton /* Check if color mask is necessary */ 3318684ffc141ed024ab1d42fcba31d8517288fac40James Benton fullcolormask = util_format_colormask_full(util_format_description(cbuf_format[rt]), state->colormask); 3327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3330b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton if (!fullcolormask) { 33416b081f1b0acf3158423c9fbed69c85807ce5276James Benton LLVMValueRef color_mask; 3357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3368684ffc141ed024ab1d42fcba31d8517288fac40James Benton color_mask = lp_build_const_mask_aos_swizzled(gallivm, bld.base.type, state->colormask, swizzle); 33716b081f1b0acf3158423c9fbed69c85807ce5276James Benton lp_build_name(color_mask, "color_mask"); 33816b081f1b0acf3158423c9fbed69c85807ce5276James Benton 33916b081f1b0acf3158423c9fbed69c85807ce5276James Benton /* Combine with input mask if necessary */ 34016b081f1b0acf3158423c9fbed69c85807ce5276James Benton if (mask) { 34116b081f1b0acf3158423c9fbed69c85807ce5276James Benton mask = lp_build_and(&bld.base, color_mask, mask); 34216b081f1b0acf3158423c9fbed69c85807ce5276James Benton } else { 34316b081f1b0acf3158423c9fbed69c85807ce5276James Benton mask = color_mask; 34416b081f1b0acf3158423c9fbed69c85807ce5276James Benton } 34516b081f1b0acf3158423c9fbed69c85807ce5276James Benton } 3460b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton 34716b081f1b0acf3158423c9fbed69c85807ce5276James Benton /* Apply mask, if one exists */ 34816b081f1b0acf3158423c9fbed69c85807ce5276James Benton if (mask) { 3490b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton result = lp_build_select(&bld.base, mask, result, dst); 3507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 3510b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton 3520b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton return result; 3537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 354