Create GLSLUniformHandler class for gpu backend
[platform/upstream/libSkiaSharp.git] / bench / Sk4fBench.cpp
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 "Benchmark.h"
9 #include "SkColor.h"
10 #include "SkNx.h"
11
12 // Used to prevent the compiler from optimizing away the whole loop.
13 volatile uint32_t blackhole = 0;
14
15 // Not a great random number generator, but it's very fast.
16 // The code we're measuring is quite fast, so low overhead is essential.
17 static uint32_t lcg_rand(uint32_t* seed) {
18     *seed *= 1664525;
19     *seed += 1013904223;
20     return *seed;
21 }
22
23 struct Sk4fBytesRoundtripBench : public Benchmark {
24     Sk4fBytesRoundtripBench() {}
25
26     const char* onGetName() override { return "Sk4f_roundtrip"; }
27     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
28
29     void onDraw(int loops, SkCanvas* canvas) override {
30         // Unlike blackhole, junk can and probably will be a register.
31         uint32_t junk = 0;
32         uint32_t seed = 0;
33         for (int i = 0; i < loops; i++) {
34             uint32_t color = lcg_rand(&seed),
35                      back;
36             auto f = Sk4f::FromBytes((const uint8_t*)&color);
37             f.toBytes((uint8_t*)&back);
38             junk ^= back;
39         }
40         blackhole ^= junk;
41     }
42 };
43 DEF_BENCH(return new Sk4fBytesRoundtripBench;)
44
45 struct Sk4fGradientBench : public Benchmark {
46     const char* onGetName() override { return "Sk4f_gradient"; }
47     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
48
49     SkPMColor fDevice[100];
50     void onDraw(int loops, SkCanvas*) override {
51         Sk4f c0(0,0,255,255),
52              c1(255,0,0,255),
53              dc = c1 - c0,
54              fx(0.1f),
55              dx(0.002f),
56              dcdx(dc*dx),
57              dcdx4(dcdx+dcdx+dcdx+dcdx);
58
59         for (int n = 0; n < loops; n++) {
60             Sk4f a = c0 + dc*fx + Sk4f(0.5f),  // add an extra 0.5f to get rounding for free.
61                  b = a + dcdx,
62                  c = b + dcdx,
63                  d = c + dcdx;
64             for (size_t i = 0; i < SK_ARRAY_COUNT(fDevice); i += 4) {
65                 Sk4f::ToBytes((uint8_t*)(fDevice+i), a, b, c, d);
66                 a = a + dcdx4;
67                 b = b + dcdx4;
68                 c = c + dcdx4;
69                 d = d + dcdx4;
70             }
71         }
72     }
73 };
74 DEF_BENCH(return new Sk4fGradientBench;)