| Index: bench/PMFloatBench.cpp
|
| diff --git a/bench/PMFloatBench.cpp b/bench/PMFloatBench.cpp
|
| index 8250c9e17c5385a8b9d27542b35e8c9f01edc181..1f9c291cde1b3b414b98805ea5ed1cb711e6cd96 100644
|
| --- a/bench/PMFloatBench.cpp
|
| +++ b/bench/PMFloatBench.cpp
|
| @@ -1,6 +1,16 @@
|
| #include "Benchmark.h"
|
| #include "SkPMFloat.h"
|
| -#include "SkRandom.h"
|
| +
|
| +// Used to prevent the compiler from optimizing away the whole loop.
|
| +volatile uint32_t blackhole = 0;
|
| +
|
| +// Not a great random number generator, but it's very fast.
|
| +// The code we're measuring is quite fast, so low overhead is essential.
|
| +static uint32_t lcg_rand(uint32_t* seed) {
|
| + *seed *= 1664525;
|
| + *seed += 1013904223;
|
| + return *seed;
|
| +}
|
|
|
| struct PMFloatBench : public Benchmark {
|
| explicit PMFloatBench(bool clamp) : fClamp(clamp) {}
|
| @@ -9,14 +19,23 @@ struct PMFloatBench : public Benchmark {
|
| bool isSuitableFor(Backend backend) SK_OVERRIDE { return backend == kNonRendering_Backend; }
|
|
|
| void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
|
| - SkRandom rand;
|
| + // Unlike blackhole, junk can and probably will be a register.
|
| + uint32_t junk = 0;
|
| + uint32_t seed = 0;
|
| for (int i = 0; i < loops; i++) {
|
| - SkPMColor c = SkPreMultiplyColor(rand.nextU());
|
| + #ifdef SK_DEBUG
|
| + // Our SkASSERTs will remind us that it's technically required that we premultiply.
|
| + SkPMColor c = SkPreMultiplyColor(lcg_rand(&seed));
|
| + #else
|
| + // But it's a lot faster not to, and this code won't really mind the non-PM colors.
|
| + SkPMColor c = lcg_rand(&seed);
|
| + #endif
|
| SkPMFloat pmf;
|
| pmf.set(c);
|
| SkPMColor back = fClamp ? pmf.clamped() : pmf.get();
|
| - if (c != back) { SkFAIL("no joy"); } // This conditional makes this not compile away.
|
| + junk ^= back;
|
| }
|
| + blackhole ^= junk;
|
| }
|
|
|
| bool fClamp;
|
|
|