1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 10cb93a386Sopenharmony_ci#include "include/private/SkNx.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ci// Writing into this array prevents the loops from being compiled away. 13cb93a386Sopenharmony_cistatic volatile float blackhole[4]; 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_citemplate <typename T> 16cb93a386Sopenharmony_cistruct Sk4fRoundtripBench : public Benchmark { 17cb93a386Sopenharmony_ci Sk4fRoundtripBench() {} 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci const char* onGetName() override { 20cb93a386Sopenharmony_ci switch (sizeof(T)) { 21cb93a386Sopenharmony_ci case 1: return "Sk4f_roundtrip_u8"; 22cb93a386Sopenharmony_ci case 2: return "Sk4f_roundtrip_u16"; 23cb93a386Sopenharmony_ci case 4: return "Sk4f_roundtrip_int"; 24cb93a386Sopenharmony_ci } 25cb93a386Sopenharmony_ci SkASSERT(false); 26cb93a386Sopenharmony_ci return ""; 27cb93a386Sopenharmony_ci } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 32cb93a386Sopenharmony_ci Sk4f fs(1,2,3,4); 33cb93a386Sopenharmony_ci while (loops --> 0) { 34cb93a386Sopenharmony_ci fs = SkNx_cast<float>(SkNx_cast<T>(fs)); 35cb93a386Sopenharmony_ci } 36cb93a386Sopenharmony_ci fs.store((float*)blackhole); 37cb93a386Sopenharmony_ci } 38cb93a386Sopenharmony_ci}; 39cb93a386Sopenharmony_ciDEF_BENCH(return new Sk4fRoundtripBench<uint8_t>;) 40cb93a386Sopenharmony_ciDEF_BENCH(return new Sk4fRoundtripBench<uint16_t>;) 41cb93a386Sopenharmony_ciDEF_BENCH(return new Sk4fRoundtripBench<int>;) 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_cistruct Sk4fFloorBench : public Benchmark { 44cb93a386Sopenharmony_ci Sk4fFloorBench() {} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci const char* onGetName() override { return "Sk4f_floor"; } 47cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 50cb93a386Sopenharmony_ci Sk4f fs(1,2,3,4); 51cb93a386Sopenharmony_ci while (loops --> 0) { 52cb93a386Sopenharmony_ci fs = fs.floor(); 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci fs.store((float*)blackhole); 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci}; 57cb93a386Sopenharmony_ciDEF_BENCH(return new Sk4fFloorBench;) 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_cistruct Sk4fGradientBench : public Benchmark { 60cb93a386Sopenharmony_ci const char* onGetName() override { return "Sk4f_gradient"; } 61cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci SkPMColor fDevice[100]; 64cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 65cb93a386Sopenharmony_ci Sk4f c0(0,0,255,255), 66cb93a386Sopenharmony_ci c1(255,0,0,255), 67cb93a386Sopenharmony_ci dc = c1 - c0, 68cb93a386Sopenharmony_ci fx(0.1f), 69cb93a386Sopenharmony_ci dx(0.002f), 70cb93a386Sopenharmony_ci dcdx(dc*dx), 71cb93a386Sopenharmony_ci dcdx4(dcdx+dcdx+dcdx+dcdx); 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci for (int n = 0; n < loops; n++) { 74cb93a386Sopenharmony_ci Sk4f a = c0 + dc*fx + Sk4f(0.5f), // add an extra 0.5f to get rounding for free. 75cb93a386Sopenharmony_ci b = a + dcdx, 76cb93a386Sopenharmony_ci c = b + dcdx, 77cb93a386Sopenharmony_ci d = c + dcdx; 78cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(fDevice); i += 4) { 79cb93a386Sopenharmony_ci Sk4f_ToBytes((uint8_t*)(fDevice+i), a, b, c, d); 80cb93a386Sopenharmony_ci a = a + dcdx4; 81cb93a386Sopenharmony_ci b = b + dcdx4; 82cb93a386Sopenharmony_ci c = c + dcdx4; 83cb93a386Sopenharmony_ci d = d + dcdx4; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci } 86cb93a386Sopenharmony_ci } 87cb93a386Sopenharmony_ci}; 88cb93a386Sopenharmony_ciDEF_BENCH(return new Sk4fGradientBench;) 89