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