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 393469715a8a171512cf9b528702e70393f01c6041José Fonseca#include "util/u_memory.h" 407d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 41d05cb9f0187984e461b41eb1ba6ca2adf0593c74Brian Paul#include "gallivm/lp_bld_init.h" 42c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_type.h" 43c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_debug.h" 4492b2af5f9a16b1cc028295e5222cf54a2f633248Brian Paul#include "lp_bld_blend.h" 45e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca#include "lp_test.h" 467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 477d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4867906f91c9b924306d6bfec5d718b6225390205dRoland Scheideggertypedef void (*blend_test_ptr_t)(const void *src, const void *src1, 4967906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger const void *dst, const void *con, void *res); 50b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 51b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 52e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecavoid 53a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecawrite_tsv_header(FILE *fp) 54a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca{ 55a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, 56a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "result\t" 57b07d19a8859efb930d837c3b324be94cf412d819José Fonseca "cycles_per_channel\t" 58a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "type\t" 591165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "sep_func\t" 601165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "sep_src_factor\t" 611165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "sep_dst_factor\t" 62a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "rgb_func\t" 63a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "rgb_src_factor\t" 64a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "rgb_dst_factor\t" 65a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "alpha_func\t" 66a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "alpha_src_factor\t" 67a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "alpha_dst_factor\n"); 68a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 69a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fflush(fp); 70a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca} 71a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 72a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 73a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecastatic void 74a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecawrite_tsv_row(FILE *fp, 75a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const struct pipe_blend_state *blend, 76b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 77a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca double cycles, 78a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca boolean success) 79a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca{ 80a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, "%s\t", success ? "pass" : "fail"); 81a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 8288e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca fprintf(fp, "%.1f\t", cycles / type.length); 83a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 84a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, "%s%u%sx%u\t", 85a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.floating ? "f" : (type.fixed ? "h" : (type.sign ? "s" : "u")), 86a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.width, 87a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.norm ? "n" : "", 88a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca type.length); 89a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 90a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, 911165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca "%s\t%s\t%s\t", 9299e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend->rt[0].rgb_func != blend->rt[0].alpha_func ? "true" : "false", 9399e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend->rt[0].rgb_src_factor != blend->rt[0].alpha_src_factor ? "true" : "false", 9499e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend->rt[0].rgb_dst_factor != blend->rt[0].alpha_dst_factor ? "true" : "false"); 951165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca 961165c30dc2960c0488c21d542fd78485244cae2cJosé Fonseca fprintf(fp, 97a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca "%s\t%s\t%s\t%s\t%s\t%s\n", 98abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_func(blend->rt[0].rgb_func, TRUE), 99abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].rgb_src_factor, TRUE), 100abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].rgb_dst_factor, TRUE), 101abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_func(blend->rt[0].alpha_func, TRUE), 102abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].alpha_src_factor, TRUE), 103abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca util_dump_blend_factor(blend->rt[0].alpha_dst_factor, TRUE)); 104a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 105a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fflush(fp); 106a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca} 107a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 108a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 109a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecastatic void 110a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecadump_blend_type(FILE *fp, 111a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const struct pipe_blend_state *blend, 112b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type) 113a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca{ 1142529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(fp, " type=%s%u%sx%u", 1152529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.floating ? "f" : (type.fixed ? "h" : (type.sign ? "s" : "u")), 1162529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.width, 1172529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.norm ? "n" : "", 1182529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca type.length); 1192529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 120a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fprintf(fp, 1212529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca " %s=%s %s=%s %s=%s %s=%s %s=%s %s=%s", 122abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "rgb_func", util_dump_blend_func(blend->rt[0].rgb_func, TRUE), 123abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "rgb_src_factor", util_dump_blend_factor(blend->rt[0].rgb_src_factor, TRUE), 124abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "rgb_dst_factor", util_dump_blend_factor(blend->rt[0].rgb_dst_factor, TRUE), 125abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "alpha_func", util_dump_blend_func(blend->rt[0].alpha_func, TRUE), 126abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "alpha_src_factor", util_dump_blend_factor(blend->rt[0].alpha_src_factor, TRUE), 127abdcdb3db73316c5ebca88bda04b90b6659782e8José Fonseca "alpha_dst_factor", util_dump_blend_factor(blend->rt[0].alpha_dst_factor, TRUE)); 128a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 1293130b9921cac4a8674b59c6d63bc2d248a4bdc4aJosé Fonseca fprintf(fp, " ...\n"); 130a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca fflush(fp); 131a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca} 132a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 133a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 1347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic LLVMValueRef 135efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Pauladd_blend_test(struct gallivm_state *gallivm, 136ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca const struct pipe_blend_state *blend, 137b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type) 1387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 139efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMModuleRef module = gallivm->module; 140efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMContextRef context = gallivm->context; 141ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca LLVMTypeRef vec_type; 14267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger LLVMTypeRef args[5]; 1437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef func; 1447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef src_ptr; 14567906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger LLVMValueRef src1_ptr; 1467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef dst_ptr; 1477d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef const_ptr; 1487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef res_ptr; 1497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMBasicBlockRef block; 1507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMBuilderRef builder; 1510b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton const enum pipe_format format = PIPE_FORMAT_R8G8B8A8_UNORM; 152f795735f4251d5f7842ee9e09994641c5c46d25dBrian Paul const unsigned rt = 0; 1530b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton const unsigned char swizzle[4] = { 0, 1, 2, 3 }; 15488e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca LLVMValueRef src; 15567906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger LLVMValueRef src1; 15688e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca LLVMValueRef dst; 15788e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca LLVMValueRef con; 15888e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca LLVMValueRef res; 1597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 160efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul vec_type = lp_build_vec_type(gallivm, type); 161ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 16267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger args[4] = args[3] = args[2] = args[1] = args[0] = LLVMPointerType(vec_type, 0); 16367906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger func = LLVMAddFunction(module, "test", LLVMFunctionType(LLVMVoidTypeInContext(context), args, 5, 0)); 1647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMSetFunctionCallConv(func, LLVMCCallConv); 1657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca src_ptr = LLVMGetParam(func, 0); 16667906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger src1_ptr = LLVMGetParam(func, 1); 16767906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger dst_ptr = LLVMGetParam(func, 2); 16867906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger const_ptr = LLVMGetParam(func, 3); 16967906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger res_ptr = LLVMGetParam(func, 4); 1707d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 171efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul block = LLVMAppendBasicBlockInContext(context, func, "entry"); 172efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul builder = gallivm->builder; 1737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMPositionBuilderAtEnd(builder, block); 1747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 17588e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca src = LLVMBuildLoad(builder, src_ptr, "src"); 17667906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger src1 = LLVMBuildLoad(builder, src1_ptr, "src1"); 17788e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca dst = LLVMBuildLoad(builder, dst_ptr, "dst"); 17888e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca con = LLVMBuildLoad(builder, const_ptr, "const"); 1792529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 1808b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger res = lp_build_blend_aos(gallivm, blend, format, type, rt, src, NULL, 1818b8bca06dff5b30da1ac97d18cc0e91acb13d516Roland Scheidegger src1, NULL, dst, NULL, con, NULL, swizzle, 4); 1827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 18388e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca lp_build_name(res, "res"); 1847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 18588e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca LLVMBuildStore(builder, res, res_ptr); 1867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 187bfabd5e74a8898a470c91924cbcf95e6876fbe95Edward O'Callaghan LLVMBuildRetVoid(builder); 1887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 189d8a4c4c524f7026aa07fca25b387a94d037652ceJosé Fonseca gallivm_verify_function(gallivm, func); 190d8a4c4c524f7026aa07fca25b387a94d037652ceJosé Fonseca 1917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return func; 1927d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 1937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 1957d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic void 1967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecacompute_blend_ref_term(unsigned rgb_factor, 1977d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca unsigned alpha_factor, 198e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *factor, 199e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *src, 20067906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger const double *src1, 201e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *dst, 202e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *con, 203e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double *term) 2047d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 205e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double temp; 2067d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 2077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca switch (rgb_factor) { 2087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ONE: 2097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0]; /* R */ 2107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1]; /* G */ 2117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2]; /* B */ 2127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_COLOR: 2147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * src[0]; /* R */ 2157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * src[1]; /* G */ 2167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * src[2]; /* B */ 2177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA: 2197d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * src[3]; /* R */ 2207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * src[3]; /* G */ 2217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * src[3]; /* B */ 2227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_COLOR: 2247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * dst[0]; /* R */ 2257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * dst[1]; /* G */ 2267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * dst[2]; /* B */ 2277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_ALPHA: 2297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * dst[3]; /* R */ 2307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * dst[3]; /* G */ 2317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * dst[3]; /* B */ 2327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2337d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 2347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca temp = MIN2(src[3], 1.0f - dst[3]); 2357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * temp; /* R */ 2367d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * temp; /* G */ 2377d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * temp; /* B */ 2387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_COLOR: 240ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * con[0]; /* R */ 241ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * con[1]; /* G */ 242ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * con[2]; /* B */ 2437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_ALPHA: 245ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * con[3]; /* R */ 246ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * con[3]; /* G */ 247ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * con[3]; /* B */ 2487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_COLOR: 25067906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[0] = factor[0] * src1[0]; /* R */ 25167906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[1] = factor[1] * src1[1]; /* G */ 25267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[2] = factor[2] * src1[2]; /* B */ 2537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2547d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC1_ALPHA: 25567906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[0] = factor[0] * src1[3]; /* R */ 25667906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[1] = factor[1] * src1[3]; /* G */ 25767906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[2] = factor[2] * src1[3]; /* B */ 2587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ZERO: 2607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = 0.0f; /* R */ 2617d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = 0.0f; /* G */ 2627d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = 0.0f; /* B */ 2637d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2647d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_COLOR: 2657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - src[0]); /* R */ 2667d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - src[1]); /* G */ 2677d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - src[2]); /* B */ 2687d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2697d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 2707d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - src[3]); /* R */ 2717d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - src[3]); /* G */ 2727d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - src[3]); /* B */ 2737d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_ALPHA: 2757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - dst[3]); /* R */ 2767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - dst[3]); /* G */ 2777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - dst[3]); /* B */ 2787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_COLOR: 2807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[0] = factor[0] * (1.0f - dst[0]); /* R */ 2817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[1] = factor[1] * (1.0f - dst[1]); /* G */ 2827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[2] = factor[2] * (1.0f - dst[2]); /* B */ 2837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_COLOR: 285ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * (1.0f - con[0]); /* R */ 286ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * (1.0f - con[1]); /* G */ 287ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * (1.0f - con[2]); /* B */ 2887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 290ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[0] = factor[0] * (1.0f - con[3]); /* R */ 291ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[1] = factor[1] * (1.0f - con[3]); /* G */ 292ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[2] = factor[2] * (1.0f - con[3]); /* B */ 2937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 29567906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[0] = factor[0] * (1.0f - src1[0]); /* R */ 29667906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[1] = factor[1] * (1.0f - src1[1]); /* G */ 29767906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[2] = factor[2] * (1.0f - src1[2]); /* B */ 2987d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 2997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 30067906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[0] = factor[0] * (1.0f - src1[3]); /* R */ 30167906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[1] = factor[1] * (1.0f - src1[3]); /* G */ 30267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[2] = factor[2] * (1.0f - src1[3]); /* B */ 3037d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3047d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 3057d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 3067d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 3077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* 3097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Compute src/first term A 3107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 3117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca switch (alpha_factor) { 3127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ONE: 3137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3]; /* A */ 3147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_COLOR: 3167d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA: 3177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * src[3]; /* A */ 3187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3197d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_COLOR: 3207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_DST_ALPHA: 3217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * dst[3]; /* A */ 3227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 3247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = src[3]; /* A */ 3257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_COLOR: 3277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_CONST_ALPHA: 328ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[3] = factor[3] * con[3]; /* A */ 3297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 33067906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger case PIPE_BLENDFACTOR_SRC1_COLOR: 33167906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger case PIPE_BLENDFACTOR_SRC1_ALPHA: 33267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[3] = factor[3] * src1[3]; /* A */ 33367906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger break; 3347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_ZERO: 3357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = 0.0f; /* A */ 3367d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3377d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_COLOR: 3387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 3397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * (1.0f - src[3]); /* A */ 3407d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3417d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_COLOR: 3427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_DST_ALPHA: 3437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca term[3] = factor[3] * (1.0f - dst[3]); /* A */ 3447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_COLOR: 3467d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 347ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca term[3] = factor[3] * (1.0f - con[3]); 3487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 34967906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 35067906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 35167906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger term[3] = factor[3] * (1.0f - src1[3]); /* A */ 35267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger break; 3537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 3547d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 3557d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 3567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 3577d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3597d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic void 3607d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecacompute_blend_ref(const struct pipe_blend_state *blend, 361e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *src, 36267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger const double *src1, 363e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *dst, 364e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca const double *con, 365e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double *res) 3667d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 367e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double src_term[4]; 368e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca double dst_term[4]; 3697d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 37099e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger compute_blend_ref_term(blend->rt[0].rgb_src_factor, blend->rt[0].alpha_src_factor, 37167906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger src, src, src1, dst, con, src_term); 37299e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger compute_blend_ref_term(blend->rt[0].rgb_dst_factor, blend->rt[0].alpha_dst_factor, 37367906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger dst, src, src1, dst, con, dst_term); 3747d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 3757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* 3767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Combine RGB terms 3777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 37899e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger switch (blend->rt[0].rgb_func) { 3797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_ADD: 3809a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[0] = src_term[0] + dst_term[0]; /* R */ 3819a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[1] = src_term[1] + dst_term[1]; /* G */ 3829a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[2] = src_term[2] + dst_term[2]; /* B */ 3837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_SUBTRACT: 3859a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[0] = src_term[0] - dst_term[0]; /* R */ 3869a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[1] = src_term[1] - dst_term[1]; /* G */ 3879a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[2] = src_term[2] - dst_term[2]; /* B */ 3887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_REVERSE_SUBTRACT: 3909a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[0] = dst_term[0] - src_term[0]; /* R */ 3919a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[1] = dst_term[1] - src_term[1]; /* G */ 3929a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[2] = dst_term[2] - src_term[2]; /* B */ 3937d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3947d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MIN: 3957d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[0] = MIN2(src_term[0], dst_term[0]); /* R */ 3967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[1] = MIN2(src_term[1], dst_term[1]); /* G */ 3977d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[2] = MIN2(src_term[2], dst_term[2]); /* B */ 3987d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 3997d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MAX: 4007d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[0] = MAX2(src_term[0], dst_term[0]); /* R */ 4017d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[1] = MAX2(src_term[1], dst_term[1]); /* G */ 4027d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[2] = MAX2(src_term[2], dst_term[2]); /* B */ 4037d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4047d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 4057d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 4067d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 4077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4087d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca /* 4097d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca * Combine A terms 4107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca */ 41199e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger switch (blend->rt[0].alpha_func) { 4127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_ADD: 4139a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[3] = src_term[3] + dst_term[3]; /* A */ 4147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_SUBTRACT: 4169a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[3] = src_term[3] - dst_term[3]; /* A */ 4177d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4187d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_REVERSE_SUBTRACT: 4199a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca res[3] = dst_term[3] - src_term[3]; /* A */ 4207d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MIN: 4227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[3] = MIN2(src_term[3], dst_term[3]); /* A */ 4237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4247d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca case PIPE_BLEND_MAX: 4257d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca res[3] = MAX2(src_term[3], dst_term[3]); /* A */ 4267d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca break; 4277d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca default: 4287d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca assert(0); 4297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 4307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 4317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 43326c78a4968a3c10ca006699d240150e6aa4b4250José FonsecaPIPE_ALIGN_STACK 4347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecastatic boolean 4353469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_one(unsigned verbose, 436e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca FILE *fp, 437a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const struct pipe_blend_state *blend, 438b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type) 4397d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 440524042fa35d3182227e81baeb295f4cb2ee73530José Fonseca LLVMContextRef context; 4413469715a8a171512cf9b528702e70393f01c6041José Fonseca struct gallivm_state *gallivm; 4427d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca LLVMValueRef func = NULL; 4437d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca blend_test_ptr_t blend_test_ptr; 4447d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca boolean success; 4459aafa1fbd247cd6d1bb0ab47bc5b318bd0d67bc5José Fonseca const unsigned n = LP_TEST_NUM_SAMPLES; 4469aafa1fbd247cd6d1bb0ab47bc5b318bd0d67bc5José Fonseca int64_t cycles[LP_TEST_NUM_SAMPLES]; 447a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca double cycles_avg = 0.0; 448e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonseca unsigned i, j; 4493469715a8a171512cf9b528702e70393f01c6041José Fonseca const unsigned stride = lp_type_width(type)/8; 4507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 451a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca if(verbose >= 1) 45288e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca dump_blend_type(stdout, blend, type); 453a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 454524042fa35d3182227e81baeb295f4cb2ee73530José Fonseca context = LLVMContextCreate(); 455524042fa35d3182227e81baeb295f4cb2ee73530José Fonseca gallivm = gallivm_create("test_module", context); 4567d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 45788e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca func = add_blend_test(gallivm, blend, type); 4587d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 4593469715a8a171512cf9b528702e70393f01c6041José Fonseca gallivm_compile_module(gallivm); 460b19cb0080cbc9877993e76f6cbd6bc170d3d2851José Fonseca 4613469715a8a171512cf9b528702e70393f01c6041José Fonseca blend_test_ptr = (blend_test_ptr_t)gallivm_jit_function(gallivm, func); 462818d444e12bb57568fbf3bf5f06ee24c6c73a61aJosé Fonseca 4630b239d9ed98f197176e2c9ccaaa3fb475144d23dJosé Fonseca gallivm_free_ir(gallivm); 4640b239d9ed98f197176e2c9ccaaa3fb475144d23dJosé Fonseca 4657d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca success = TRUE; 46688e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca 46788e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca { 46867906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger uint8_t *src, *src1, *dst, *con, *res, *ref; 4693469715a8a171512cf9b528702e70393f01c6041José Fonseca src = align_malloc(stride, stride); 47067906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger src1 = align_malloc(stride, stride); 4713469715a8a171512cf9b528702e70393f01c6041José Fonseca dst = align_malloc(stride, stride); 4723469715a8a171512cf9b528702e70393f01c6041José Fonseca con = align_malloc(stride, stride); 4733469715a8a171512cf9b528702e70393f01c6041José Fonseca res = align_malloc(stride, stride); 4743469715a8a171512cf9b528702e70393f01c6041José Fonseca ref = align_malloc(stride, stride); 4753469715a8a171512cf9b528702e70393f01c6041José Fonseca 4763469715a8a171512cf9b528702e70393f01c6041José Fonseca for(i = 0; i < n && success; ++i) { 4772529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca int64_t start_counter = 0; 4782529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca int64_t end_counter = 0; 4792529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 4802529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, src); 48167906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger random_vec(type, src1); 4822529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, dst); 4832529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca random_vec(type, con); 4842529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 4852529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca { 4862529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fsrc[LP_MAX_VECTOR_LENGTH]; 48767906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger double fsrc1[LP_MAX_VECTOR_LENGTH]; 4882529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fdst[LP_MAX_VECTOR_LENGTH]; 4892529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fcon[LP_MAX_VECTOR_LENGTH]; 4902529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca double fref[LP_MAX_VECTOR_LENGTH]; 4912529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 4922529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca read_vec(type, src, fsrc); 49367906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger read_vec(type, src1, fsrc1); 4942529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca read_vec(type, dst, fdst); 4952529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca read_vec(type, con, fcon); 4962529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 4972529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca for(j = 0; j < type.length; j += 4) 49867906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger compute_blend_ref(blend, fsrc + j, fsrc1 + j, fdst + j, fcon + j, fref + j); 4992529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5002529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca write_vec(type, ref, fref); 5012529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 5022529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5032529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca start_counter = rdtsc(); 50467906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger blend_test_ptr(src, src1, dst, con, res); 5052529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca end_counter = rdtsc(); 5062529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5072529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca cycles[i] = end_counter - start_counter; 5082529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5092529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(!compare_vec(type, res, ref)) { 5102529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca success = FALSE; 5112529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5122529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca if(verbose < 1) 51388e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca dump_blend_type(stderr, blend, type); 5142529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "MISMATCH\n"); 5152529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5162529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Src: "); 5172529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, src); 5182529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5192529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 52067906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger fprintf(stderr, " Src1: "); 52167906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger dump_vec(stderr, type, src1); 52267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger fprintf(stderr, "\n"); 52367906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger 5242529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Dst: "); 5252529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, dst); 5262529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5272529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5282529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Con: "); 5292529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, con); 5302529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5312529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5322529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Res: "); 5332529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, res); 5342529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5352529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 5362529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, " Ref: "); 5372529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca dump_vec(stderr, type, ref); 5382529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca fprintf(stderr, "\n"); 5392529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca } 540ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca } 5413469715a8a171512cf9b528702e70393f01c6041José Fonseca align_free(src); 54267906f91c9b924306d6bfec5d718b6225390205dRoland Scheidegger align_free(src1); 5433469715a8a171512cf9b528702e70393f01c6041José Fonseca align_free(dst); 5443469715a8a171512cf9b528702e70393f01c6041José Fonseca align_free(con); 5453469715a8a171512cf9b528702e70393f01c6041José Fonseca align_free(res); 5463469715a8a171512cf9b528702e70393f01c6041José Fonseca align_free(ref); 5473469715a8a171512cf9b528702e70393f01c6041José Fonseca } 5487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 549b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca /* 550b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca * Unfortunately the output of cycle counter is not very reliable as it comes 551b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca * -- sometimes we get outliers (due IRQs perhaps?) which are 552b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca * better removed to avoid random or biased data. 553b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca */ 554a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca { 555b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca double sum = 0.0, sum2 = 0.0; 556b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca double avg, std; 557b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca unsigned m; 558b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 559b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca for(i = 0; i < n; ++i) { 560b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum += cycles[i]; 561b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum2 += cycles[i]*cycles[i]; 5627d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 563b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 564b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca avg = sum/n; 565b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca std = sqrtf((sum2 - n*avg*avg)/n); 566b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 567b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca m = 0; 568b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum = 0.0; 569b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca for(i = 0; i < n; ++i) { 570b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca if(fabs(cycles[i] - avg) <= 4.0*std) { 571b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca sum += cycles[i]; 572b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca ++m; 573b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca } 574b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca } 575b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 576a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca cycles_avg = sum/m; 577b94e22e4be3b5a3a66eb9f595423f7ece66750b2José Fonseca 578a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca } 579a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 580a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca if(fp) 58188e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca write_tsv_row(fp, blend, type, cycles_avg, success); 582a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 5833469715a8a171512cf9b528702e70393f01c6041José Fonseca gallivm_destroy(gallivm); 584524042fa35d3182227e81baeb295f4cb2ee73530José Fonseca LLVMContextDispose(context); 5857ace0b1f4ac48caaa8c477d0641cfc7c4d9518c0José Fonseca 5867d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return success; 5877d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 5887d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 5897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 590a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecaconst unsigned 5917d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecablend_factors[] = { 592a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_ZERO, 593a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_ONE, 594a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC_COLOR, 595a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC_ALPHA, 596a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_DST_COLOR, 597a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_DST_ALPHA, 598a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_CONST_COLOR, 599a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_CONST_ALPHA, 600a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC1_COLOR, 601a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC1_ALPHA, 602a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE, 603a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC_COLOR, 604a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC_ALPHA, 605a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_DST_COLOR, 606a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_DST_ALPHA, 607a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_CONST_COLOR, 608a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_CONST_ALPHA, 609a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC1_COLOR, 610a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLENDFACTOR_INV_SRC1_ALPHA, 6117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}; 6127d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6137d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 614a77084ea4b5801dc3ba52f33533176da926aed16José Fonsecaconst unsigned 6157d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonsecablend_funcs[] = { 616a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_ADD, 617a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_SUBTRACT, 618a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_REVERSE_SUBTRACT, 619a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_MIN, 620a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca PIPE_BLEND_MAX 6217d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca}; 6227d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6237d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 624b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecaconst struct lp_type blend_types[] = { 625ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca /* float, fixed, sign, norm, width, len */ 6269a8e9f4595b66ea094b293da1afcded8f06ab3d6José Fonseca { TRUE, FALSE, TRUE, FALSE, 32, 4 }, /* f32 x 4 */ 627b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca { FALSE, FALSE, FALSE, TRUE, 8, 16 }, /* u8n x 16 */ 628ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca}; 629ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 630ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca 63170d2d3ef7f8ac98102cd930a3614eb758cfe7661Edward O'Callaghanconst unsigned num_funcs = ARRAY_SIZE(blend_funcs); 63270d2d3ef7f8ac98102cd930a3614eb758cfe7661Edward O'Callaghanconst unsigned num_factors = ARRAY_SIZE(blend_factors); 63370d2d3ef7f8ac98102cd930a3614eb758cfe7661Edward O'Callaghanconst unsigned num_types = ARRAY_SIZE(blend_types); 6347d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6357d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 636e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecaboolean 6373469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_all(unsigned verbose, FILE *fp) 6387d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 639a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_func; 640a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_src_factor; 641a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_dst_factor; 642a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_func; 643a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_src_factor; 644a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_dst_factor; 6457d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca struct pipe_blend_state blend; 646b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca const struct lp_type *type; 647bd024ce2b18c8086c6c557cfe9362eb7c954a724Brian Paul boolean success = TRUE; 6487d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6497d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(rgb_func = blend_funcs; rgb_func < &blend_funcs[num_funcs]; ++rgb_func) { 6507d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(alpha_func = blend_funcs; alpha_func < &blend_funcs[num_funcs]; ++alpha_func) { 6517d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(rgb_src_factor = blend_factors; rgb_src_factor < &blend_factors[num_factors]; ++rgb_src_factor) { 6527d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(rgb_dst_factor = blend_factors; rgb_dst_factor <= rgb_src_factor; ++rgb_dst_factor) { 6537d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(alpha_src_factor = blend_factors; alpha_src_factor < &blend_factors[num_factors]; ++alpha_src_factor) { 6547d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(alpha_dst_factor = blend_factors; alpha_dst_factor <= alpha_src_factor; ++alpha_dst_factor) { 65588e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca for(type = blend_types; type < &blend_types[num_types]; ++type) { 65688e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca 65788e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca if(*rgb_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE || 65888e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca *alpha_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE) 65988e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca continue; 66088e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca 66188e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca memset(&blend, 0, sizeof blend); 66288e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].blend_enable = 1; 66388e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].rgb_func = *rgb_func; 66488e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].rgb_src_factor = *rgb_src_factor; 66588e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].rgb_dst_factor = *rgb_dst_factor; 66688e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].alpha_func = *alpha_func; 66788e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].alpha_src_factor = *alpha_src_factor; 66888e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].alpha_dst_factor = *alpha_dst_factor; 66988e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca blend.rt[0].colormask = PIPE_MASK_RGBA; 67088e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca 67188e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca if(!test_one(verbose, fp, &blend, *type)) 67288e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca success = FALSE; 67388e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca 674ede73258a7604109b257bddb029b5f4dad5eb09dJosé Fonseca } 6757d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 6767d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 6777d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 6787d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 6797d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 6807d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 6817d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6827d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return success; 6837d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 6847d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 6857d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 686e6ebebc4853c98aa387b2c39a886a0c1173e93fbJosé Fonsecaboolean 6873469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_some(unsigned verbose, FILE *fp, 688efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul unsigned long n) 6897d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca{ 690a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_func; 691a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_src_factor; 692a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *rgb_dst_factor; 693a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_func; 694a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_src_factor; 695a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca const unsigned *alpha_dst_factor; 6967d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca struct pipe_blend_state blend; 697b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca const struct lp_type *type; 6987d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca unsigned long i; 699bd024ce2b18c8086c6c557cfe9362eb7c954a724Brian Paul boolean success = TRUE; 7007d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7017d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca for(i = 0; i < n; ++i) { 702459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca rgb_func = &blend_funcs[rand() % num_funcs]; 703459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca alpha_func = &blend_funcs[rand() % num_funcs]; 704459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca rgb_src_factor = &blend_factors[rand() % num_factors]; 705459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca alpha_src_factor = &blend_factors[rand() % num_factors]; 7067d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7077d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca do { 708459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca rgb_dst_factor = &blend_factors[rand() % num_factors]; 709a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca } while(*rgb_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE); 7107d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7117d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca do { 712459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca alpha_dst_factor = &blend_factors[rand() % num_factors]; 713a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca } while(*alpha_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE); 7147d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 715459ea0095c31eff835b25dd3eef48a4c073d05f9José Fonseca type = &blend_types[rand() % num_types]; 716a77084ea4b5801dc3ba52f33533176da926aed16José Fonseca 7172529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca memset(&blend, 0, sizeof blend); 71899e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].blend_enable = 1; 71999e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_func = *rgb_func; 72099e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_src_factor = *rgb_src_factor; 72199e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].rgb_dst_factor = *rgb_dst_factor; 72299e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_func = *alpha_func; 72399e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_src_factor = *alpha_src_factor; 72499e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].alpha_dst_factor = *alpha_dst_factor; 72599e28d4ee3ce995845d9290b735b1fbe1b96886dRoland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 7262529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca 72788e92f5bcd41a4affc0f5fc4433f7c9029cb8c03José Fonseca if(!test_one(verbose, fp, &blend, *type)) 7282529ed5616b1b152766a3355444260b88184cd6eJosé Fonseca success = FALSE; 7297d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca } 7307d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca 7317d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca return success; 7327d043162c5d9150947d9341cfa22192bd4c70fdeJosé Fonseca} 7334f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul 7344f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul 7354f067ada47bfeef792e5adbed4f3e215b704212aBrian Paulboolean 7363469715a8a171512cf9b528702e70393f01c6041José Fonsecatest_single(unsigned verbose, FILE *fp) 7374f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul{ 7384f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul printf("no test_single()"); 7394f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul return TRUE; 7404f067ada47bfeef792e5adbed4f3e215b704212aBrian Paul} 741