OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 <tuple> | 8 #include <tuple> |
9 | 9 |
10 #include "Benchmark.h" | 10 #include "Benchmark.h" |
11 #include "Resources.h" | 11 #include "Resources.h" |
12 #include "SkCpu.h" | 12 #include "SkCpu.h" |
13 #include "SkImage.h" | 13 #include "SkImage.h" |
14 #include "SkImage_Base.h" | 14 #include "SkImage_Base.h" |
15 #include "SkNx.h" | 15 #include "SkNx.h" |
16 #include "SkOpts.h" | 16 #include "SkOpts.h" |
17 #include "SkPM4fPriv.h" | 17 #include "SkPM4fPriv.h" |
18 #include "SkString.h" | 18 #include "SkString.h" |
19 | 19 |
20 #define INNER_LOOPS 10 | 20 #define INNER_LOOPS 10 |
21 | 21 |
| 22 static inline void brute_srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) { |
| 23 auto d = Sk4f_fromS32(*dst), |
| 24 s = Sk4f_fromS32( src); |
| 25 *dst = Sk4f_toS32(s + d * (1.0f - s[3])); |
| 26 } |
| 27 |
| 28 static inline void srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) { |
| 29 if (src >= 0xFF000000) { |
| 30 *dst = src; |
| 31 return; |
| 32 } |
| 33 brute_srcover_srgb_srgb_1(dst, src); |
| 34 } |
| 35 |
22 static void brute_force_srcover_srgb_srgb( | 36 static void brute_force_srcover_srgb_srgb( |
23 uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) { | 37 uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) { |
24 while (ndst > 0) { | 38 while (ndst > 0) { |
25 int n = SkTMin(ndst, nsrc); | 39 int n = SkTMin(ndst, nsrc); |
26 | 40 |
27 for (int i = 0; i < n; i++) { | 41 for (int i = 0; i < n; i++) { |
28 srcover_blend_srgb8888_srgb_1(dst++, srgb_to_linear(to_4f(src[i]))); | 42 brute_srcover_srgb_srgb_1(dst++, src[i]); |
29 } | 43 } |
30 ndst -= n; | 44 ndst -= n; |
31 } | 45 } |
| 46 } |
| 47 |
| 48 static void trivial_srcover_srgb_srgb( |
| 49 uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) { |
| 50 while (ndst > 0) { |
| 51 int n = SkTMin(ndst, nsrc); |
| 52 |
| 53 for (int i = 0; i < n; i++) { |
| 54 srcover_srgb_srgb_1(dst++, src[i]); |
| 55 } |
| 56 ndst -= n; |
| 57 } |
32 } | 58 } |
33 | 59 |
34 static void best_non_simd_srcover_srgb_srgb( | 60 static void best_non_simd_srcover_srgb_srgb( |
35 uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) { | 61 uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) { |
36 uint64_t* ddst = reinterpret_cast<uint64_t*>(dst); | 62 uint64_t* ddst = reinterpret_cast<uint64_t*>(dst); |
37 | 63 |
38 auto srcover_srgb_srgb_2 = [](uint32_t* dst, const uint32_t* src) { | 64 auto srcover_srgb_srgb_2 = [](uint32_t* dst, const uint32_t* src) { |
39 srcover_srgb8888_srgb_1(dst++, *src++); | 65 srcover_srgb_srgb_1(dst++, *src++); |
40 srcover_srgb8888_srgb_1(dst, *src); | 66 srcover_srgb_srgb_1(dst, *src); |
41 }; | 67 }; |
42 | 68 |
43 while (ndst >0) { | 69 while (ndst >0) { |
44 int count = SkTMin(ndst, nsrc); | 70 int count = SkTMin(ndst, nsrc); |
45 ndst -= count; | 71 ndst -= count; |
46 const uint64_t* dsrc = reinterpret_cast<const uint64_t*>(src); | 72 const uint64_t* dsrc = reinterpret_cast<const uint64_t*>(src); |
47 const uint64_t* end = dsrc + (count >> 1); | 73 const uint64_t* end = dsrc + (count >> 1); |
48 do { | 74 do { |
49 if ((~*dsrc & 0xFF000000FF000000) == 0) { | 75 if ((~*dsrc & 0xFF000000FF000000) == 0) { |
50 do { | 76 do { |
51 *ddst++ = *dsrc++; | 77 *ddst++ = *dsrc++; |
52 } while (dsrc < end && (~*dsrc & 0xFF000000FF000000) == 0); | 78 } while (dsrc < end && (~*dsrc & 0xFF000000FF000000) == 0); |
53 } else if ((*dsrc & 0xFF000000FF000000) == 0) { | 79 } else if ((*dsrc & 0xFF000000FF000000) == 0) { |
54 do { | 80 do { |
55 dsrc++; | 81 dsrc++; |
56 ddst++; | 82 ddst++; |
57 } while (dsrc < end && (*dsrc & 0xFF000000FF000000) == 0); | 83 } while (dsrc < end && (*dsrc & 0xFF000000FF000000) == 0); |
58 } else { | 84 } else { |
59 srcover_srgb_srgb_2(reinterpret_cast<uint32_t*>(ddst++), | 85 srcover_srgb_srgb_2(reinterpret_cast<uint32_t*>(ddst++), |
60 reinterpret_cast<const uint32_t*>(dsrc++)); | 86 reinterpret_cast<const uint32_t*>(dsrc++)); |
61 } | 87 } |
62 } while (dsrc < end); | 88 } while (dsrc < end); |
63 | 89 |
64 if ((count & 1) != 0) { | 90 if ((count & 1) != 0) { |
65 srcover_srgb8888_srgb_1(reinterpret_cast<uint32_t*>(ddst), | 91 srcover_srgb_srgb_1(reinterpret_cast<uint32_t*>(ddst), |
66 *reinterpret_cast<const uint32_t*>(dsrc)); | 92 *reinterpret_cast<const uint32_t*>(dsrc)); |
67 } | 93 } |
68 } | 94 } |
69 } | 95 } |
70 | 96 |
71 static void trivial_srcover_srgb_srgb( | |
72 uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) { | |
73 while (ndst > 0) { | |
74 int n = SkTMin(ndst, nsrc); | |
75 | |
76 for (int i = 0; i < n; i++) { | |
77 srcover_srgb8888_srgb_1(dst++, src[i]); | |
78 } | |
79 ndst -= n; | |
80 } | |
81 } | |
82 | |
83 class SrcOverVSkOptsBruteForce { | 97 class SrcOverVSkOptsBruteForce { |
84 public: | 98 public: |
85 static SkString Name() { return SkString{"VSkOptsBruteForce"}; } | 99 static SkString Name() { return SkString{"VSkOptsBruteForce"}; } |
86 static void BlendN(uint32_t* dst, const uint32_t* src, int count) { | 100 static void BlendN(uint32_t* dst, const uint32_t* src, int count) { |
87 brute_force_srcover_srgb_srgb(dst, src, count, count); | 101 brute_force_srcover_srgb_srgb(dst, src, count, count); |
88 } | 102 } |
89 }; | 103 }; |
90 | 104 |
91 class SrcOverVSkOptsTrivial { | 105 class SrcOverVSkOptsTrivial { |
92 public: | 106 public: |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsBruteForce>(fileName)
; ) \ | 191 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsBruteForce>(fileName)
; ) \ |
178 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsTrivial>(fileName); )
\ | 192 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsTrivial>(fileName); )
\ |
179 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsNonSimdCore>(fileName
); ) \ | 193 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsNonSimdCore>(fileName
); ) \ |
180 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsDefault>(fileName); ) | 194 DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsDefault>(fileName); ) |
181 | 195 |
182 BENCHES("yellow_rose.png") | 196 BENCHES("yellow_rose.png") |
183 BENCHES("baby_tux.png") | 197 BENCHES("baby_tux.png") |
184 BENCHES("plane.png") | 198 BENCHES("plane.png") |
185 BENCHES("mandrill_512.png") | 199 BENCHES("mandrill_512.png") |
186 BENCHES("iconstrip.png") | 200 BENCHES("iconstrip.png") |
OLD | NEW |