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