diff options
Diffstat (limited to 'chromium/third_party/skia/bench/DeferredSurfaceCopyBench.cpp')
-rw-r--r-- | chromium/third_party/skia/bench/DeferredSurfaceCopyBench.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/chromium/third_party/skia/bench/DeferredSurfaceCopyBench.cpp b/chromium/third_party/skia/bench/DeferredSurfaceCopyBench.cpp new file mode 100644 index 00000000000..f4002b87be4 --- /dev/null +++ b/chromium/third_party/skia/bench/DeferredSurfaceCopyBench.cpp @@ -0,0 +1,82 @@ + +/* + * 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: + virtual const char* onGetName() SK_OVERRIDE { + return fDiscardableContents ? "DeferredSurfaceCopy_discardable" : + "DeferredSurfaceCopy_nonDiscardable"; + } + + virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { + // The canvas is not actually used for this test except to provide + // configuration information: gpu, multisampling, size, etc? + SkImageInfo info; + info.fWidth = kSurfaceWidth; + info.fHeight = kSurfaceHeight; + info.fColorType = kN32_SkColorType; + info.fAlphaType = kPremul_SkAlphaType; + const SkRect fullCanvasRect = SkRect::MakeWH( + SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight)); + SkSurface* surface; +#if SK_SUPPORT_GPU + GrRenderTarget* rt = reinterpret_cast<GrRenderTarget*>( + canvas->getDevice()->accessRenderTarget()); + if (NULL != rt) { + surface = SkSurface::NewRenderTarget(rt->getContext(), info, rt->numSamples()); + } else +#endif + { + surface = SkSurface::NewRaster(info); + } + SkAutoTUnref<SkDeferredCanvas> drawingCanvas(SkDeferredCanvas::Create(surface)); + surface->unref(); + + 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); ) |