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