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 #if SK_SUPPORT_GPU
     10 #include "GrRenderTarget.h"
     11 #endif
     12 #include "SkBenchmark.h"
     13 #include "SkDeferredCanvas.h"
     14 #include "SkDevice.h"
     15 #include "SkImage.h"
     16 #include "SkSurface.h"
     17 
     18 class DeferredSurfaceCopyBench : public SkBenchmark {
     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;
     38         info.fWidth = kSurfaceWidth;
     39         info.fHeight = kSurfaceHeight;
     40         info.fColorType = kPMColor_SkColorType;
     41         info.fAlphaType = kPremul_SkAlphaType;
     42         const SkRect fullCanvasRect = SkRect::MakeWH(
     43             SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight));
     44         SkSurface* surface;
     45 #if SK_SUPPORT_GPU
     46         GrRenderTarget* rt = reinterpret_cast<GrRenderTarget*>(
     47             canvas->getDevice()->accessRenderTarget());
     48         if (NULL != rt) {
     49             surface = SkSurface::NewRenderTarget(rt->getContext(), info, rt->numSamples());
     50         } else
     51 #endif
     52         {
     53             surface = SkSurface::NewRaster(info);
     54         }
     55         SkAutoTUnref<SkDeferredCanvas> drawingCanvas(SkDeferredCanvas::Create(surface));
     56         surface->unref();
     57 
     58         for (int iteration = 0; iteration < loops; iteration++) {
     59             drawingCanvas->clear(0);
     60             SkAutoTUnref<SkImage> image(drawingCanvas->newImageSnapshot());
     61             SkPaint paint;
     62             if (!fDiscardableContents) {
     63                 // If paint is not opaque, prior canvas contents are
     64                 // not discardable because they are needed for compositing.
     65                 paint.setAlpha(127);
     66             }
     67             drawingCanvas->drawRect(fullCanvasRect, paint);
     68             // Trigger copy on write, which should be faster in the discardable case.
     69             drawingCanvas->flush();
     70         }
     71     }
     72 
     73 private:
     74     bool fDiscardableContents;
     75 
     76     typedef SkBenchmark INHERITED;
     77 };
     78 
     79 //////////////////////////////////////////////////////////////////////////////
     80 
     81 DEF_BENCH( return new DeferredSurfaceCopyBench(false); )
     82 DEF_BENCH( return new DeferredSurfaceCopyBench(true); )
     83