mtklein | dde03ff | 2015-08-31 15:26:08 -0700 | [diff] [blame] | 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 | |
mtklein | a1ebeb2 | 2015-10-01 09:43:39 -0700 | [diff] [blame] | 29 | void onDraw(int loops, SkCanvas* canvas) override { |
mtklein | dde03ff | 2015-08-31 15:26:08 -0700 | [diff] [blame] | 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; |
mtklein | 6f37b4a | 2015-12-14 11:25:18 -0800 | [diff] [blame^] | 36 | auto f = SkNx_cast<float>(Sk4b::Load((const uint8_t*)&color)); |
| 37 | SkNx_cast<uint8_t>(f).store((uint8_t*)&back); |
mtklein | dde03ff | 2015-08-31 15:26:08 -0700 | [diff] [blame] | 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]; |
mtklein | a1ebeb2 | 2015-10-01 09:43:39 -0700 | [diff] [blame] | 50 | void onDraw(int loops, SkCanvas*) override { |
mtklein | dde03ff | 2015-08-31 15:26:08 -0700 | [diff] [blame] | 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) { |
mtklein | 6f37b4a | 2015-12-14 11:25:18 -0800 | [diff] [blame^] | 65 | Sk4f_ToBytes((uint8_t*)(fDevice+i), a, b, c, d); |
mtklein | dde03ff | 2015-08-31 15:26:08 -0700 | [diff] [blame] | 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;) |