Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3932)

Unified Diff: bench/RectanizerBench.cpp

Issue 319523003: Add bench for rectanizers (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Actually use bench loops parameter Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | gyp/bench.gypi » ('j') | tests/GpuRectanizerTest.cpp » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | gyp/bench.gypi » ('j') | tests/GpuRectanizerTest.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698