1/*
2 * Copyright 2015 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 "Benchmark.h"
9#include "SkBitmap.h"
10#include "SkMipMap.h"
11
12class MipMapBench: public Benchmark {
13    SkBitmap fBitmap;
14    SkString fName;
15    const int fW, fH;
16    SkDestinationSurfaceColorMode fColorMode;
17    bool fHalfFoat;
18
19public:
20    MipMapBench(int w, int h, SkDestinationSurfaceColorMode colorMode, bool halfFloat = false)
21        : fW(w), fH(h), fColorMode(colorMode), fHalfFoat(halfFloat)
22    {
23        fName.printf("mipmap_build_%dx%d_%d_gamma", w, h, static_cast<int>(colorMode));
24        if (halfFloat) {
25            fName.append("_f16");
26        }
27    }
28
29protected:
30    bool isSuitableFor(Backend backend) override {
31        return kNonRendering_Backend == backend;
32    }
33
34    const char* onGetName() override { return fName.c_str(); }
35
36    void onDelayedSetup() override {
37        SkImageInfo info = fHalfFoat ? SkImageInfo::Make(fW, fH, kRGBA_F16_SkColorType,
38                                                         kPremul_SkAlphaType,
39                                                         SkColorSpace::MakeSRGBLinear())
40                                     : SkImageInfo::MakeS32(fW, fH, kPremul_SkAlphaType);
41        fBitmap.allocPixels(info);
42        fBitmap.eraseColor(SK_ColorWHITE);  // so we don't read uninitialized memory
43    }
44
45    void onDraw(int loops, SkCanvas*) override {
46        for (int i = 0; i < loops * 4; i++) {
47            SkMipMap::Build(fBitmap, fColorMode, nullptr)->unref();
48        }
49    }
50
51private:
52    typedef Benchmark INHERITED;
53};
54
55// Build variants that exercise the width and heights being even or odd at each level, as the
56// impl specializes on each of these.
57//
58DEF_BENCH( return new MipMapBench(511, 511, SkDestinationSurfaceColorMode::kLegacy); )
59DEF_BENCH( return new MipMapBench(512, 511, SkDestinationSurfaceColorMode::kLegacy); )
60DEF_BENCH( return new MipMapBench(511, 512, SkDestinationSurfaceColorMode::kLegacy); )
61DEF_BENCH( return new MipMapBench(512, 512, SkDestinationSurfaceColorMode::kLegacy); )
62DEF_BENCH( return new MipMapBench(512, 512,
63                                  SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); )
64DEF_BENCH( return new MipMapBench(511, 511,
65                                  SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); )
66DEF_BENCH( return new MipMapBench(512, 512, SkDestinationSurfaceColorMode::kLegacy, true); )
67DEF_BENCH( return new MipMapBench(511, 511, SkDestinationSurfaceColorMode::kLegacy, true); )
68DEF_BENCH( return new MipMapBench(2048, 2048, SkDestinationSurfaceColorMode::kLegacy); )
69DEF_BENCH( return new MipMapBench(2048, 2048,
70                                  SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); )
71DEF_BENCH( return new MipMapBench(2047, 2047, SkDestinationSurfaceColorMode::kLegacy); )
72DEF_BENCH( return new MipMapBench(2047, 2047,
73                                  SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); )
74DEF_BENCH( return new MipMapBench(2048, 2047, SkDestinationSurfaceColorMode::kLegacy); )
75DEF_BENCH( return new MipMapBench(2048, 2047,
76                                  SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); )
77DEF_BENCH( return new MipMapBench(2047, 2048, SkDestinationSurfaceColorMode::kLegacy); )
78DEF_BENCH( return new MipMapBench(2047, 2048,
79                                  SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); )
80