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