blob: 751f0dfca2503701db65806e304806ad0021f566 [file] [log] [blame]
reedfbc1e292016-01-29 05:22:59 -08001
2/*
3 * Copyright 2016 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "Benchmark.h"
10#include "SkString.h"
reed395eabe2016-01-30 18:52:31 -080011#include "SkXfermode.h"
reedfbc1e292016-01-29 05:22:59 -080012
13#define INNER_LOOPS 100
14
15// Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode.
16class Xfer4fBench : public Benchmark {
17public:
reed395eabe2016-01-30 18:52:31 -080018 Xfer4fBench(SkXfermode::Mode mode, const char name[], bool doN, uint32_t flags)
19 : fDoN(doN)
20 , fFlags(flags)
21 {
22 fProc1 = SkXfermode::GetPM4fProc1(mode, flags);
23 fProcN = SkXfermode::GetPM4fProcN(mode, flags);
reedfbc1e292016-01-29 05:22:59 -080024 fName.printf("xfer4f_%s_%c_%s_%s", name, fDoN ? 'N' : '1',
reed395eabe2016-01-30 18:52:31 -080025 (flags & SkXfermode::kSrcIsOpaque_PM4fFlag) ? "opaque" : "alpha",
26 (flags & SkXfermode::kDstIsSRGB_PM4fFlag) ? "srgb" : "linear");
reedfbc1e292016-01-29 05:22:59 -080027
reedfbc1e292016-01-29 05:22:59 -080028 for (int i = 0; i < N; ++i) {
reed395eabe2016-01-30 18:52:31 -080029 fSrc[i] = {{ 1, 1, 1, 1 }};
reedfbc1e292016-01-29 05:22:59 -080030 fDst[i] = 0;
31 }
32 }
33
34protected:
35 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
36
37 const char* onGetName() override { return fName.c_str(); }
38
39 void onDraw(int loops, SkCanvas*) override {
reed395eabe2016-01-30 18:52:31 -080040 const SkXfermode::PM4fState state{ nullptr, fFlags };
41 const uint8_t* aa = nullptr;
42
43 for (int i = 0; i < loops * INNER_LOOPS; ++i) {
44 if (fDoN) {
45 fProcN(state, fDst, fSrc, N, aa);
46 } else {
47 fProc1(state, fDst, fSrc[0], N, aa);
reedfbc1e292016-01-29 05:22:59 -080048 }
49 }
50 }
51
52private:
53 SkString fName;
reed395eabe2016-01-30 18:52:31 -080054 SkXfermode::PM4fProc1 fProc1;
55 SkXfermode::PM4fProcN fProcN;
reedfbc1e292016-01-29 05:22:59 -080056 bool fDoN;
reed395eabe2016-01-30 18:52:31 -080057 uint32_t fFlags;
reedfbc1e292016-01-29 05:22:59 -080058
59 enum {
60 N = 1000,
61 };
62 SkPM4f fSrc[N];
63 SkPMColor fDst[N];
64
65 typedef Benchmark INHERITED;
66};
67
reed395eabe2016-01-30 18:52:31 -080068#define F00 0
69#define F01 (SkXfermode::kSrcIsOpaque_PM4fFlag)
70#define F10 (SkXfermode::kDstIsSRGB_PM4fFlag)
71#define F11 (SkXfermode::kSrcIsOpaque_PM4fFlag | SkXfermode::kDstIsSRGB_PM4fFlag)
reedfbc1e292016-01-29 05:22:59 -080072
reed395eabe2016-01-30 18:52:31 -080073DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", false, F10); )
74DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", false, F00); )
75DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", false, F11); )
76DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", false, F01); )
77
78DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", true, F10); )
79DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", true, F00); )
80DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", true, F11); )
81DEF_BENCH( return new Xfer4fBench(SkXfermode::kSrcOver_Mode, "srcover", true, F01); )