| Index: bench/RectanizerBench.cpp
|
| diff --git a/bench/RectanizerBench.cpp b/bench/RectanizerBench.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..99f10c00147e808f81b2be124a68a250edabdaac
|
| --- /dev/null
|
| +++ b/bench/RectanizerBench.cpp
|
| @@ -0,0 +1,138 @@
|
| +/*
|
| +* Copyright 2014 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 "SkRandom.h"
|
| +#include "SkSize.h"
|
| +#include "SkTDArray.h"
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +
|
| +#include "GrRectanizer_pow2.h"
|
| +#include "GrRectanizer_skyline.h"
|
| +
|
| +/**
|
| + * This bench exercises Ganesh' GrRectanizer classes. It exercises the following
|
| + * rectanizers:
|
| + * Pow2 Rectanizer
|
| + * Skyline Rectanizer
|
| + * in the following cases:
|
| + * random rects (e.g., pull-save-layers forward use case)
|
| + * random power of two rects
|
| + * small constant sized power of 2 rects (e.g., glyph cache use case)
|
| + */
|
| +class RectanizerBench : public SkBenchmark {
|
| +public:
|
| + static const int kWidth = 1024;
|
| + static const int kHeight = 1024;
|
| +
|
| + enum RectanizerType {
|
| + kPow2_RectanizerType,
|
| + kSkyline_RectanizerType,
|
| + };
|
| +
|
| + enum RectType {
|
| + kRand_RectType,
|
| + kRandPow2_RectType,
|
| + kSmallPow2_RectType
|
| + };
|
| +
|
| + RectanizerBench(RectanizerType rectanizerType, RectType rectType)
|
| + : fName("rectanizer_")
|
| + , fRectanizerType(rectanizerType)
|
| + , fRectType(rectType) {
|
| +
|
| + if (kPow2_RectanizerType == fRectanizerType) {
|
| + fName.append("pow2_");
|
| + } else {
|
| + SkASSERT(kSkyline_RectanizerType == fRectanizerType);
|
| + fName.append("skyline_");
|
| + }
|
| +
|
| + if (kRand_RectType == fRectType) {
|
| + fName.append("rand");
|
| + } else if (kRandPow2_RectType == fRectType) {
|
| + fName.append("rand2");
|
| + } else {
|
| + SkASSERT(kSmallPow2_RectType == fRectType);
|
| + fName.append("sm2");
|
| + }
|
| + }
|
| +
|
| +protected:
|
| + virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
|
| + return kNonRendering_Backend == backend;
|
| + }
|
| +
|
| + virtual const char* onGetName() SK_OVERRIDE {
|
| + return fName.c_str();
|
| + }
|
| +
|
| + virtual void onPreDraw() SK_OVERRIDE {
|
| + SkASSERT(NULL == fRectanizer.get());
|
| +
|
| + if (kPow2_RectanizerType == fRectanizerType) {
|
| + fRectanizer.reset(SkNEW_ARGS(GrRectanizerPow2, (kWidth, kHeight)));
|
| + } else {
|
| + SkASSERT(kSkyline_RectanizerType == fRectanizerType);
|
| + fRectanizer.reset(SkNEW_ARGS(GrRectanizerSkyline, (kWidth, kHeight)));
|
| + }
|
| + }
|
| +
|
| + virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
|
| + SkRandom rand;
|
| + SkIPoint16 loc;
|
| + SkISize size;
|
| +
|
| + for (int i = 0; i < loops; ++i) {
|
| + if (kRand_RectType == fRectType) {
|
| + size = SkISize::Make(rand.nextRangeU(1, kWidth / 2),
|
| + rand.nextRangeU(1, kHeight / 2));
|
| + } else if (kRandPow2_RectType == fRectType) {
|
| + size = SkISize::Make(GrNextPow2(rand.nextRangeU(1, kWidth / 2)),
|
| + GrNextPow2(rand.nextRangeU(1, kHeight / 2)));
|
| + } else {
|
| + SkASSERT(kSmallPow2_RectType == fRectType);
|
| + size = SkISize::Make(128, 128);
|
| + }
|
| +
|
| + if (!fRectanizer->addRect(size.fWidth, size.fHeight, &loc)) {
|
| + // insert failed so clear out the rectanizer and give the
|
| + // current rect another try
|
| + fRectanizer->reset();
|
| + i--;
|
| + }
|
| + }
|
| +
|
| + fRectanizer->reset();
|
| + }
|
| +
|
| +private:
|
| + SkString fName;
|
| + RectanizerType fRectanizerType;
|
| + RectType fRectType;
|
| + SkAutoTDelete<GrRectanizer> fRectanizer;
|
| +
|
| + typedef SkBenchmark INHERITED;
|
| +};
|
| +
|
| +//////////////////////////////////////////////////////////////////////////////
|
| +
|
| +DEF_BENCH(return new RectanizerBench(RectanizerBench::kPow2_RectanizerType,
|
| + RectanizerBench::kRand_RectType);)
|
| +DEF_BENCH(return new RectanizerBench(RectanizerBench::kPow2_RectanizerType,
|
| + RectanizerBench::kRandPow2_RectType);)
|
| +DEF_BENCH(return new RectanizerBench(RectanizerBench::kPow2_RectanizerType,
|
| + RectanizerBench::kSmallPow2_RectType);)
|
| +DEF_BENCH(return new RectanizerBench(RectanizerBench::kSkyline_RectanizerType,
|
| + RectanizerBench::kRand_RectType);)
|
| +DEF_BENCH(return new RectanizerBench(RectanizerBench::kSkyline_RectanizerType,
|
| + RectanizerBench::kRandPow2_RectType);)
|
| +DEF_BENCH(return new RectanizerBench(RectanizerBench::kSkyline_RectanizerType,
|
| + RectanizerBench::kSmallPow2_RectType);)
|
| +
|
| +#endif
|
|
|