Home | History | Annotate | Download | only in bench
      1 
      2 /*
      3  * Copyright 2013 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #include "Benchmark.h"
     10 #include "SkDeferredCanvas.h"
     11 #include "SkDevice.h"
     12 #include "SkImage.h"
     13 #include "SkSurface.h"
     14 #if SK_SUPPORT_GPU
     15 #include "GrRenderTarget.h"
     16 #endif
     17 
     18 class DeferredSurfaceCopyBench : public Benchmark {
     19     enum {
     20         kSurfaceWidth = 1000,
     21         kSurfaceHeight = 1000,
     22     };
     23 public:
     24     DeferredSurfaceCopyBench(bool discardableContents) {
     25         fDiscardableContents = discardableContents;
     26     }
     27 
     28 protected:
     29     virtual const char* onGetName() SK_OVERRIDE {
     30         return fDiscardableContents ? "DeferredSurfaceCopy_discardable" :
     31             "DeferredSurfaceCopy_nonDiscardable";
     32     }
     33 
     34     virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
     35         // The canvas is not actually used for this test except to provide
     36         // configuration information: gpu, multisampling, size, etc?
     37         SkImageInfo info = SkImageInfo::MakeN32Premul(kSurfaceWidth, kSurfaceHeight);
     38         const SkRect fullCanvasRect = SkRect::MakeWH(
     39             SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight));
     40         SkAutoTUnref<SkSurface> surface(canvas->newSurface(info));
     41         SkAutoTUnref<SkDeferredCanvas> drawingCanvas(SkDeferredCanvas::Create(surface));
     42 
     43         for (int iteration = 0; iteration < loops; iteration++) {
     44             drawingCanvas->clear(0);
     45             SkAutoTUnref<SkImage> image(drawingCanvas->newImageSnapshot());
     46             SkPaint paint;
     47             if (!fDiscardableContents) {
     48                 // If paint is not opaque, prior canvas contents are
     49                 // not discardable because they are needed for compositing.
     50                 paint.setAlpha(127);
     51             }
     52             drawingCanvas->drawRect(fullCanvasRect, paint);
     53             // Trigger copy on write, which should be faster in the discardable case.
     54             drawingCanvas->flush();
     55         }
     56     }
     57 
     58 private:
     59     bool fDiscardableContents;
     60 
     61     typedef Benchmark INHERITED;
     62 };
     63 
     64 //////////////////////////////////////////////////////////////////////////////
     65 
     66 DEF_BENCH( return new DeferredSurfaceCopyBench(false); )
     67 DEF_BENCH( return new DeferredSurfaceCopyBench(true); )
     68