Home | History | Annotate | Download | only in bench
      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