blob: 46aacd74c9f4f9cc39e0222cb8dde8379d9e56a5 [file] [log] [blame]
halcanary385fe4d2015-08-26 13:07:48 -07001/*
2 * Copyright 2013 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 */
tfarinaf168b862014-06-19 12:32:29 -07007#include "Benchmark.h"
Cary Clarka4083c92017-09-15 11:59:23 -04008#include "SkColorData.h"
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +00009#include "SkRandom.h"
10#include "SkString.h"
11
12template <bool kFast, bool kScale>
tfarinaf168b862014-06-19 12:32:29 -070013class FourByteInterpBench : public Benchmark {
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000014public:
15 FourByteInterpBench() {
16 fName.set("four_byte_interp");
17 fName.append(kFast ? "_fast" : "_slow");
18 fName.append(kScale ? "_255" : "_256");
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000019 }
20
mtklein36352bf2015-03-25 18:17:31 -070021 bool isSuitableFor(Backend backend) override {
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000022 return backend == kNonRendering_Backend;
23 }
24
mtklein36352bf2015-03-25 18:17:31 -070025 const char* onGetName() override { return fName.c_str(); }
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000026
joshualitt8a6697a2015-09-30 12:11:07 -070027 void onDelayedSetup() override {
commit-bot@chromium.orgcc6db402013-12-05 16:43:08 +000028 // A handful of random srcs and dsts.
29 SkRandom rand;
30 for (int i = 0; i < kInputs; i++) {
31 fSrcs[i] = SkPreMultiplyColor(rand.nextU());
32 fDsts[i] = SkPreMultiplyColor(rand.nextU());
33 }
34
35 // We'll exhaustively test all scales instead of using random numbers.
36 for (int i = 0; i <= 256; i++) {
37 fScales[i] = i;
38 }
39 if (kScale) fScales[256] = 255; // We'll just do 255 twice if we're limited to [0,255].
40 }
41
mtkleina1ebeb22015-10-01 09:43:39 -070042 void onDraw(int loops, SkCanvas*) override {
commit-bot@chromium.orgcc6db402013-12-05 16:43:08 +000043 // We xor results of FourByteInterp into junk to make sure the function runs.
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000044 volatile SkPMColor junk = 0;
commit-bot@chromium.orgcc6db402013-12-05 16:43:08 +000045
46 for (int loop = 0; loop < loops; loop++) {
47 for (int i = 0; i < kInputs; i++) {
48 for (size_t j = 0; j <= 256; j++) {
49 // Note: we really want to load src and dst here and not outside in the i-loop.
50 // If we put the loads there, a clever compiler will do the not-insignificant
51 // work in the FourByteInterps that depends only on src and dst outside this
52 // loop, so we'd only be benchmarking the back half of those functions that also
53 // depends on scale. Even here, these must be volatile arrays to prevent that
54 // clever compiler from hoisting the loads out of the loop on its own.
55 const SkPMColor src = fSrcs[i];
56 const SkPMColor dst = fDsts[i];
57
58 const unsigned scale = fScales[j];
59
60 if (kFast && kScale) {
61 junk ^= SkFastFourByteInterp(src, dst, scale);
62 } else if (kFast) {
63 junk ^= SkFastFourByteInterp256(src, dst, scale);
64 } else if (kScale) {
65 junk ^= SkFourByteInterp(src, dst, scale);
66 } else {
67 junk ^= SkFourByteInterp256(src, dst, scale);
68 }
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000069 }
70 }
71 }
72 }
73
74private:
75 SkString fName;
commit-bot@chromium.orgcc6db402013-12-05 16:43:08 +000076 static const int kInputs = 10; // Arbitrary.
77 volatile unsigned fSrcs[kInputs];
78 volatile unsigned fDsts[kInputs];
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000079 unsigned fScales[257]; // We need space for [0, 256].
80};
81
82#define COMMA ,
halcanary385fe4d2015-08-26 13:07:48 -070083DEF_BENCH(return (new FourByteInterpBench<true COMMA true>);)
84DEF_BENCH(return (new FourByteInterpBench<true COMMA false>);)
85DEF_BENCH(return (new FourByteInterpBench<false COMMA true>);)
86DEF_BENCH(return (new FourByteInterpBench<false COMMA false>);)
commit-bot@chromium.orgc25d2212013-12-02 22:32:47 +000087#undef COMMA