blob: 1f9c291cde1b3b414b98805ea5ed1cb711e6cd96 [file] [log] [blame]
mtkleina2f4be72015-02-23 10:04:34 -08001#include "Benchmark.h"
2#include "SkPMFloat.h"
mtklein60ff4582015-03-03 08:03:27 -08003
4// Used to prevent the compiler from optimizing away the whole loop.
5volatile uint32_t blackhole = 0;
6
7// Not a great random number generator, but it's very fast.
8// The code we're measuring is quite fast, so low overhead is essential.
9static uint32_t lcg_rand(uint32_t* seed) {
10 *seed *= 1664525;
11 *seed += 1013904223;
12 return *seed;
13}
mtkleina2f4be72015-02-23 10:04:34 -080014
15struct PMFloatBench : public Benchmark {
16 explicit PMFloatBench(bool clamp) : fClamp(clamp) {}
17
18 const char* onGetName() SK_OVERRIDE { return fClamp ? "SkPMFloat_clamp" : "SkPMFloat_get"; }
19 bool isSuitableFor(Backend backend) SK_OVERRIDE { return backend == kNonRendering_Backend; }
20
21 void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
mtklein60ff4582015-03-03 08:03:27 -080022 // Unlike blackhole, junk can and probably will be a register.
23 uint32_t junk = 0;
24 uint32_t seed = 0;
mtkleina2f4be72015-02-23 10:04:34 -080025 for (int i = 0; i < loops; i++) {
mtklein60ff4582015-03-03 08:03:27 -080026 #ifdef SK_DEBUG
27 // Our SkASSERTs will remind us that it's technically required that we premultiply.
28 SkPMColor c = SkPreMultiplyColor(lcg_rand(&seed));
29 #else
30 // But it's a lot faster not to, and this code won't really mind the non-PM colors.
31 SkPMColor c = lcg_rand(&seed);
32 #endif
mtkleina2f4be72015-02-23 10:04:34 -080033 SkPMFloat pmf;
34 pmf.set(c);
35 SkPMColor back = fClamp ? pmf.clamped() : pmf.get();
mtklein60ff4582015-03-03 08:03:27 -080036 junk ^= back;
mtkleina2f4be72015-02-23 10:04:34 -080037 }
mtklein60ff4582015-03-03 08:03:27 -080038 blackhole ^= junk;
mtkleina2f4be72015-02-23 10:04:34 -080039 }
40
41 bool fClamp;
42};
43DEF_BENCH(return new PMFloatBench( true);)
44DEF_BENCH(return new PMFloatBench(false);)