Chromium Code Reviews| Index: bench/XfermodeBench.cpp |
| =================================================================== |
| --- bench/XfermodeBench.cpp (revision 0) |
| +++ bench/XfermodeBench.cpp (revision 0) |
| @@ -0,0 +1,70 @@ |
| + |
| +/* |
| + * 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 "SkBenchmark.h" |
| +#include "SkCanvas.h" |
| +#include "SkPaint.h" |
| +#include "SkRandom.h" |
| +#include "SkString.h" |
| +#include "SkXfermode.h" |
| + |
| +// Benchmark that draws non-AA rects with an SkXfermode::Mode |
| +class XfermodeBench : public SkBenchmark { |
| +public: |
| + XfermodeBench(void* param, SkXfermode::Mode mode) : SkBenchmark(param) { |
| + fXfermode.reset(SkXfermode::Create(mode)); |
| + SkASSERT(NULL != fXfermode.get() || SkXfermode::kSrcOver_Mode == mode); |
| + fName.printf("Xfermode_%s", SkXfermode::ModeName(mode)); |
| + } |
| + |
| +protected: |
| + virtual const char* onGetName() SK_OVERRIDE { return fName.c_str(); } |
| + |
| + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
| + SkISize size = canvas->getDeviceSize(); |
| + SkMWCRandom random; |
| + for (int i = 0; i < kNumRects; ++i) { |
| + SkPaint paint; |
| + paint.setXfermode(fXfermode.get()); |
| + paint.setColor(random.nextU()); |
| + SkScalar w = random.nextRangeScalar(SkIntToScalar(kMinSize), SkIntToScalar(kMaxSize)); |
| + SkScalar h = random.nextRangeScalar(SkIntToScalar(kMinSize), SkIntToScalar(kMaxSize)); |
| + SkRect rect = SkRect::MakeXYWH( |
| + random.nextUScalar1() * (size.fWidth - w), |
| + random.nextUScalar1() * (size.fHeight - h), |
| + w, |
| + h |
| + ); |
| + canvas->drawRect(rect, paint); |
| + } |
| + } |
| + |
| +private: |
| + enum { |
| + kNumRects = SkBENCHLOOP(1000), |
| + kMinSize = 10, |
| + kMaxSize = 400, |
| + }; |
| + SkAutoTUnref<SkXfermode> fXfermode; |
| + SkString fName; |
| + |
| + typedef SkBenchmark INHERITED; |
| +}; |
| + |
| +////////////////////////////////////////////////////////////////////////////// |
| + |
| + |
|
robertphillips
2013/03/31 16:44:13
What about just adding a bench for each xfermode (
|
| +// These modes were chosen because they are expected to be successively harder for the GPU. |
| +// kSrc can disable blending, kSrcOver cannot, kDarken requires reading the dst pixel in the shader. |
| +static SkBenchmark* Fact0(void* p) { return new XfermodeBench(p, SkXfermode::kSrc_Mode); } |
| +static SkBenchmark* Fact1(void* p) { return new XfermodeBench(p, SkXfermode::kSrcOver_Mode); } |
| +static SkBenchmark* Fact2(void* p) { return new XfermodeBench(p, SkXfermode::kDarken_Mode); } |
| + |
| +static BenchRegistry gReg0(Fact0); |
| +static BenchRegistry gReg1(Fact1); |
| +static BenchRegistry gReg2(Fact2); |