| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "Sk4px.h" | 8 #include "Sk4px.h" |
| 9 #include "SkNx.h" | 9 #include "SkNx.h" |
| 10 #include "SkRandom.h" | 10 #include "SkRandom.h" |
| 11 #include "Test.h" | 11 #include "Test.h" |
| 12 | 12 |
| 13 template <int N> | 13 template <int N> |
| 14 static void test_Nf(skiatest::Reporter* r) { | 14 static void test_Nf(skiatest::Reporter* r) { |
| 15 | 15 |
| 16 auto assert_nearly_eq = [&](float eps, const SkNf<N>& v, float a, float b, f
loat c, float d) { | 16 auto assert_nearly_eq = [&](float eps, const SkNx<N, float>& v, |
| 17 float a, float b, float c, float d) { |
| 17 auto close = [=](float a, float b) { return fabsf(a-b) <= eps; }; | 18 auto close = [=](float a, float b) { return fabsf(a-b) <= eps; }; |
| 18 float vals[4]; | 19 float vals[4]; |
| 19 v.store(vals); | 20 v.store(vals); |
| 20 bool ok = close(vals[0], a) && close(vals[1], b) | 21 bool ok = close(vals[0], a) && close(vals[1], b) |
| 21 && close(v.template kth<0>(), a) && close(v.template kth<1>(), b)
; | 22 && close(v.template kth<0>(), a) && close(v.template kth<1>(), b)
; |
| 22 REPORTER_ASSERT(r, ok); | 23 REPORTER_ASSERT(r, ok); |
| 23 if (N == 4) { | 24 if (N == 4) { |
| 24 ok = close(vals[2], c) && close(vals[3], d) | 25 ok = close(vals[2], c) && close(vals[3], d) |
| 25 && close(v.template kth<2>(), c) && close(v.template kth<3>(), d); | 26 && close(v.template kth<2>(), c) && close(v.template kth<3>(), d); |
| 26 REPORTER_ASSERT(r, ok); | 27 REPORTER_ASSERT(r, ok); |
| 27 } | 28 } |
| 28 }; | 29 }; |
| 29 auto assert_eq = [&](const SkNf<N>& v, float a, float b, float c, float d) { | 30 auto assert_eq = [&](const SkNx<N, float>& v, float a, float b, float c, flo
at d) { |
| 30 return assert_nearly_eq(0, v, a,b,c,d); | 31 return assert_nearly_eq(0, v, a,b,c,d); |
| 31 }; | 32 }; |
| 32 | 33 |
| 33 float vals[] = {3, 4, 5, 6}; | 34 float vals[] = {3, 4, 5, 6}; |
| 34 SkNf<N> a = SkNf<N>::Load(vals), | 35 SkNx<N,float> a = SkNx<N,float>::Load(vals), |
| 35 b(a), | 36 b(a), |
| 36 c = a; | 37 c = a; |
| 37 SkNf<N> d; | 38 SkNx<N,float> d; |
| 38 d = a; | 39 d = a; |
| 39 | 40 |
| 40 assert_eq(a, 3, 4, 5, 6); | 41 assert_eq(a, 3, 4, 5, 6); |
| 41 assert_eq(b, 3, 4, 5, 6); | 42 assert_eq(b, 3, 4, 5, 6); |
| 42 assert_eq(c, 3, 4, 5, 6); | 43 assert_eq(c, 3, 4, 5, 6); |
| 43 assert_eq(d, 3, 4, 5, 6); | 44 assert_eq(d, 3, 4, 5, 6); |
| 44 | 45 |
| 45 assert_eq(a+b, 6, 8, 10, 12); | 46 assert_eq(a+b, 6, 8, 10, 12); |
| 46 assert_eq(a*b, 9, 16, 25, 36); | 47 assert_eq(a*b, 9, 16, 25, 36); |
| 47 assert_eq(a*b-b, 6, 12, 20, 30); | 48 assert_eq(a*b-b, 6, 12, 20, 30); |
| 48 assert_eq((a*b).sqrt(), 3, 4, 5, 6); | 49 assert_eq((a*b).sqrt(), 3, 4, 5, 6); |
| 49 assert_eq(a/b, 1, 1, 1, 1); | 50 assert_eq(a/b, 1, 1, 1, 1); |
| 50 assert_eq(SkNf<N>(0)-a, -3, -4, -5, -6); | 51 assert_eq(SkNx<N,float>(0)-a, -3, -4, -5, -6); |
| 51 | 52 |
| 52 SkNf<N> fours(4); | 53 SkNx<N,float> fours(4); |
| 53 | 54 |
| 54 assert_eq(fours.sqrt(), 2,2,2,2); | 55 assert_eq(fours.sqrt(), 2,2,2,2); |
| 55 assert_nearly_eq(0.001f, fours.rsqrt0(), 0.5, 0.5, 0.5, 0.5); | 56 assert_nearly_eq(0.001f, fours.rsqrt0(), 0.5, 0.5, 0.5, 0.5); |
| 56 assert_nearly_eq(0.001f, fours.rsqrt1(), 0.5, 0.5, 0.5, 0.5); | 57 assert_nearly_eq(0.001f, fours.rsqrt1(), 0.5, 0.5, 0.5, 0.5); |
| 57 assert_nearly_eq(0.001f, fours.rsqrt2(), 0.5, 0.5, 0.5, 0.5); | 58 assert_nearly_eq(0.001f, fours.rsqrt2(), 0.5, 0.5, 0.5, 0.5); |
| 58 | 59 |
| 59 assert_eq( fours. invert(), 0.25, 0.25, 0.25, 0.25); | 60 assert_eq( fours. invert(), 0.25, 0.25, 0.25, 0.25); |
| 60 assert_nearly_eq(0.001f, fours.approxInvert(), 0.25, 0.25, 0.25, 0.25); | 61 assert_nearly_eq(0.001f, fours.approxInvert(), 0.25, 0.25, 0.25, 0.25); |
| 61 | 62 |
| 62 assert_eq(SkNf<N>::Min(a, fours), 3, 4, 4, 4); | 63 assert_eq(SkNx<N,float>::Min(a, fours), 3, 4, 4, 4); |
| 63 assert_eq(SkNf<N>::Max(a, fours), 4, 4, 5, 6); | 64 assert_eq(SkNx<N,float>::Max(a, fours), 4, 4, 5, 6); |
| 64 | 65 |
| 65 // Test some comparisons. This is not exhaustive. | 66 // Test some comparisons. This is not exhaustive. |
| 66 REPORTER_ASSERT(r, (a == b).allTrue()); | 67 REPORTER_ASSERT(r, (a == b).allTrue()); |
| 67 REPORTER_ASSERT(r, (a+b == a*b-b).anyTrue()); | 68 REPORTER_ASSERT(r, (a+b == a*b-b).anyTrue()); |
| 68 REPORTER_ASSERT(r, !(a+b == a*b-b).allTrue()); | 69 REPORTER_ASSERT(r, !(a+b == a*b-b).allTrue()); |
| 69 REPORTER_ASSERT(r, !(a+b == a*b).anyTrue()); | 70 REPORTER_ASSERT(r, !(a+b == a*b).anyTrue()); |
| 70 REPORTER_ASSERT(r, !(a != b).anyTrue()); | 71 REPORTER_ASSERT(r, !(a != b).anyTrue()); |
| 71 REPORTER_ASSERT(r, (a < fours).anyTrue()); | 72 REPORTER_ASSERT(r, (a < fours).anyTrue()); |
| 72 REPORTER_ASSERT(r, (a <= fours).anyTrue()); | 73 REPORTER_ASSERT(r, (a <= fours).anyTrue()); |
| 73 REPORTER_ASSERT(r, !(a > fours).allTrue()); | 74 REPORTER_ASSERT(r, !(a > fours).allTrue()); |
| 74 REPORTER_ASSERT(r, !(a >= fours).allTrue()); | 75 REPORTER_ASSERT(r, !(a >= fours).allTrue()); |
| 75 } | 76 } |
| 76 | 77 |
| 77 DEF_TEST(SkNf, r) { | 78 DEF_TEST(SkNf, r) { |
| 78 test_Nf<2>(r); | 79 test_Nf<2>(r); |
| 79 test_Nf<4>(r); | 80 test_Nf<4>(r); |
| 80 } | 81 } |
| 81 | 82 |
| 82 template <int N, typename T> | 83 template <int N, typename T> |
| 83 void test_Ni(skiatest::Reporter* r) { | 84 void test_Ni(skiatest::Reporter* r) { |
| 84 auto assert_eq = [&](const SkNi<N,T>& v, T a, T b, T c, T d, T e, T f, T g,
T h) { | 85 auto assert_eq = [&](const SkNx<N,T>& v, T a, T b, T c, T d, T e, T f, T g,
T h) { |
| 85 T vals[8]; | 86 T vals[8]; |
| 86 v.store(vals); | 87 v.store(vals); |
| 87 | 88 |
| 88 switch (N) { | 89 switch (N) { |
| 89 case 8: REPORTER_ASSERT(r, vals[4] == e && vals[5] == f && vals[6] ==
g && vals[7] == h); | 90 case 8: REPORTER_ASSERT(r, vals[4] == e && vals[5] == f && vals[6] ==
g && vals[7] == h); |
| 90 case 4: REPORTER_ASSERT(r, vals[2] == c && vals[3] == d); | 91 case 4: REPORTER_ASSERT(r, vals[2] == c && vals[3] == d); |
| 91 case 2: REPORTER_ASSERT(r, vals[0] == a && vals[1] == b); | 92 case 2: REPORTER_ASSERT(r, vals[0] == a && vals[1] == b); |
| 92 } | 93 } |
| 93 switch (N) { | 94 switch (N) { |
| 94 case 8: REPORTER_ASSERT(r, v.template kth<4>() == e && v.template kth<
5>() == f && | 95 case 8: REPORTER_ASSERT(r, v.template kth<4>() == e && v.template kth<
5>() == f && |
| 95 v.template kth<6>() == g && v.template kth<
7>() == h); | 96 v.template kth<6>() == g && v.template kth<
7>() == h); |
| 96 case 4: REPORTER_ASSERT(r, v.template kth<2>() == c && v.template kth<
3>() == d); | 97 case 4: REPORTER_ASSERT(r, v.template kth<2>() == c && v.template kth<
3>() == d); |
| 97 case 2: REPORTER_ASSERT(r, v.template kth<0>() == a && v.template kth<
1>() == b); | 98 case 2: REPORTER_ASSERT(r, v.template kth<0>() == a && v.template kth<
1>() == b); |
| 98 } | 99 } |
| 99 }; | 100 }; |
| 100 | 101 |
| 101 T vals[] = { 1,2,3,4,5,6,7,8 }; | 102 T vals[] = { 1,2,3,4,5,6,7,8 }; |
| 102 SkNi<N,T> a = SkNi<N,T>::Load(vals), | 103 SkNx<N,T> a = SkNx<N,T>::Load(vals), |
| 103 b(a), | 104 b(a), |
| 104 c = a; | 105 c = a; |
| 105 SkNi<N,T> d; | 106 SkNx<N,T> d; |
| 106 d = a; | 107 d = a; |
| 107 | 108 |
| 108 assert_eq(a, 1,2,3,4,5,6,7,8); | 109 assert_eq(a, 1,2,3,4,5,6,7,8); |
| 109 assert_eq(b, 1,2,3,4,5,6,7,8); | 110 assert_eq(b, 1,2,3,4,5,6,7,8); |
| 110 assert_eq(c, 1,2,3,4,5,6,7,8); | 111 assert_eq(c, 1,2,3,4,5,6,7,8); |
| 111 assert_eq(d, 1,2,3,4,5,6,7,8); | 112 assert_eq(d, 1,2,3,4,5,6,7,8); |
| 112 | 113 |
| 113 assert_eq(a+a, 2,4,6,8,10,12,14,16); | 114 assert_eq(a+a, 2,4,6,8,10,12,14,16); |
| 114 assert_eq(a*a, 1,4,9,16,25,36,49,64); | 115 assert_eq(a*a, 1,4,9,16,25,36,49,64); |
| 115 assert_eq(a*a-a, 0,2,6,12,20,30,42,56); | 116 assert_eq(a*a-a, 0,2,6,12,20,30,42,56); |
| 116 | 117 |
| 117 assert_eq(a >> 2, 0,0,0,1,1,1,1,2); | 118 assert_eq(a >> 2, 0,0,0,1,1,1,1,2); |
| 118 assert_eq(a << 1, 2,4,6,8,10,12,14,16); | 119 assert_eq(a << 1, 2,4,6,8,10,12,14,16); |
| 119 | 120 |
| 120 REPORTER_ASSERT(r, a.template kth<1>() == 2); | 121 REPORTER_ASSERT(r, a.template kth<1>() == 2); |
| 121 } | 122 } |
| 122 | 123 |
| 123 DEF_TEST(SkNi, r) { | 124 DEF_TEST(SkNx, r) { |
| 124 test_Ni<2, uint16_t>(r); | 125 test_Ni<2, uint16_t>(r); |
| 125 test_Ni<4, uint16_t>(r); | 126 test_Ni<4, uint16_t>(r); |
| 126 test_Ni<8, uint16_t>(r); | 127 test_Ni<8, uint16_t>(r); |
| 127 | 128 |
| 128 test_Ni<2, int>(r); | 129 test_Ni<2, int>(r); |
| 129 test_Ni<4, int>(r); | 130 test_Ni<4, int>(r); |
| 130 test_Ni<8, int>(r); | 131 test_Ni<8, int>(r); |
| 131 } | 132 } |
| 132 | 133 |
| 133 DEF_TEST(SkNi_min_lt, r) { | 134 DEF_TEST(SkNi_min_lt, r) { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 Sk4f(0.7f).toBytes(bytes); | 214 Sk4f(0.7f).toBytes(bytes); |
| 214 REPORTER_ASSERT(r, bytes[0] == 0); | 215 REPORTER_ASSERT(r, bytes[0] == 0); |
| 215 | 216 |
| 216 // Clamping edge cases. | 217 // Clamping edge cases. |
| 217 Sk4f(-2.0f, -0.7f, 255.9f, 256.0f).toBytes(bytes); | 218 Sk4f(-2.0f, -0.7f, 255.9f, 256.0f).toBytes(bytes); |
| 218 REPORTER_ASSERT(r, bytes[0] == 0); | 219 REPORTER_ASSERT(r, bytes[0] == 0); |
| 219 REPORTER_ASSERT(r, bytes[1] == 0); | 220 REPORTER_ASSERT(r, bytes[1] == 0); |
| 220 REPORTER_ASSERT(r, bytes[2] == 255); | 221 REPORTER_ASSERT(r, bytes[2] == 255); |
| 221 REPORTER_ASSERT(r, bytes[3] == 255); | 222 REPORTER_ASSERT(r, bytes[3] == 255); |
| 222 } | 223 } |
| 224 |
| 225 DEF_TEST(SkNx_cast, r) { |
| 226 Sk4f fs(-1.7f, -1.4f, 0.5f, 1.9f); |
| 227 Sk4i is = SkNx_cast<int>(fs); |
| 228 |
| 229 REPORTER_ASSERT(r, is.kth<0>() == -1); |
| 230 REPORTER_ASSERT(r, is.kth<1>() == -1); |
| 231 REPORTER_ASSERT(r, is.kth<2>() == 0); |
| 232 REPORTER_ASSERT(r, is.kth<3>() == 1); |
| 233 } |
| OLD | NEW |