blob: 6c8de54eaa73010f2293022f23c8798cc26df0be [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"
Mike Klein4ed73e02018-08-06 17:03:33 -040016
Mike Klein1a3eb522018-10-18 10:11:00 -040017enum class Mode { steps, xformer };
Mike Klein4ed73e02018-08-06 17:03:33 -040018
19struct ColorSpaceXformBench : public Benchmark {
20 ColorSpaceXformBench(Mode mode) : fMode(mode) {}
21
22 const Mode fMode;
23
Mike Klein1a3eb522018-10-18 10:11:00 -040024 std::unique_ptr<SkColorSpaceXformSteps> fSteps;
25 std::unique_ptr<SkColorSpaceXformer> fXformer;
Mike Kleinc8579562018-08-07 13:21:21 -040026
Mike Klein4ed73e02018-08-06 17:03:33 -040027 const char* onGetName() override {
28 switch (fMode) {
Mike Kleinc8579562018-08-07 13:21:21 -040029 case Mode::steps : return "ColorSpaceXformBench_steps";
Mike Kleinc8579562018-08-07 13:21:21 -040030 case Mode::xformer: return "ColorSpaceXformBench_xformer";
Mike Klein4ed73e02018-08-06 17:03:33 -040031 }
32 return "";
33 }
34
35 bool isSuitableFor(Backend backend) override { return kNonRendering_Backend == backend; }
36
37 void onDelayedSetup() override {
38 sk_sp<SkColorSpace> src = SkColorSpace::MakeSRGB(),
39 dst = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
40 SkColorSpace::kDCIP3_D65_Gamut);
41
Mike Klein8f3d36c2018-08-14 10:28:05 -040042 fSteps = skstd::make_unique<SkColorSpaceXformSteps>(src.get(), kOpaque_SkAlphaType,
43 dst.get(), kPremul_SkAlphaType);
Mike Kleinc8579562018-08-07 13:21:21 -040044 fXformer = SkColorSpaceXformer::Make(dst); // src is implicitly sRGB, what we want anyway
Mike Klein4ed73e02018-08-06 17:03:33 -040045 }
46
47 void onDraw(int n, SkCanvas* canvas) override {
48 volatile SkColor junk = 0;
49 SkRandom rand;
50
51 for (int i = 0; i < n; i++) {
52 SkColor src = rand.nextU(),
53 dst;
Mike Klein4ed73e02018-08-06 17:03:33 -040054 switch (fMode) {
Mike Klein4ed73e02018-08-06 17:03:33 -040055 case Mode::steps: {
56 float rgba[4];
57 swizzle_rb(Sk4f_fromL32(src)).store(rgba);
58 fSteps->apply(rgba);
59 dst = Sk4f_toL32(swizzle_rb(Sk4f::Load(rgba)));
60 } break;
61
Mike Kleinc8579562018-08-07 13:21:21 -040062 case Mode::xformer: {
63 dst = fXformer->apply(src);
64 } break;
Mike Klein4ed73e02018-08-06 17:03:33 -040065 }
66
67 if (false && i == 0) {
68 SkDebugf("%x ~~> %x\n", src, dst);
69 }
70
71 junk ^= dst;
72 }
73 }
74};
75
Mike Kleinc8579562018-08-07 13:21:21 -040076DEF_BENCH(return new ColorSpaceXformBench{Mode::steps };)
Mike Kleinc8579562018-08-07 13:21:21 -040077DEF_BENCH(return new ColorSpaceXformBench{Mode::xformer};)