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