lp_test_blend.c revision abdcdb3db73316c5ebca88bda04b90b6659782e8
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 317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Unit tests for blend LLVM IR generation 327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * 337d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * 357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Blend computation code derived from code written by 367d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * @author Brian Paul <brian@vmware.com> 377d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 40c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_type.h" 41c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_blend.h" 42c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_debug.h" 43e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca#include "lp_test.h" 447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 462529ed5616b1b152766a3355444260b88184cd6eJosé Fonsecaenum vector_mode 472529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca{ 482529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca AoS = 0, 492529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca SoA = 1 502529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca}; 512529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 522529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 535940ba26f78f482442644f52468d65c1e5662d10José Fonsecatypedef void (*blend_test_ptr_t)(const void *src, const void *dst, const void *con, void *res); 54b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 55b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 56e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecavoid 57a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecawrite_tsv_header(FILE *fp) 58a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca{ 59a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, 60a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "result\t" 61b07d19a8859efb930d837c3b324be94cf412d819José Fonseca "cycles_per_channel\t" 622529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca "mode\t" 63a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "type\t" 641165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "sep_func\t" 651165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "sep_src_factor\t" 661165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "sep_dst_factor\t" 67a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "rgb_func\t" 68a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "rgb_src_factor\t" 69a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "rgb_dst_factor\t" 70a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "alpha_func\t" 71a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "alpha_src_factor\t" 72a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "alpha_dst_factor\n"); 73a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 74a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fflush(fp); 75a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca} 76a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 77a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 78a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecastatic void 79a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecawrite_tsv_row(FILE *fp, 80a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const struct pipe_blend_state *blend, 812529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca enum vector_mode mode, 82b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 83a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca double cycles, 84a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca boolean success) 85a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca{ 86a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, "%s\t", success ? "pass" : "fail"); 87a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 882529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if (mode == AoS) { 892529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(fp, "%.1f\t", cycles / type.length); 902529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(fp, "aos\t"); 912529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 922529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 932529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if (mode == SoA) { 942529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(fp, "%.1f\t", cycles / (4 * type.length)); 952529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(fp, "soa\t"); 962529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 97a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 98a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, "%s%u%sx%u\t", 99a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.floating ? "f" : (type.fixed ? "h" : (type.sign ? "s" : "u")), 100a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.width, 101a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.norm ? "n" : "", 102a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.length); 103a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 104a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, 1051165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "%s\t%s\t%s\t", 10699e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend->rt[0].rgb_func != blend->rt[0].alpha_func ? "true" : "false", 10799e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend->rt[0].rgb_src_factor != blend->rt[0].alpha_src_factor ? "true" : "false", 10899e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend->rt[0].rgb_dst_factor != blend->rt[0].alpha_dst_factor ? "true" : "false"); 1091165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca 1101165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca fprintf(fp, 111a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "%s\t%s\t%s\t%s\t%s\t%s\n", 112abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_func(blend->rt[0].rgb_func, TRUE), 113abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].rgb_src_factor, TRUE), 114abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].rgb_dst_factor, TRUE), 115abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_func(blend->rt[0].alpha_func, TRUE), 116abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].alpha_src_factor, TRUE), 117abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].alpha_dst_factor, TRUE)); 118a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 119a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fflush(fp); 120a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca} 121a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 122a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 123a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecastatic void 124a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecadump_blend_type(FILE *fp, 125a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const struct pipe_blend_state *blend, 1262529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca enum vector_mode mode, 127b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type) 128a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca{ 1292529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(fp, "%s", mode ? "soa" : "aos"); 1302529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 1312529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(fp, " type=%s%u%sx%u", 1322529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.floating ? "f" : (type.fixed ? "h" : (type.sign ? "s" : "u")), 1332529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.width, 1342529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.norm ? "n" : "", 1352529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.length); 1362529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 137a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, 1382529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca " %s=%s %s=%s %s=%s %s=%s %s=%s %s=%s", 139abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "rgb_func", util_dump_blend_func(blend->rt[0].rgb_func, TRUE), 140abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "rgb_src_factor", util_dump_blend_factor(blend->rt[0].rgb_src_factor, TRUE), 141abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "rgb_dst_factor", util_dump_blend_factor(blend->rt[0].rgb_dst_factor, TRUE), 142abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "alpha_func", util_dump_blend_func(blend->rt[0].alpha_func, TRUE), 143abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "alpha_src_factor", util_dump_blend_factor(blend->rt[0].alpha_src_factor, TRUE), 144abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "alpha_dst_factor", util_dump_blend_factor(blend->rt[0].alpha_dst_factor, TRUE)); 145a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 1463130b9921cac4a8674b59c6d63bc2d248a4bdc4aJosé Fonseca fprintf(fp, " ...\n"); 147a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fflush(fp); 148a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca} 149a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 150a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 1517d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef 1527d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecaadd_blend_test(LLVMModuleRef module, 153ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca const struct pipe_blend_state *blend, 1542529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca enum vector_mode mode, 155b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type) 1567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 157b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca LLVMTypeRef ret_type; 158ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca LLVMTypeRef vec_type; 1597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMTypeRef args[4]; 1607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef func; 1617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef src_ptr; 1627d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef dst_ptr; 1637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef const_ptr; 1647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef res_ptr; 1657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMBasicBlockRef block; 1667d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMBuilderRef builder; 1677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 168b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca ret_type = LLVMInt64Type(); 169ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca vec_type = lp_build_vec_type(type); 170ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 171ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca args[3] = args[2] = args[1] = args[0] = LLVMPointerType(vec_type, 0); 1725940ba26f78f482442644f52468d65c1e5662d10José Fonseca func = LLVMAddFunction(module, "test", LLVMFunctionType(LLVMVoidType(), args, 4, 0)); 1737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMSetFunctionCallConv(func, LLVMCCallConv); 1747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca src_ptr = LLVMGetParam(func, 0); 1757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca dst_ptr = LLVMGetParam(func, 1); 1767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca const_ptr = LLVMGetParam(func, 2); 1777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res_ptr = LLVMGetParam(func, 3); 1787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca block = LLVMAppendBasicBlock(func, "entry"); 1807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca builder = LLVMCreateBuilder(); 1817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMPositionBuilderAtEnd(builder, block); 1827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1832529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if (mode == AoS) { 1842529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef src; 1852529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef dst; 1862529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef con; 1872529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef res; 1882529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 1892529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca src = LLVMBuildLoad(builder, src_ptr, "src"); 1902529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dst = LLVMBuildLoad(builder, dst_ptr, "dst"); 1912529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca con = LLVMBuildLoad(builder, const_ptr, "const"); 1927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1932529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca res = lp_build_blend_aos(builder, blend, type, src, dst, con, 3); 1947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1955999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca lp_build_name(res, "res"); 1967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1972529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMBuildStore(builder, res, res_ptr); 1982529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 1992529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 2002529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if (mode == SoA) { 2012529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef src[4]; 2022529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef dst[4]; 2032529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef con[4]; 2042529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef res[4]; 2052529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca unsigned i; 2062529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 2072529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(i = 0; i < 4; ++i) { 2082529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0); 2095999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca src[i] = LLVMBuildLoad(builder, LLVMBuildGEP(builder, src_ptr, &index, 1, ""), ""); 2105999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca dst[i] = LLVMBuildLoad(builder, LLVMBuildGEP(builder, dst_ptr, &index, 1, ""), ""); 2115999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca con[i] = LLVMBuildLoad(builder, LLVMBuildGEP(builder, const_ptr, &index, 1, ""), ""); 2125999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca lp_build_name(src[i], "src.%c", "rgba"[i]); 2135999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca lp_build_name(con[i], "con.%c", "rgba"[i]); 2145999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca lp_build_name(dst[i], "dst.%c", "rgba"[i]); 2152529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 2162529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 2172529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca lp_build_blend_soa(builder, blend, type, src, dst, con, res); 2182529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 2192529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(i = 0; i < 4; ++i) { 2202529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0); 2215999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca lp_build_name(res[i], "res.%c", "rgba"[i]); 2222529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca LLVMBuildStore(builder, res[i], LLVMBuildGEP(builder, res_ptr, &index, 1, "")); 2232529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 2242529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 2257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2265940ba26f78f482442644f52468d65c1e5662d10José Fonseca LLVMBuildRetVoid(builder);; 2277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMDisposeBuilder(builder); 2297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return func; 2307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 2317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2337d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca/** Add and limit result to ceiling of 1.0 */ 2347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#define ADD_SAT(R, A, B) \ 2357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecado { \ 2367d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca R = (A) + (B); if (R > 1.0f) R = 1.0f; \ 2377d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} while (0) 2387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca/** Subtract and limit result to floor of 0.0 */ 2407d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#define SUB_SAT(R, A, B) \ 2417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecado { \ 2427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca R = (A) - (B); if (R < 0.0f) R = 0.0f; \ 2437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} while (0) 2447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic void 2477d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecacompute_blend_ref_term(unsigned rgb_factor, 2487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca unsigned alpha_factor, 249e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *factor, 250e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *src, 251e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *dst, 252e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *con, 253e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double *term) 2547d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 255e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double temp; 2567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2577d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca switch (rgb_factor) { 2587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ONE: 2597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0]; /* R */ 2607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1]; /* G */ 2617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2]; /* B */ 2627d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_COLOR: 2647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * src[0]; /* R */ 2657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * src[1]; /* G */ 2667d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * src[2]; /* B */ 2677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2687d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA: 2697d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * src[3]; /* R */ 2707d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * src[3]; /* G */ 2717d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * src[3]; /* B */ 2727d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_COLOR: 2747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * dst[0]; /* R */ 2757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * dst[1]; /* G */ 2767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * dst[2]; /* B */ 2777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_ALPHA: 2797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * dst[3]; /* R */ 2807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * dst[3]; /* G */ 2817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * dst[3]; /* B */ 2827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 2847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca temp = MIN2(src[3], 1.0f - dst[3]); 2857d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * temp; /* R */ 2867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * temp; /* G */ 2877d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * temp; /* B */ 2887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_COLOR: 290ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * con[0]; /* R */ 291ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * con[1]; /* G */ 292ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * con[2]; /* B */ 2937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_ALPHA: 295ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * con[3]; /* R */ 296ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * con[3]; /* G */ 297ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * con[3]; /* B */ 2987d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_COLOR: 3007d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); /* to do */ 3017d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3027d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_ALPHA: 3037d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); /* to do */ 3047d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3057d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ZERO: 3067d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = 0.0f; /* R */ 3077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = 0.0f; /* G */ 3087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = 0.0f; /* B */ 3097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_COLOR: 3117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - src[0]); /* R */ 3127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - src[1]); /* G */ 3137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - src[2]); /* B */ 3147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 3167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - src[3]); /* R */ 3177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - src[3]); /* G */ 3187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - src[3]); /* B */ 3197d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_ALPHA: 3217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - dst[3]); /* R */ 3227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - dst[3]); /* G */ 3237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - dst[3]); /* B */ 3247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_COLOR: 3267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - dst[0]); /* R */ 3277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - dst[1]); /* G */ 3287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - dst[2]); /* B */ 3297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_COLOR: 331ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * (1.0f - con[0]); /* R */ 332ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * (1.0f - con[1]); /* G */ 333ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * (1.0f - con[2]); /* B */ 3347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 336ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * (1.0f - con[3]); /* R */ 337ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * (1.0f - con[3]); /* G */ 338ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * (1.0f - con[3]); /* B */ 3397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3407d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 3417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); /* to do */ 3427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 3447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); /* to do */ 3457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 3477d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 3487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 3497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* 3517d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Compute src/first term A 3527d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 3537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca switch (alpha_factor) { 3547d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ONE: 3557d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3]; /* A */ 3567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3577d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_COLOR: 3587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA: 3597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * src[3]; /* A */ 3607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_COLOR: 3627d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_ALPHA: 3637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * dst[3]; /* A */ 3647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 3667d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = src[3]; /* A */ 3677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3687d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_COLOR: 3697d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_ALPHA: 370ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[3] = factor[3] * con[3]; /* A */ 3717d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3727d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ZERO: 3737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = 0.0f; /* A */ 3747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_COLOR: 3767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 3777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * (1.0f - src[3]); /* A */ 3787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_COLOR: 3807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_ALPHA: 3817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * (1.0f - dst[3]); /* A */ 3827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_COLOR: 3847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 385ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[3] = factor[3] * (1.0f - con[3]); 3867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3877d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 3887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 3897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 3907d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 3917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic void 3947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecacompute_blend_ref(const struct pipe_blend_state *blend, 395e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *src, 396e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *dst, 397e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *con, 398e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double *res) 3997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 400e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double src_term[4]; 401e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double dst_term[4]; 4027d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 40399e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger compute_blend_ref_term(blend->rt[0].rgb_src_factor, blend->rt[0].alpha_src_factor, 40499e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger src, src, dst, con, src_term); 40599e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger compute_blend_ref_term(blend->rt[0].rgb_dst_factor, blend->rt[0].alpha_dst_factor, 40699e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger dst, src, dst, con, dst_term); 4077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* 4097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Combine RGB terms 4107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 41199e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger switch (blend->rt[0].rgb_func) { 4127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_ADD: 4137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca ADD_SAT(res[0], src_term[0], dst_term[0]); /* R */ 4147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca ADD_SAT(res[1], src_term[1], dst_term[1]); /* G */ 4157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca ADD_SAT(res[2], src_term[2], dst_term[2]); /* B */ 4167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_SUBTRACT: 4187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[0], src_term[0], dst_term[0]); /* R */ 4197d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[1], src_term[1], dst_term[1]); /* G */ 4207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[2], src_term[2], dst_term[2]); /* B */ 4217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_REVERSE_SUBTRACT: 4237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[0], dst_term[0], src_term[0]); /* R */ 4247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[1], dst_term[1], src_term[1]); /* G */ 4257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[2], dst_term[2], src_term[2]); /* B */ 4267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MIN: 4287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[0] = MIN2(src_term[0], dst_term[0]); /* R */ 4297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[1] = MIN2(src_term[1], dst_term[1]); /* G */ 4307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[2] = MIN2(src_term[2], dst_term[2]); /* B */ 4317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MAX: 4337d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[0] = MAX2(src_term[0], dst_term[0]); /* R */ 4347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[1] = MAX2(src_term[1], dst_term[1]); /* G */ 4357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[2] = MAX2(src_term[2], dst_term[2]); /* B */ 4367d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4377d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 4387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 4397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 4407d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* 4427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Combine A terms 4437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 44499e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger switch (blend->rt[0].alpha_func) { 4457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_ADD: 4467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca ADD_SAT(res[3], src_term[3], dst_term[3]); /* A */ 4477d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_SUBTRACT: 4497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[3], src_term[3], dst_term[3]); /* A */ 4507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4517d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_REVERSE_SUBTRACT: 4527d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca SUB_SAT(res[3], dst_term[3], src_term[3]); /* A */ 4537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4547d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MIN: 4557d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[3] = MIN2(src_term[3], dst_term[3]); /* A */ 4567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4577d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MAX: 4587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[3] = MAX2(src_term[3], dst_term[3]); /* A */ 4597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 4617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 4627d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 4637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 4647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 46626c78a4968a3c10ca006699d240150e6aa4b4250José FonsecaPIPE_ALIGN_STACK 4677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic boolean 468e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecatest_one(unsigned verbose, 469e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca FILE *fp, 470a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const struct pipe_blend_state *blend, 4712529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca enum vector_mode mode, 472b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type) 4737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 4747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMModuleRef module = NULL; 4757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef func = NULL; 4767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMExecutionEngineRef engine = NULL; 4777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMModuleProviderRef provider = NULL; 4787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMPassManagerRef pass = NULL; 4797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca char *error = NULL; 4807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca blend_test_ptr_t blend_test_ptr; 4817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca boolean success; 4829aafa1fbd247cd6d1bb0ab47bc5b318bd0d67bc5José Fonseca const unsigned n = LP_TEST_NUM_SAMPLES; 4839aafa1fbd247cd6d1bb0ab47bc5b318bd0d67bc5José Fonseca int64_t cycles[LP_TEST_NUM_SAMPLES]; 484a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca double cycles_avg = 0.0; 485e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca unsigned i, j; 4867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 487a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca if(verbose >= 1) 4882529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_blend_type(stdout, blend, mode, type); 489a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 4907d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca module = LLVMModuleCreateWithName("test"); 4917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4922529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca func = add_blend_test(module, blend, mode, type); 4937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca if(LLVMVerifyModule(module, LLVMPrintMessageAction, &error)) { 4957d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMDumpModule(module); 4967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca abort(); 4977d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 4987ace0b1f4ac48caaa8c477d0641cfc7c4d9518c0José Fonseca LLVMDisposeMessage(error); 4997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 5007d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca provider = LLVMCreateModuleProviderForExistingModule(module); 5017d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca if (LLVMCreateJITCompiler(&engine, provider, 1, &error)) { 5023130b9921cac4a8674b59c6d63bc2d248a4bdc4aJosé Fonseca if(verbose < 1) 5032529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_blend_type(stderr, blend, mode, type); 5047d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca fprintf(stderr, "%s\n", error); 5057d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMDisposeMessage(error); 5067d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca abort(); 5077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 5087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 5097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#if 0 5107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca pass = LLVMCreatePassManager(); 5117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMAddTargetData(LLVMGetExecutionEngineTargetData(engine), pass); 5127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* These are the passes currently listed in llvm-c/Transforms/Scalar.h, 5137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * but there are more on SVN. */ 5147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMAddConstantPropagationPass(pass); 5157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMAddInstructionCombiningPass(pass); 5167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMAddPromoteMemoryToRegisterPass(pass); 5177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMAddGVNPass(pass); 5187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMAddCFGSimplificationPass(pass); 5197d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMRunPassManager(pass, module); 5207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#else 5217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca (void)pass; 5227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#endif 5237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 5247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca if(verbose >= 2) 5257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMDumpModule(module); 5267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 527b19cb0080cbc9877993e76f6cbd6bc170d3d2851José Fonseca blend_test_ptr = (blend_test_ptr_t)LLVMGetPointerToGlobal(engine, func); 528b19cb0080cbc9877993e76f6cbd6bc170d3d2851José Fonseca 529818d444e12bb57568fbf3bf5f06ee24c6c73a61aJosé Fonseca if(verbose >= 2) 530818d444e12bb57568fbf3bf5f06ee24c6c73a61aJosé Fonseca lp_disassemble(blend_test_ptr); 531818d444e12bb57568fbf3bf5f06ee24c6c73a61aJosé Fonseca 5327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca success = TRUE; 533b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca for(i = 0; i < n && success; ++i) { 5342529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(mode == AoS) { 5355dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t src[LP_NATIVE_VECTOR_WIDTH/8]; 5365dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t dst[LP_NATIVE_VECTOR_WIDTH/8]; 5375dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t con[LP_NATIVE_VECTOR_WIDTH/8]; 5385dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t res[LP_NATIVE_VECTOR_WIDTH/8]; 5395dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t ref[LP_NATIVE_VECTOR_WIDTH/8]; 5402529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca int64_t start_counter = 0; 5412529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca int64_t end_counter = 0; 5422529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5432529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, src); 5442529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, dst); 5452529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, con); 5462529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5472529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca { 5482529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fsrc[LP_MAX_VECTOR_LENGTH]; 5492529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fdst[LP_MAX_VECTOR_LENGTH]; 5502529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fcon[LP_MAX_VECTOR_LENGTH]; 5512529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fref[LP_MAX_VECTOR_LENGTH]; 5522529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5532529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca read_vec(type, src, fsrc); 5542529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca read_vec(type, dst, fdst); 5552529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca read_vec(type, con, fcon); 5562529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5572529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(j = 0; j < type.length; j += 4) 5582529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca compute_blend_ref(blend, fsrc + j, fdst + j, fcon + j, fref + j); 5592529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5602529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca write_vec(type, ref, fref); 5612529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 5622529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5632529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca start_counter = rdtsc(); 5642529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca blend_test_ptr(src, dst, con, res); 5652529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca end_counter = rdtsc(); 5662529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5672529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca cycles[i] = end_counter - start_counter; 5682529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5692529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(!compare_vec(type, res, ref)) { 5702529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca success = FALSE; 5712529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5722529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(verbose < 1) 5732529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_blend_type(stderr, blend, mode, type); 5742529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "MISMATCH\n"); 5752529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5762529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Src: "); 5772529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, src); 5782529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5792529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5802529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Dst: "); 5812529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, dst); 5822529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5832529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5842529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Con: "); 5852529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, con); 5862529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5872529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5882529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Res: "); 5892529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, res); 5902529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5912529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5922529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Ref: "); 5932529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, ref); 5942529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5952529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 596ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca } 597ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 5982529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(mode == SoA) { 5992529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca const unsigned stride = type.length*type.width/8; 6005dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t src[4*LP_NATIVE_VECTOR_WIDTH/8]; 6015dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t dst[4*LP_NATIVE_VECTOR_WIDTH/8]; 6025dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t con[4*LP_NATIVE_VECTOR_WIDTH/8]; 6035dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t res[4*LP_NATIVE_VECTOR_WIDTH/8]; 6045dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca PIPE_ALIGN_VAR(16) uint8_t ref[4*LP_NATIVE_VECTOR_WIDTH/8]; 6052529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca int64_t start_counter = 0; 6062529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca int64_t end_counter = 0; 6072529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca boolean mismatch; 6082529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 6092529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(j = 0; j < 4; ++j) { 6102529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, src + j*stride); 6112529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, dst + j*stride); 6122529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, con + j*stride); 6132529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 6147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6152529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca { 6162529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fsrc[4]; 6172529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fdst[4]; 6182529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fcon[4]; 6192529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fref[4]; 6202529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca unsigned k; 6212529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 6222529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(k = 0; k < type.length; ++k) { 6232529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(j = 0; j < 4; ++j) { 6242529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fsrc[j] = read_elem(type, src + j*stride, k); 6252529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fdst[j] = read_elem(type, dst + j*stride, k); 6262529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fcon[j] = read_elem(type, con + j*stride, k); 6272529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 6287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6292529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca compute_blend_ref(blend, fsrc, fdst, fcon, fref); 6307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6312529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(j = 0; j < 4; ++j) 6322529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca write_elem(type, ref + j*stride, k, fref[j]); 6332529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 6342529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 6352529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 6362529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca start_counter = rdtsc(); 6372529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca blend_test_ptr(src, dst, con, res); 6382529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca end_counter = rdtsc(); 6392529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 6402529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca cycles[i] = end_counter - start_counter; 6412529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 6422529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca mismatch = FALSE; 6432529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for (j = 0; j < 4; ++j) 6442529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(!compare_vec(type, res + j*stride, ref + j*stride)) 6452529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca mismatch = TRUE; 6467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6472529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if (mismatch) { 6482529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca success = FALSE; 649ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 6502529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(verbose < 1) 6512529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_blend_type(stderr, blend, mode, type); 6522529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "MISMATCH\n"); 6532529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(j = 0; j < 4; ++j) { 6542529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca char channel = "RGBA"[j]; 6552529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Src%c: ", channel); 6562529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, src + j*stride); 6572529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 658ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 6592529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Dst%c: ", channel); 6602529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, dst + j*stride); 6612529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 6625940ba26f78f482442644f52468d65c1e5662d10José Fonseca 6632529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Con%c: ", channel); 6642529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, con + j*stride); 6652529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 666e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca 6672529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Res%c: ", channel); 6682529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, res + j*stride); 6692529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 6702529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 6712529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Ref%c: ", channel); 6722529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, ref + j*stride); 6732529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 6742529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 6752529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 676e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca } 677b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca } 6787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 679b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca /* 680b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca * Unfortunately the output of cycle counter is not very reliable as it comes 681b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca * -- sometimes we get outliers (due IRQs perhaps?) which are 682b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca * better removed to avoid random or biased data. 683b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca */ 684a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca { 685b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca double sum = 0.0, sum2 = 0.0; 686b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca double avg, std; 687b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca unsigned m; 688b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 689b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca for(i = 0; i < n; ++i) { 690b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum += cycles[i]; 691b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum2 += cycles[i]*cycles[i]; 6927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 693b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 694b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca avg = sum/n; 695b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca std = sqrtf((sum2 - n*avg*avg)/n); 696b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 697b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca m = 0; 698b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum = 0.0; 699b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca for(i = 0; i < n; ++i) { 700b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca if(fabs(cycles[i] - avg) <= 4.0*std) { 701b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum += cycles[i]; 702b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca ++m; 703b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca } 704b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca } 705b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 706a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca cycles_avg = sum/m; 707b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 708a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca } 709a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 710a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca if(fp) 7112529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca write_tsv_row(fp, blend, mode, type, cycles_avg, success); 712a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 713b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca if (!success) { 7143130b9921cac4a8674b59c6d63bc2d248a4bdc4aJosé Fonseca if(verbose < 2) 7153130b9921cac4a8674b59c6d63bc2d248a4bdc4aJosé Fonseca LLVMDumpModule(module); 716b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca LLVMWriteBitcodeToFile(module, "blend.bc"); 717b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca fprintf(stderr, "blend.bc written\n"); 7183130b9921cac4a8674b59c6d63bc2d248a4bdc4aJosé Fonseca fprintf(stderr, "Invoke as \"llc -o - blend.bc\"\n"); 719b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca abort(); 7207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 7217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7227ace0b1f4ac48caaa8c477d0641cfc7c4d9518c0José Fonseca LLVMFreeMachineCodeForFunction(engine, func); 7237ace0b1f4ac48caaa8c477d0641cfc7c4d9518c0José Fonseca 7247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMDisposeExecutionEngine(engine); 7257ace0b1f4ac48caaa8c477d0641cfc7c4d9518c0José Fonseca if(pass) 7267ace0b1f4ac48caaa8c477d0641cfc7c4d9518c0José Fonseca LLVMDisposePassManager(pass); 7277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return success; 7297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 7307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 732a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecaconst unsigned 7337d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecablend_factors[] = { 734a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_ZERO, 735a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_ONE, 736a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC_COLOR, 737a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC_ALPHA, 738a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_DST_COLOR, 739a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_DST_ALPHA, 740a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_CONST_COLOR, 741a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_CONST_ALPHA, 7427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#if 0 743a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC1_COLOR, 744a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC1_ALPHA, 7457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#endif 746a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE, 747a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC_COLOR, 748a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC_ALPHA, 749a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_DST_COLOR, 750a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_DST_ALPHA, 751a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_CONST_COLOR, 752a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_CONST_ALPHA, 7537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#if 0 754a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC1_COLOR, 755a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC1_ALPHA, 7567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca#endif 7577d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}; 7587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 760a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecaconst unsigned 7617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecablend_funcs[] = { 762a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_ADD, 763a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_SUBTRACT, 764a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_REVERSE_SUBTRACT, 765a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_MIN, 766a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_MAX 7677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}; 7687d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7697d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 770b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecaconst struct lp_type blend_types[] = { 771ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca /* float, fixed, sign, norm, width, len */ 772b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca { TRUE, FALSE, FALSE, TRUE, 32, 4 }, /* f32 x 4 */ 773b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca { FALSE, FALSE, FALSE, TRUE, 8, 16 }, /* u8n x 16 */ 774ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca}; 775ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 776ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 7777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecaconst unsigned num_funcs = sizeof(blend_funcs)/sizeof(blend_funcs[0]); 7787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecaconst unsigned num_factors = sizeof(blend_factors)/sizeof(blend_factors[0]); 779ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonsecaconst unsigned num_types = sizeof(blend_types)/sizeof(blend_types[0]); 7807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 782e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecaboolean 783e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecatest_all(unsigned verbose, FILE *fp) 7847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 785a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_func; 786a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_src_factor; 787a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_dst_factor; 788a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_func; 789a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_src_factor; 790a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_dst_factor; 7917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca struct pipe_blend_state blend; 7922529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca enum vector_mode mode; 793b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca const struct lp_type *type; 7947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca bool success = TRUE; 7957d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(rgb_func = blend_funcs; rgb_func < &blend_funcs[num_funcs]; ++rgb_func) { 7977d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(alpha_func = blend_funcs; alpha_func < &blend_funcs[num_funcs]; ++alpha_func) { 7987d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(rgb_src_factor = blend_factors; rgb_src_factor < &blend_factors[num_factors]; ++rgb_src_factor) { 7997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(rgb_dst_factor = blend_factors; rgb_dst_factor <= rgb_src_factor; ++rgb_dst_factor) { 8007d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(alpha_src_factor = blend_factors; alpha_src_factor < &blend_factors[num_factors]; ++alpha_src_factor) { 8017d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(alpha_dst_factor = blend_factors; alpha_dst_factor <= alpha_src_factor; ++alpha_dst_factor) { 8022529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(mode = 0; mode < 2; ++mode) { 8032529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(type = blend_types; type < &blend_types[num_types]; ++type) { 8042529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 8052529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(*rgb_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE || 8062529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca *alpha_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE) 8072529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca continue; 8082529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 8092529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca memset(&blend, 0, sizeof blend); 81099e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].blend_enable = 1; 81199e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_func = *rgb_func; 81299e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_src_factor = *rgb_src_factor; 81399e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_dst_factor = *rgb_dst_factor; 81499e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_func = *alpha_func; 81599e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_src_factor = *alpha_src_factor; 81699e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_dst_factor = *alpha_dst_factor; 81799e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 8182529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 8192529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(!test_one(verbose, fp, &blend, mode, *type)) 8202529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca success = FALSE; 8212529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 8222529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 823ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca } 8247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 8257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 8267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 8277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 8287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 8297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 8307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 8317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return success; 8327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 8337d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 8347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 835e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecaboolean 836e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecatest_some(unsigned verbose, FILE *fp, unsigned long n) 8377d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 838a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_func; 839a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_src_factor; 840a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_dst_factor; 841a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_func; 842a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_src_factor; 843a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_dst_factor; 8447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca struct pipe_blend_state blend; 8452529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca enum vector_mode mode; 846b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca const struct lp_type *type; 8477d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca unsigned long i; 8487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca bool success = TRUE; 8497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 8507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(i = 0; i < n; ++i) { 851459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca rgb_func = &blend_funcs[rand() % num_funcs]; 852459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca alpha_func = &blend_funcs[rand() % num_funcs]; 853459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca rgb_src_factor = &blend_factors[rand() % num_factors]; 854459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca alpha_src_factor = &blend_factors[rand() % num_factors]; 8557d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 8567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca do { 857459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca rgb_dst_factor = &blend_factors[rand() % num_factors]; 858a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca } while(*rgb_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE); 8597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 8607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca do { 861459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca alpha_dst_factor = &blend_factors[rand() % num_factors]; 862a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca } while(*alpha_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE); 8637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 864459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca mode = rand() & 1; 865ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 866459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca type = &blend_types[rand() % num_types]; 867a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 8682529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca memset(&blend, 0, sizeof blend); 86999e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].blend_enable = 1; 87099e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_func = *rgb_func; 87199e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_src_factor = *rgb_src_factor; 87299e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_dst_factor = *rgb_dst_factor; 87399e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_func = *alpha_func; 87499e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_src_factor = *alpha_src_factor; 87599e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_dst_factor = *alpha_dst_factor; 87699e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 8772529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 8782529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(!test_one(verbose, fp, &blend, mode, *type)) 8792529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca success = FALSE; 8807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 8817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 8827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return success; 8837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 884