|  | /* | 
|  | * 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 "Benchmark.h" | 
|  | #include "SkBitmap.h" | 
|  | #include "SkMipMap.h" | 
|  |  | 
|  | class MipMapBench: public Benchmark { | 
|  | SkBitmap fBitmap; | 
|  | SkString fName; | 
|  | const int fW, fH; | 
|  | SkDestinationSurfaceColorMode fColorMode; | 
|  | bool fHalfFoat; | 
|  |  | 
|  | public: | 
|  | MipMapBench(int w, int h, SkDestinationSurfaceColorMode colorMode, bool halfFloat = false) | 
|  | : fW(w), fH(h), fColorMode(colorMode), fHalfFoat(halfFloat) | 
|  | { | 
|  | fName.printf("mipmap_build_%dx%d_%d_gamma", w, h, static_cast<int>(colorMode)); | 
|  | 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 { | 
|  | SkImageInfo info = fHalfFoat ? SkImageInfo::Make(fW, fH, kRGBA_F16_SkColorType, | 
|  | kPremul_SkAlphaType, | 
|  | SkColorSpace::MakeSRGBLinear()) | 
|  | : SkImageInfo::MakeS32(fW, fH, kPremul_SkAlphaType); | 
|  | 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, fColorMode, nullptr)->unref(); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | typedef Benchmark INHERITED; | 
|  | }; | 
|  |  | 
|  | // 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, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(512, 511, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(511, 512, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(512, 512, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(512, 512, | 
|  | SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); ) | 
|  | DEF_BENCH( return new MipMapBench(511, 511, | 
|  | SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); ) | 
|  | DEF_BENCH( return new MipMapBench(512, 512, SkDestinationSurfaceColorMode::kLegacy, true); ) | 
|  | DEF_BENCH( return new MipMapBench(511, 511, SkDestinationSurfaceColorMode::kLegacy, true); ) | 
|  | DEF_BENCH( return new MipMapBench(2048, 2048, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(2048, 2048, | 
|  | SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); ) | 
|  | DEF_BENCH( return new MipMapBench(2047, 2047, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(2047, 2047, | 
|  | SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); ) | 
|  | DEF_BENCH( return new MipMapBench(2048, 2047, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(2048, 2047, | 
|  | SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); ) | 
|  | DEF_BENCH( return new MipMapBench(2047, 2048, SkDestinationSurfaceColorMode::kLegacy); ) | 
|  | DEF_BENCH( return new MipMapBench(2047, 2048, | 
|  | SkDestinationSurfaceColorMode::kGammaAndColorSpaceAware); ) |