12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "bench/Benchmark.h"
- #include "include/core/SkColor.h"
- #include "include/private/SkNx.h"
- // Writing into this array prevents the loops from being compiled away.
- static volatile float blackhole[4];
- template <typename T>
- struct Sk4fRoundtripBench : public Benchmark {
- Sk4fRoundtripBench() {}
- const char* onGetName() override {
- switch (sizeof(T)) {
- case 1: return "Sk4f_roundtrip_u8";
- case 2: return "Sk4f_roundtrip_u16";
- case 4: return "Sk4f_roundtrip_int";
- }
- SkASSERT(false);
- return "";
- }
- bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
- void onDraw(int loops, SkCanvas* canvas) override {
- Sk4f fs(1,2,3,4);
- while (loops --> 0) {
- fs = SkNx_cast<float>(SkNx_cast<T>(fs));
- }
- fs.store((float*)blackhole);
- }
- };
- DEF_BENCH(return new Sk4fRoundtripBench<uint8_t>;)
- DEF_BENCH(return new Sk4fRoundtripBench<uint16_t>;)
- DEF_BENCH(return new Sk4fRoundtripBench<int>;)
- struct Sk4fFloorBench : public Benchmark {
- Sk4fFloorBench() {}
- const char* onGetName() override { return "Sk4f_floor"; }
- bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
- void onDraw(int loops, SkCanvas* canvas) override {
- Sk4f fs(1,2,3,4);
- while (loops --> 0) {
- fs = fs.floor();
- }
- fs.store((float*)blackhole);
- }
- };
- DEF_BENCH(return new Sk4fFloorBench;)
- struct Sk4fGradientBench : public Benchmark {
- const char* onGetName() override { return "Sk4f_gradient"; }
- bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
- SkPMColor fDevice[100];
- void onDraw(int loops, SkCanvas*) override {
- Sk4f c0(0,0,255,255),
- c1(255,0,0,255),
- dc = c1 - c0,
- fx(0.1f),
- dx(0.002f),
- dcdx(dc*dx),
- dcdx4(dcdx+dcdx+dcdx+dcdx);
- for (int n = 0; n < loops; n++) {
- Sk4f a = c0 + dc*fx + Sk4f(0.5f), // add an extra 0.5f to get rounding for free.
- b = a + dcdx,
- c = b + dcdx,
- d = c + dcdx;
- for (size_t i = 0; i < SK_ARRAY_COUNT(fDevice); i += 4) {
- Sk4f_ToBytes((uint8_t*)(fDevice+i), a, b, c, d);
- a = a + dcdx4;
- b = b + dcdx4;
- c = c + dcdx4;
- d = d + dcdx4;
- }
- }
- }
- };
- DEF_BENCH(return new Sk4fGradientBench;)
|