diff options
author | sglez@google.com <sglez@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-08-30 17:27:47 +0000 |
---|---|---|
committer | sglez@google.com <sglez@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-08-30 17:27:47 +0000 |
commit | 8c902126a90f37b6a038a78488c6215fa0c34b7d (patch) | |
tree | 2697cadd11b02c99a3d775241d801dcb227a9bc1 /src | |
parent | 6be61ce03947b7d69305c37c1efa389160afada5 (diff) |
R-Tree -- Don't sort draw commands unless specified.
We expect Webkit and Bink to give us draw commands in a reasonable x,y order.
We can maintain correctness and get a 17% recording speedup for the R-Tree by
not sorting in x and y when bulk-loading.
R=caryclark@google.com, reed@google.com
Review URL: https://codereview.chromium.org/23480002
git-svn-id: http://skia.googlecode.com/svn/trunk@11037 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPicture.cpp | 4 | ||||
-rw-r--r-- | src/core/SkRTree.cpp | 40 | ||||
-rw-r--r-- | src/core/SkRTree.h | 6 |
3 files changed, 33 insertions, 17 deletions
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp index 1aa45284aa..f70f16ee5f 100644 --- a/src/core/SkPicture.cpp +++ b/src/core/SkPicture.cpp @@ -232,8 +232,10 @@ SkBBoxHierarchy* SkPicture::createBBoxHierarchy() const { SkScalar aspectRatio = SkScalarDiv(SkIntToScalar(fWidth), SkIntToScalar(fHeight)); + bool sortDraws = false; // Do not sort draw calls when bulk loading. + return SkRTree::Create(kRTreeMinChildren, kRTreeMaxChildren, - aspectRatio); + aspectRatio, sortDraws); } SkCanvas* SkPicture::getRecordingCanvas() const { diff --git a/src/core/SkRTree.cpp b/src/core/SkRTree.cpp index d7a15d5957..95e4336ac7 100644 --- a/src/core/SkRTree.cpp +++ b/src/core/SkRTree.cpp @@ -21,21 +21,24 @@ static inline void join_no_empty_check(const SkIRect& joinWith, SkIRect* out); SK_DEFINE_INST_COUNT(SkRTree) -SkRTree* SkRTree::Create(int minChildren, int maxChildren, SkScalar aspectRatio) { +SkRTree* SkRTree::Create(int minChildren, int maxChildren, SkScalar aspectRatio, + bool sortWhenBulkLoading) { if (minChildren < maxChildren && (maxChildren + 1) / 2 >= minChildren && minChildren > 0 && maxChildren < static_cast<int>(SK_MaxU16)) { - return new SkRTree(minChildren, maxChildren, aspectRatio); + return new SkRTree(minChildren, maxChildren, aspectRatio, sortWhenBulkLoading); } return NULL; } -SkRTree::SkRTree(int minChildren, int maxChildren, SkScalar aspectRatio) +SkRTree::SkRTree(int minChildren, int maxChildren, SkScalar aspectRatio, + bool sortWhenBulkLoading) : fMinChildren(minChildren) , fMaxChildren(maxChildren) , fNodeSize(sizeof(Node) + sizeof(Branch) * maxChildren) , fCount(0) , fNodes(fNodeSize * 256) - , fAspectRatio(aspectRatio) { + , fAspectRatio(aspectRatio) + , fSortWhenBulkLoading(sortWhenBulkLoading) { SkASSERT(minChildren < maxChildren && minChildren > 0 && maxChildren < static_cast<int>(SK_MaxU16)); SkASSERT((maxChildren + 1) / 2 >= minChildren); @@ -323,8 +326,14 @@ SkRTree::Branch SkRTree::bulkLoad(SkTDArray<Branch>* branches, int level) { branches->rewind(); return out; } else { - // First we sort the whole list by y coordinates - SkTQSort(branches->begin(), branches->end() - 1, RectLessY()); + // We sort the whole list by y coordinates, if we are told to do so. + // + // We expect Webkit / Blink to give us a reasonable x,y order. + // Avoiding this call resulted in a 17% win for recording with + // negligible difference in playback speed. + if (fSortWhenBulkLoading) { + SkTQSort(branches->begin(), branches->end() - 1, RectLessY()); + } int numBranches = branches->count() / fMaxChildren; int remainder = branches->count() % fMaxChildren; @@ -348,15 +357,18 @@ SkRTree::Branch SkRTree::bulkLoad(SkTDArray<Branch>* branches, int level) { int currentBranch = 0; for (int i = 0; i < numStrips; ++i) { - int begin = currentBranch; - int end = currentBranch + numTiles * fMaxChildren - SkMin32(remainder, - (fMaxChildren - fMinChildren) * numTiles); - if (end > branches->count()) { - end = branches->count(); - } + // Once again, if we are told to do so, we sort by x. + if (fSortWhenBulkLoading) { + int begin = currentBranch; + int end = currentBranch + numTiles * fMaxChildren - SkMin32(remainder, + (fMaxChildren - fMinChildren) * numTiles); + if (end > branches->count()) { + end = branches->count(); + } - // Now we sort horizontal strips of rectangles by their x coords - SkTQSort(branches->begin() + begin, branches->begin() + end - 1, RectLessX()); + // Now we sort horizontal strips of rectangles by their x coords + SkTQSort(branches->begin() + begin, branches->begin() + end - 1, RectLessX()); + } for (int j = 0; j < numTiles && currentBranch < branches->count(); ++j) { int incrementBy = fMaxChildren; diff --git a/src/core/SkRTree.h b/src/core/SkRTree.h index 2d11f28a57..54421de14c 100644 --- a/src/core/SkRTree.h +++ b/src/core/SkRTree.h @@ -55,7 +55,8 @@ public: * can provide an optional aspect ratio parameter. This allows the bulk-load algorithm to create * better proportioned tiles of rectangles. */ - static SkRTree* Create(int minChildren, int maxChildren, SkScalar aspectRatio = 1); + static SkRTree* Create(int minChildren, int maxChildren, SkScalar aspectRatio = 1, + bool orderWhenBulkLoading = true); virtual ~SkRTree(); /** @@ -144,7 +145,7 @@ private: } }; - SkRTree(int minChildren, int maxChildren, SkScalar aspectRatio); + SkRTree(int minChildren, int maxChildren, SkScalar aspectRatio, bool orderWhenBulkLoading); /** * Recursively descend the tree to find an insertion position for 'branch', updates @@ -184,6 +185,7 @@ private: SkChunkAlloc fNodes; SkTDArray<Branch> fDeferredInserts; SkScalar fAspectRatio; + bool fSortWhenBulkLoading; Node* allocateNode(uint16_t level); |