diff options
author | 2013-04-17 13:43:04 +0000 | |
---|---|---|
committer | 2013-04-17 13:43:04 +0000 | |
commit | d61ba6e5cf2c574cbbf23de58239a30fe52228a2 (patch) | |
tree | c2a28b96ab05c6a8009f8f553d585c51ca496857 | |
parent | 770ab362a9a8329926118d0c08cfea8aba510ef5 (diff) |
Benchmark to measure SkSurface copy on write performance
Review URL: https://codereview.chromium.org/14297008
git-svn-id: http://skia.googlecode.com/svn/trunk@8718 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | bench/DeferredSurfaceCopyBench.cpp | 87 | ||||
-rw-r--r-- | gyp/bench.gypi | 1 |
2 files changed, 88 insertions, 0 deletions
diff --git a/bench/DeferredSurfaceCopyBench.cpp b/bench/DeferredSurfaceCopyBench.cpp new file mode 100644 index 0000000000..faa0471dd5 --- /dev/null +++ b/bench/DeferredSurfaceCopyBench.cpp @@ -0,0 +1,87 @@ + +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#if SK_SUPPORT_GPU +#include "GrRenderTarget.h" +#endif +#include "SkBenchmark.h" +#include "SkDeferredCanvas.h" +#include "SkDevice.h" +#include "SkImage.h" +#include "SkSurface.h" + +class DeferredSurfaceCopyBench : public SkBenchmark { + enum { + N = SkBENCHLOOP(5), + kSurfaceWidth = 1000, + kSurfaceHeight = 1000, + }; +public: + DeferredSurfaceCopyBench(void* param, bool discardableContents) : SkBenchmark(param) { + fDiscardableContents = discardableContents; + } + +protected: + virtual const char* onGetName() SK_OVERRIDE { + return fDiscardableContents ? "DeferredSurfaceCopy_discardable" : + "DeferredSurfaceCopy_nonDiscardable"; + } + + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { + // The canvas is not actually used for this test except to provide + // configuration information: gpu, multisampling, size, etc? + SkDevice* referenceDevice = canvas->getDevice(); + SkImage::Info info; + info.fWidth = kSurfaceWidth; + info.fHeight = kSurfaceHeight; + info.fColorType = SkImage::kPMColor_ColorType; + info.fAlphaType = SkImage::kPremul_AlphaType; + const SkRect fullCanvasRect = SkRect::MakeWH( + SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight)); + SkSurface* surface; +#if SK_SUPPORT_GPU + GrRenderTarget* rt = reinterpret_cast<GrRenderTarget*>(referenceDevice->accessRenderTarget()); + if (NULL != rt) { + surface = SkSurface::NewRenderTarget(rt->getContext(), info, rt->numSamples()); + } else +#endif + { + surface = SkSurface::NewRaster(info); + } + SkDeferredCanvas drawingCanvas(surface); + surface->unref(); + + for (int iteration = 0; iteration < N; 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 SkBenchmark INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static SkBenchmark* Fact0(void* p) { return new DeferredSurfaceCopyBench(p, false); } +static SkBenchmark* Fact1(void* p) { return new DeferredSurfaceCopyBench(p, true); } + +static BenchRegistry gReg0(Fact0); +static BenchRegistry gReg1(Fact1); + diff --git a/gyp/bench.gypi b/gyp/bench.gypi index f5aa1e3b45..614f147498 100644 --- a/gyp/bench.gypi +++ b/gyp/bench.gypi @@ -18,6 +18,7 @@ '../bench/DashBench.cpp', '../bench/DecodeBench.cpp', '../bench/DeferredCanvasBench.cpp', + '../bench/DeferredSurfaceCopyBench.cpp', '../bench/FontScalerBench.cpp', '../bench/GradientBench.cpp', '../bench/GrMemoryPoolBench.cpp', |