1 /* 2 * Copyright 2016 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 "SkCanvas.h" 10 #include "SkImage.h" 11 #include "SkPaint.h" 12 #include "SkSurface.h" 13 14 class GrMipMapBench: public Benchmark { 15 sk_sp<SkSurface> fSurface; 16 SkString fName; 17 const int fW, fH; 18 19 public: 20 GrMipMapBench(int w, int h) : fW(w), fH(h) { 21 fName.printf("gr_mipmap_build_%dx%d", w, h); 22 } 23 24 protected: 25 bool isSuitableFor(Backend backend) override { 26 return kGPU_Backend == backend; 27 } 28 29 const char* onGetName() override { return fName.c_str(); } 30 31 void onDraw(int loops, SkCanvas* canvas) override { 32 if (!fSurface) { 33 GrContext* context = canvas->getGrContext(); 34 if (nullptr == context) { 35 return; 36 } 37 auto srgb = SkColorSpace::MakeSRGB(); 38 SkImageInfo info = 39 SkImageInfo::Make(fW, fH, kRGBA_8888_SkColorType, kPremul_SkAlphaType, srgb); 40 // We're benching the regeneration of the mip levels not the need to allocate them every 41 // frame. Thus we create the surface with mips to begin with. 42 fSurface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info, 0, 43 kBottomLeft_GrSurfaceOrigin, nullptr, true); 44 45 } 46 47 // Clear surface once: 48 fSurface->getCanvas()->clear(SK_ColorBLACK); 49 50 SkPaint paint; 51 paint.setFilterQuality(kMedium_SkFilterQuality); 52 paint.setColor(SK_ColorWHITE); 53 for (int i = 0; i < loops; i++) { 54 // Touch surface so mips are dirtied 55 fSurface->getCanvas()->drawPoint(0, 0, paint); 56 57 // Draw reduced version of surface to original canvas, to trigger mip generation 58 canvas->save(); 59 canvas->scale(0.1f, 0.1f); 60 canvas->drawImage(fSurface->makeImageSnapshot(), 0, 0, &paint); 61 canvas->restore(); 62 } 63 } 64 65 void onPerCanvasPostDraw(SkCanvas*) override { 66 fSurface.reset(nullptr); 67 } 68 69 private: 70 typedef Benchmark INHERITED; 71 }; 72 73 // Build variants that exercise the width and heights being even or odd at each level, as the 74 // impl specializes on each of these. 75 // 76 DEF_BENCH( return new GrMipMapBench(511, 511); ) 77 DEF_BENCH( return new GrMipMapBench(512, 511); ) 78 DEF_BENCH( return new GrMipMapBench(511, 512); ) 79 DEF_BENCH( return new GrMipMapBench(512, 512); ) 80