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