/* * 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; 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 { 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, 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); ) 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); )