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
18class DeferredSurfaceCopyBench : public Benchmark {
19    enum {
20        kSurfaceWidth = 1000,
21        kSurfaceHeight = 1000,
22    };
23public:
24    DeferredSurfaceCopyBench(bool discardableContents) {
25        fDiscardableContents = discardableContents;
26    }
27
28protected:
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 = kN32_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
73private:
74    bool fDiscardableContents;
75
76    typedef Benchmark INHERITED;
77};
78
79//////////////////////////////////////////////////////////////////////////////
80
81DEF_BENCH( return new DeferredSurfaceCopyBench(false); )
82DEF_BENCH( return new DeferredSurfaceCopyBench(true); )
83