Chromium Code Reviews| Index: bench/DeferredSurfaceCopyBench.cpp |
| =================================================================== |
| --- bench/DeferredSurfaceCopyBench.cpp (revision 0) |
| +++ bench/DeferredSurfaceCopyBench.cpp (revision 0) |
| @@ -0,0 +1,84 @@ |
| + |
| +/* |
| + * 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(25), |
| + }; |
| +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 = referenceDevice->width(); |
|
reed1
2013/04/16 20:37:24
Is it important to match this size? Seems like the
Justin Novosad
2013/04/16 20:50:48
Done.
|
| + info.fHeight = referenceDevice->height(); |
| + info.fColorType = SkImage::kPMColor_ColorType; |
| + info.fAlphaType = SkImage::kPremul_AlphaType; |
| + 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); |
| + SkImage* image = drawingCanvas.newImageSnapshot(); |
|
reed1
2013/04/16 20:37:24
I think you can collaps these two lines down to ju
Justin Novosad
2013/04/16 20:50:48
Done.
|
| + SkAutoTUnref<SkImage> aur(image); |
| + 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.drawPaint(paint); |
|
reed1
2013/04/16 20:37:24
this is a non-trival call, in terms of time, if th
Justin Novosad
2013/04/16 20:50:48
To make contents recognized as discardable I need
|
| + // 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); |