/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Benchmark.h" #include "SkDeferredCanvas.h" #include "SkDevice.h" #include "SkImage.h" #include "SkSurface.h" #if SK_SUPPORT_GPU #include "GrRenderTarget.h" #endif class DeferredSurfaceCopyBench : public Benchmark { enum { kSurfaceWidth = 1000, kSurfaceHeight = 1000, }; public: DeferredSurfaceCopyBench(bool discardableContents) { fDiscardableContents = discardableContents; } protected: const char* onGetName() override { return fDiscardableContents ? "DeferredSurfaceCopy_discardable" : "DeferredSurfaceCopy_nonDiscardable"; } void onDraw(const int loops, SkCanvas* canvas) override { // The canvas is not actually used for this test except to provide // configuration information: gpu, multisampling, size, etc? SkImageInfo info = SkImageInfo::MakeN32Premul(kSurfaceWidth, kSurfaceHeight); const SkRect fullCanvasRect = SkRect::MakeWH( SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight)); SkAutoTUnref<SkSurface> surface(canvas->newSurface(info)); // newSurface() can return NULL for several reasons, so we need to check if (NULL == surface.get()) { SkDebugf("DeferredSurfaceCopyBench newSurface failed, bench results are meaningless\n"); return; // should we signal the caller that we hit an error? } SkAutoTUnref<SkDeferredCanvas> drawingCanvas(SkDeferredCanvas::Create(surface)); for (int iteration = 0; iteration < loops; iteration++) { drawingCanvas->clear(0); SkAutoTUnref<SkImage> image(drawingCanvas->newImageSnapshot()); SkPaint paint; if (!fDiscardableContents) { // If paint is not opaque, prior canvas contents are // not discardable because they are needed for compositing. paint.setAlpha(127); } drawingCanvas->drawRect(fullCanvasRect, paint); // Trigger copy on write, which should be faster in the discardable case. drawingCanvas->flush(); } } private: bool fDiscardableContents; typedef Benchmark INHERITED; }; ////////////////////////////////////////////////////////////////////////////// DEF_BENCH( return new DeferredSurfaceCopyBench(false); ) DEF_BENCH( return new DeferredSurfaceCopyBench(true); )