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 "bench/Benchmark.h" 9 #include "include/core/SkColor.h" 10 #include "src/base/SkVx.h" 11 12 // Writing into this array prevents the loops from being compiled away. 13 static volatile float blackhole[4]; 14 15 template <typename T> 16 struct Sk4fRoundtripBench : public Benchmark { Sk4fRoundtripBenchSk4fRoundtripBench17 Sk4fRoundtripBench() {} 18 onGetNameSk4fRoundtripBench19 const char* onGetName() override { 20 switch (sizeof(T)) { 21 case 1: return "Sk4f_roundtrip_u8"; 22 case 2: return "Sk4f_roundtrip_u16"; 23 case 4: return "Sk4f_roundtrip_int"; 24 } 25 SkASSERT(false); 26 return ""; 27 } 28 isSuitableForSk4fRoundtripBench29 bool isSuitableFor(Backend backend) override { return backend == Backend::kNonRendering; } 30 onDrawSk4fRoundtripBench31 void onDraw(int loops, SkCanvas* canvas) override { 32 skvx::float4 fs(1,2,3,4); 33 while (loops --> 0) { 34 fs = skvx::cast<float>(skvx::cast<T>(fs)); 35 } 36 fs.store(const_cast<float*>(blackhole)); 37 } 38 }; 39 DEF_BENCH(return new Sk4fRoundtripBench<uint8_t>;) 40 DEF_BENCH(return new Sk4fRoundtripBench<uint16_t>;) 41 DEF_BENCH(return new Sk4fRoundtripBench<int>;) 42 43 struct Sk4fFloorBench : public Benchmark { Sk4fFloorBenchSk4fFloorBench44 Sk4fFloorBench() {} 45 onGetNameSk4fFloorBench46 const char* onGetName() override { return "Sk4f_floor"; } isSuitableForSk4fFloorBench47 bool isSuitableFor(Backend backend) override { return backend == Backend::kNonRendering; } 48 onDrawSk4fFloorBench49 void onDraw(int loops, SkCanvas* canvas) override { 50 skvx::float4 fs(1,2,3,4); 51 while (loops --> 0) { 52 fs = floor(fs); 53 } 54 fs.store(const_cast<float*>(blackhole)); 55 } 56 }; 57 DEF_BENCH(return new Sk4fFloorBench;) 58 59 struct Sk4fGradientBench : public Benchmark { onGetNameSk4fGradientBench60 const char* onGetName() override { return "Sk4f_gradient"; } isSuitableForSk4fGradientBench61 bool isSuitableFor(Backend backend) override { return backend == Backend::kNonRendering; } 62 63 SkPMColor fDevice[100]; onDrawSk4fGradientBench64 void onDraw(int loops, SkCanvas*) override { 65 skvx::float4 c0(0,0,255,255), 66 c1(255,0,0,255), 67 dc = c1 - c0, 68 fx(0.1f), 69 dx(0.002f), 70 dcdx(dc*dx), 71 dcdx4(dcdx+dcdx+dcdx+dcdx); 72 73 for (int n = 0; n < loops; n++) { 74 auto a = c0 + dc*fx + 0.5f, // add an extra 0.5f to get rounding for free. 75 b = a + dcdx, 76 c = b + dcdx, 77 d = c + dcdx; 78 for (size_t i = 0; i < std::size(fDevice); i += 4) { 79 skvx::cast<uint8_t>(a).store(fDevice + i + 0); 80 skvx::cast<uint8_t>(b).store(fDevice + i + 1); 81 skvx::cast<uint8_t>(c).store(fDevice + i + 2); 82 skvx::cast<uint8_t>(d).store(fDevice + i + 3); 83 a = a + dcdx4; 84 b = b + dcdx4; 85 c = c + dcdx4; 86 d = d + dcdx4; 87 } 88 } 89 } 90 }; 91 DEF_BENCH(return new Sk4fGradientBench;) 92