aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/RectanizerBench.cpp138
-rw-r--r--gyp/bench.gypi1
-rw-r--r--tests/GpuRectanizerTest.cpp14
3 files changed, 146 insertions, 7 deletions
diff --git a/bench/RectanizerBench.cpp b/bench/RectanizerBench.cpp
new file mode 100644
index 0000000000..99f10c0014
--- /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
diff --git a/gyp/bench.gypi b/gyp/bench.gypi
index 9efcbf383d..82a7cd6ba4 100644
--- a/gyp/bench.gypi
+++ b/gyp/bench.gypi
@@ -71,6 +71,7 @@
'../bench/RTreeBench.cpp',
'../bench/ReadPixBench.cpp',
'../bench/RectBench.cpp',
+ '../bench/RectanizerBench.cpp',
'../bench/RectoriBench.cpp',
'../bench/RefCntBench.cpp',
'../bench/RegionBench.cpp',
diff --git a/tests/GpuRectanizerTest.cpp b/tests/GpuRectanizerTest.cpp
index ec396ef863..2ee641e916 100644
--- a/tests/GpuRectanizerTest.cpp
+++ b/tests/GpuRectanizerTest.cpp
@@ -14,8 +14,8 @@
#include "SkTDArray.h"
#include "Test.h"
-static const int kWidth = 1000;
-static const int kHeight = 1000;
+static const int kWidth = 1024;
+static const int kHeight = 1024;
// Basic test of a GrRectanizer-derived class' functionality
static void test_rectanizer_basic(skiatest::Reporter* reporter, GrRectanizer* rectanizer) {
@@ -59,16 +59,16 @@ static void test_pow2(skiatest::Reporter* reporter, const SkTDArray<SkISize>& re
}
DEF_GPUTEST(GpuRectanizer, reporter, factory) {
- SkTDArray<SkISize> fRects;
+ SkTDArray<SkISize> rects;
SkRandom rand;
for (int i = 0; i < 50; i++) {
- fRects.push(SkISize::Make(rand.nextRangeU(1, kWidth / 2),
- rand.nextRangeU(1, kHeight / 2)));
+ rects.push(SkISize::Make(rand.nextRangeU(1, kWidth / 2),
+ rand.nextRangeU(1, kHeight / 2)));
}
- test_skyline(reporter, fRects);
- test_pow2(reporter, fRects);
+ test_skyline(reporter, rects);
+ test_pow2(reporter, rects);
}
#endif