aboutsummaryrefslogtreecommitdiff
path: root/bench/ColorSpaceXformBench.cpp
diff options
context:
space:
mode:
authorMike Klein <mtklein@google.com>2018-08-06 17:03:33 -0400
committerSkia Commit-Bot <skia-commit-bot@chromium.org>2018-08-07 14:30:28 +0000
commit4ed73e09d3fd720521863961914625acb2484efd (patch)
tree1fa24fc980a80a4fdd9b696a4be92348f971f4d0 /bench/ColorSpaceXformBench.cpp
parent929a681e688d172c011575612556adb9f6c59df3 (diff)
downloadskqp-4ed73e09d3fd720521863961914625acb2484efd.tar.gz
Add a bench for various single color xforms
PipeA is where we want to be, and probably by filling in something like the TODO I left in SkColorSpaceXformSteps.h? curr/maxrss loops min median mean max stddev samples config bench 13/13 MB 49 82.8ns 83.2ns 83.2ns 84.1ns 0% █▂▅▄▂▁▃▄▃▃ nonrendering ColorSpaceXformBench_pipeB 13/13 MB 1259 29.6ns 29.7ns 30.4ns 37.2ns 8% ▁▁▁▁▁▁▁▁▁█ nonrendering ColorSpaceXformBench_pipeA 13/13 MB 661 110ns 119ns 119ns 128ns 4% ▅▅▅▅▅▅▅▅█▁ nonrendering ColorSpaceXformBench_steps 13/13 MB 26 239ns 247ns 283ns 609ns 40% ▁▁█▁▁▁▁▁▁▁ nonrendering ColorSpaceXformBench_xform Change-Id: I98af634ab0a7a1522a5bcfde9ce3fc934d82ecf8 Reviewed-on: https://skia-review.googlesource.com/145643 Commit-Queue: Mike Klein <mtklein@google.com> Auto-Submit: Mike Klein <mtklein@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
Diffstat (limited to 'bench/ColorSpaceXformBench.cpp')
-rw-r--r--bench/ColorSpaceXformBench.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/bench/ColorSpaceXformBench.cpp b/bench/ColorSpaceXformBench.cpp
new file mode 100644
index 0000000000..c20bcf3c31
--- /dev/null
+++ b/bench/ColorSpaceXformBench.cpp
@@ -0,0 +1,113 @@
+/*
+* Copyright 2017 Google Inc.
+*
+* Use of this source code is governed by a BSD-style license that can be
+* found in the LICENSE file.
+*/
+
+#include "../src/jumper/SkJumper.h"
+#include "Benchmark.h"
+#include "SkColor.h"
+#include "SkColorSpaceXform.h"
+#include "SkColorSpaceXformSteps.h"
+#include "SkMakeUnique.h"
+#include "SkPM4fPriv.h"
+#include "SkRandom.h"
+#include "SkRasterPipeline.h"
+
+enum class Mode { xform, steps, pipeA, pipeB };
+
+struct ColorSpaceXformBench : public Benchmark {
+ ColorSpaceXformBench(Mode mode) : fMode(mode) {}
+
+ const Mode fMode;
+
+ std::unique_ptr<SkColorSpaceXform> fXform;
+ std::unique_ptr<SkColorSpaceXformSteps> fSteps;
+ std::function<void(size_t, size_t, size_t, size_t)> fPipeA;
+
+ SkJumper_MemoryCtx fPipeSrc = {nullptr,0},
+ fPipeDst = {nullptr,0};
+ SkSTArenaAlloc<1024> fAlloc;
+
+ const char* onGetName() override {
+ switch (fMode) {
+ case Mode::xform: return "ColorSpaceXformBench_xform";
+ case Mode::steps: return "ColorSpaceXformBench_steps";
+ case Mode::pipeA: return "ColorSpaceXformBench_pipeA";
+ case Mode::pipeB: return "ColorSpaceXformBench_pipeB";
+ }
+ return "";
+ }
+
+ bool isSuitableFor(Backend backend) override { return kNonRendering_Backend == backend; }
+
+ void onDelayedSetup() override {
+ sk_sp<SkColorSpace> src = SkColorSpace::MakeSRGB(),
+ dst = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+ SkColorSpace::kDCIP3_D65_Gamut);
+
+ fXform = SkColorSpaceXform::New(src.get(), dst.get());
+ fSteps = skstd::make_unique<SkColorSpaceXformSteps>(src.get(),
+ kOpaque_SkAlphaType,
+ dst.get());
+
+ SkRasterPipeline p(&fAlloc);
+ p.append(SkRasterPipeline::load_bgra, &fPipeSrc);
+ fSteps->apply(&p);
+ p.append(SkRasterPipeline::store_bgra, &fPipeDst);
+
+ fPipeA = p.compile();
+ }
+
+ void onDraw(int n, SkCanvas* canvas) override {
+ volatile SkColor junk = 0;
+ SkRandom rand;
+
+ for (int i = 0; i < n; i++) {
+ SkColor src = rand.nextU(),
+ dst;
+ fPipeSrc.pixels = &src;
+ fPipeDst.pixels = &dst;
+
+ switch (fMode) {
+ case Mode::xform: {
+ fXform->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, &dst,
+ SkColorSpaceXform::kBGRA_8888_ColorFormat, &src,
+ 1, kUnpremul_SkAlphaType);
+ } break;
+
+ case Mode::steps: {
+ float rgba[4];
+ swizzle_rb(Sk4f_fromL32(src)).store(rgba);
+ fSteps->apply(rgba);
+ dst = Sk4f_toL32(swizzle_rb(Sk4f::Load(rgba)));
+ } break;
+
+ case Mode::pipeA: {
+ fPipeA(0,0,1,1);
+ } break;
+
+ case Mode::pipeB: {
+ SkSTArenaAlloc<1024> alloc;
+ SkRasterPipeline p(&alloc);
+ p.append(SkRasterPipeline::load_bgra, &fPipeSrc);
+ fSteps->apply(&p);
+ p.append(SkRasterPipeline::store_bgra, &fPipeDst);
+ p.run(0,0,1,1);
+ } break;
+ }
+
+ if (false && i == 0) {
+ SkDebugf("%x ~~> %x\n", src, dst);
+ }
+
+ junk ^= dst;
+ }
+ }
+};
+
+DEF_BENCH(return new ColorSpaceXformBench{Mode::xform};)
+DEF_BENCH(return new ColorSpaceXformBench{Mode::steps};)
+DEF_BENCH(return new ColorSpaceXformBench{Mode::pipeA};)
+DEF_BENCH(return new ColorSpaceXformBench{Mode::pipeB};)