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