|  | /* | 
|  | * Copyright 2015 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "bench/Benchmark.h" | 
|  | #include "include/core/SkBitmap.h" | 
|  | #include "src/core/SkMipmap.h" | 
|  |  | 
|  | class MipmapBench: public Benchmark { | 
|  | SkBitmap fBitmap; | 
|  | SkString fName; | 
|  | const int fW, fH; | 
|  | bool fHalfFoat; | 
|  |  | 
|  | public: | 
|  | MipmapBench(int w, int h, bool halfFloat = false) | 
|  | : fW(w), fH(h), fHalfFoat(halfFloat) | 
|  | { | 
|  | fName.printf("mipmap_build_%dx%d", w, h); | 
|  | if (halfFloat) { | 
|  | fName.append("_f16"); | 
|  | } | 
|  | } | 
|  |  | 
|  | protected: | 
|  | bool isSuitableFor(Backend backend) override { | 
|  | return kNonRendering_Backend == backend; | 
|  | } | 
|  |  | 
|  | const char* onGetName() override { return fName.c_str(); } | 
|  |  | 
|  | void onDelayedSetup() override { | 
|  | SkColorType ct = fHalfFoat ? kRGBA_F16_SkColorType : kN32_SkColorType; | 
|  | SkImageInfo info = SkImageInfo::Make(fW, fH, ct, kPremul_SkAlphaType, | 
|  | SkColorSpace::MakeSRGB()); | 
|  | fBitmap.allocPixels(info); | 
|  | fBitmap.eraseColor(SK_ColorWHITE);  // so we don't read uninitialized memory | 
|  | } | 
|  |  | 
|  | void onDraw(int loops, SkCanvas*) override { | 
|  | for (int i = 0; i < loops * 4; i++) { | 
|  | SkMipmap::Build(fBitmap, nullptr)->unref(); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | using INHERITED = Benchmark; | 
|  | }; | 
|  |  | 
|  | // Build variants that exercise the width and heights being even or odd at each level, as the | 
|  | // impl specializes on each of these. | 
|  | // | 
|  | DEF_BENCH( return new MipmapBench(511, 511); ) | 
|  | DEF_BENCH( return new MipmapBench(512, 511); ) | 
|  | DEF_BENCH( return new MipmapBench(511, 512); ) | 
|  | DEF_BENCH( return new MipmapBench(512, 512); ) | 
|  |  | 
|  | DEF_BENCH( return new MipmapBench(512, 512, true); ) | 
|  | DEF_BENCH( return new MipmapBench(511, 511, true); ) | 
|  |  | 
|  | DEF_BENCH( return new MipmapBench(2048, 2048); ) | 
|  | DEF_BENCH( return new MipmapBench(2047, 2047); ) | 
|  | DEF_BENCH( return new MipmapBench(2048, 2047); ) | 
|  | DEF_BENCH( return new MipmapBench(2047, 2048); ) |