• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
GrMipMapBench(int w,int h)20     GrMipMapBench(int w, int h) : fW(w), fH(h) {
21         fName.printf("gr_mipmap_build_%dx%d", w, h);
22     }
23 
24 protected:
isSuitableFor(Backend backend)25     bool isSuitableFor(Backend backend) override {
26         return kGPU_Backend == backend;
27     }
28 
onGetName()29     const char* onGetName() override { return fName.c_str(); }
30 
onDraw(int loops,SkCanvas * canvas)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 
onPerCanvasPostDraw(SkCanvas *)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