blob: c877ff9a16544583b8053bd22122f928e63b6a15 [file] [log] [blame]
Mike Klein4ed73e02018-08-06 17:03:33 -04001/*
2* Copyright 2017 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 "../src/jumper/SkJumper.h"
9#include "Benchmark.h"
10#include "SkColor.h"
Mike Kleinc8579562018-08-07 13:21:21 -040011#include "SkColorSpaceXformer.h"
Mike Klein4ed73e02018-08-06 17:03:33 -040012#include "SkColorSpaceXformSteps.h"
13#include "SkMakeUnique.h"
Brian Osman87311c62018-09-28 10:51:13 -040014#include "SkPM4f.h"
Mike Klein4ed73e02018-08-06 17:03:33 -040015#include "SkRandom.h"
16#include "SkRasterPipeline.h"
17
Brian Osman5ea41fc2018-09-26 18:49:27 +000018enum class Mode { steps, pipeA, pipeB, xformer };
Mike Klein4ed73e02018-08-06 17:03:33 -040019
20struct ColorSpaceXformBench : public Benchmark {
21 ColorSpaceXformBench(Mode mode) : fMode(mode) {}
22
23 const Mode fMode;
24
Mike Klein4ed73e02018-08-06 17:03:33 -040025 std::unique_ptr<SkColorSpaceXformSteps> fSteps;
26 std::function<void(size_t, size_t, size_t, size_t)> fPipeA;
27
28 SkJumper_MemoryCtx fPipeSrc = {nullptr,0},
29 fPipeDst = {nullptr,0};
30 SkSTArenaAlloc<1024> fAlloc;
31
Mike Kleinc8579562018-08-07 13:21:21 -040032 std::unique_ptr<SkColorSpaceXformer> fXformer;
33
Mike Klein4ed73e02018-08-06 17:03:33 -040034 const char* onGetName() override {
35 switch (fMode) {
Mike Kleinc8579562018-08-07 13:21:21 -040036 case Mode::steps : return "ColorSpaceXformBench_steps";
37 case Mode::pipeA : return "ColorSpaceXformBench_pipeA";
38 case Mode::pipeB : return "ColorSpaceXformBench_pipeB";
39 case Mode::xformer: return "ColorSpaceXformBench_xformer";
Mike Klein4ed73e02018-08-06 17:03:33 -040040 }
41 return "";
42 }
43
44 bool isSuitableFor(Backend backend) override { return kNonRendering_Backend == backend; }
45
46 void onDelayedSetup() override {
47 sk_sp<SkColorSpace> src = SkColorSpace::MakeSRGB(),
48 dst = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
49 SkColorSpace::kDCIP3_D65_Gamut);
50
Mike Klein8f3d36c2018-08-14 10:28:05 -040051 fSteps = skstd::make_unique<SkColorSpaceXformSteps>(src.get(), kOpaque_SkAlphaType,
52 dst.get(), kPremul_SkAlphaType);
Mike Klein4ed73e02018-08-06 17:03:33 -040053
54 SkRasterPipeline p(&fAlloc);
55 p.append(SkRasterPipeline::load_bgra, &fPipeSrc);
56 fSteps->apply(&p);
57 p.append(SkRasterPipeline::store_bgra, &fPipeDst);
58
59 fPipeA = p.compile();
Mike Kleinc8579562018-08-07 13:21:21 -040060
61 fXformer = SkColorSpaceXformer::Make(dst); // src is implicitly sRGB, what we want anyway
Mike Klein4ed73e02018-08-06 17:03:33 -040062 }
63
64 void onDraw(int n, SkCanvas* canvas) override {
65 volatile SkColor junk = 0;
66 SkRandom rand;
67
68 for (int i = 0; i < n; i++) {
69 SkColor src = rand.nextU(),
70 dst;
71 fPipeSrc.pixels = &src;
72 fPipeDst.pixels = &dst;
73
74 switch (fMode) {
Mike Klein4ed73e02018-08-06 17:03:33 -040075 case Mode::steps: {
76 float rgba[4];
77 swizzle_rb(Sk4f_fromL32(src)).store(rgba);
78 fSteps->apply(rgba);
79 dst = Sk4f_toL32(swizzle_rb(Sk4f::Load(rgba)));
80 } break;
81
82 case Mode::pipeA: {
83 fPipeA(0,0,1,1);
84 } break;
85
86 case Mode::pipeB: {
87 SkSTArenaAlloc<1024> alloc;
88 SkRasterPipeline p(&alloc);
89 p.append(SkRasterPipeline::load_bgra, &fPipeSrc);
90 fSteps->apply(&p);
91 p.append(SkRasterPipeline::store_bgra, &fPipeDst);
92 p.run(0,0,1,1);
93 } break;
Mike Kleinc8579562018-08-07 13:21:21 -040094
95 case Mode::xformer: {
96 dst = fXformer->apply(src);
97 } break;
Mike Klein4ed73e02018-08-06 17:03:33 -040098 }
99
100 if (false && i == 0) {
101 SkDebugf("%x ~~> %x\n", src, dst);
102 }
103
104 junk ^= dst;
105 }
106 }
107};
108
Mike Kleinc8579562018-08-07 13:21:21 -0400109DEF_BENCH(return new ColorSpaceXformBench{Mode::steps };)
110DEF_BENCH(return new ColorSpaceXformBench{Mode::pipeA };)
111DEF_BENCH(return new ColorSpaceXformBench{Mode::pipeB };)
112DEF_BENCH(return new ColorSpaceXformBench{Mode::xformer};)