SkNxTest.cpp revision 8d3e9dff3f3db3fa77c383e4cd6c47b9898a8fcd
1/* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "SkNx.h" 9#include "Test.h" 10 11template <int N, typename T> 12static void test_Nf(skiatest::Reporter* r) { 13 14 auto assert_nearly_eq = [&](double eps, const SkNf<N,T>& v, T a, T b, T c, T d) { 15 auto close = [=](T a, T b) { return fabs(a-b) <= eps; }; 16 T vals[4]; 17 v.store(vals); 18 bool ok = close(vals[0], a) && close(vals[1], b) 19 && close(v.template kth<0>(), a) && close(v.template kth<1>(), b); 20 REPORTER_ASSERT(r, ok); 21 if (N == 4) { 22 ok = close(vals[2], c) && close(vals[3], d) 23 && close(v.template kth<2>(), c) && close(v.template kth<3>(), d); 24 REPORTER_ASSERT(r, ok); 25 } 26 }; 27 auto assert_eq = [&](const SkNf<N,T>& v, T a, T b, T c, T d) { 28 return assert_nearly_eq(0, v, a,b,c,d); 29 }; 30 31 T vals[] = {3, 4, 5, 6}; 32 SkNf<N,T> a = SkNf<N,T>::Load(vals), 33 b(a), 34 c = a; 35 SkNf<N,T> d; 36 d = a; 37 38 assert_eq(a, 3, 4, 5, 6); 39 assert_eq(b, 3, 4, 5, 6); 40 assert_eq(c, 3, 4, 5, 6); 41 assert_eq(d, 3, 4, 5, 6); 42 43 assert_eq(a+b, 6, 8, 10, 12); 44 assert_eq(a*b, 9, 16, 25, 36); 45 assert_eq(a*b-b, 6, 12, 20, 30); 46 assert_eq((a*b).sqrt(), 3, 4, 5, 6); 47 assert_eq(a/b, 1, 1, 1, 1); 48 assert_eq(-a, -3, -4, -5, -6); 49 50 SkNf<N,T> fours(4); 51 52 assert_eq(fours.sqrt(), 2,2,2,2); 53 assert_nearly_eq(0.001, fours.rsqrt(), 0.5, 0.5, 0.5, 0.5); 54 55 assert_eq( fours. invert(), 0.25, 0.25, 0.25, 0.25); 56 assert_nearly_eq(0.001, fours.approxInvert(), 0.25, 0.25, 0.25, 0.25); 57 58 assert_eq(SkNf<N,T>::Min(a, fours), 3, 4, 4, 4); 59 assert_eq(SkNf<N,T>::Max(a, fours), 4, 4, 5, 6); 60 61 // Test some comparisons. This is not exhaustive. 62 REPORTER_ASSERT(r, (a == b).allTrue()); 63 REPORTER_ASSERT(r, (a+b == a*b-b).anyTrue()); 64 REPORTER_ASSERT(r, !(a+b == a*b-b).allTrue()); 65 REPORTER_ASSERT(r, !(a+b == a*b).anyTrue()); 66 REPORTER_ASSERT(r, !(a != b).anyTrue()); 67 REPORTER_ASSERT(r, (a < fours).anyTrue()); 68 REPORTER_ASSERT(r, (a <= fours).anyTrue()); 69 REPORTER_ASSERT(r, !(a > fours).allTrue()); 70 REPORTER_ASSERT(r, !(a >= fours).allTrue()); 71} 72 73DEF_TEST(SkNf, r) { 74 test_Nf<2, float>(r); 75 test_Nf<2, double>(r); 76 77 test_Nf<4, float>(r); 78 test_Nf<4, double>(r); 79} 80 81template <int N, typename T> 82void test_Ni(skiatest::Reporter* r) { 83 auto assert_eq = [&](const SkNi<N,T>& v, T a, T b, T c, T d, T e, T f, T g, T h) { 84 T vals[8]; 85 v.store(vals); 86 87 switch (N) { 88 case 8: REPORTER_ASSERT(r, vals[4] == e && vals[5] == f && vals[6] == g && vals[7] == h); 89 case 4: REPORTER_ASSERT(r, vals[2] == c && vals[3] == d); 90 case 2: REPORTER_ASSERT(r, vals[0] == a && vals[1] == b); 91 } 92 }; 93 94 T vals[] = { 1,2,3,4,5,6,7,8 }; 95 SkNi<N,T> a = SkNi<N,T>::Load(vals), 96 b(a), 97 c = a; 98 SkNi<N,T> d; 99 d = a; 100 101 assert_eq(a, 1,2,3,4,5,6,7,8); 102 assert_eq(b, 1,2,3,4,5,6,7,8); 103 assert_eq(c, 1,2,3,4,5,6,7,8); 104 assert_eq(d, 1,2,3,4,5,6,7,8); 105 106 assert_eq(a+a, 2,4,6,8,10,12,14,16); 107 assert_eq(a*a, 1,4,9,16,25,36,49,64); 108 assert_eq(a*a-a, 0,2,6,12,20,30,42,56); 109 110 assert_eq(a >> 2, 0,0,0,1,1,1,1,2); 111 assert_eq(a << 1, 2,4,6,8,10,12,14,16); 112 113 REPORTER_ASSERT(r, a.template kth<1>() == 2); 114} 115 116DEF_TEST(SkNi, r) { 117 test_Ni<2, uint16_t>(r); 118 test_Ni<4, uint16_t>(r); 119 test_Ni<8, uint16_t>(r); 120} 121