diff options
author | Chris Craik <ccraik@google.com> | 2013-06-13 19:24:17 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-06-13 19:24:17 +0000 |
commit | b28f8c82d92b06e7eba3bcb5b5c2e9757597a7c9 (patch) | |
tree | 57b03f6b1579e1ee54b77c991a33dd9c501ac0cc | |
parent | 6fbb5553a5b2d7c19ea411ace9a46e18262698c4 (diff) | |
parent | f70119cd776f871a82c94be8522dce02e04c73a8 (diff) | |
download | frameworks_base-b28f8c82d92b06e7eba3bcb5b5c2e9757597a7c9.zip frameworks_base-b28f8c82d92b06e7eba3bcb5b5c2e9757597a7c9.tar.gz frameworks_base-b28f8c82d92b06e7eba3bcb5b5c2e9757597a7c9.tar.bz2 |
Merge "Reset batching state when overlap batch deletion occurs"
-rw-r--r-- | libs/hwui/DeferredDisplayList.cpp | 10 | ||||
-rw-r--r-- | libs/hwui/DeferredDisplayList.h | 2 |
2 files changed, 8 insertions, 4 deletions
diff --git a/libs/hwui/DeferredDisplayList.cpp b/libs/hwui/DeferredDisplayList.cpp index 6bb54a7..f19d610 100644 --- a/libs/hwui/DeferredDisplayList.cpp +++ b/libs/hwui/DeferredDisplayList.cpp @@ -471,7 +471,9 @@ void DeferredDisplayList::addDrawOp(OpenGLRenderer& renderer, DrawOp* op) { if (CC_LIKELY(mAvoidOverdraw) && mBatches.size() && deferInfo.opaqueOverBounds && op->state.mBounds.contains(mBounds)) { + // avoid overdraw by resetting drawing state + discarding drawing ops discardDrawingBatches(mBatches.size() - 1); + resetBatchingState(); } if (CC_UNLIKELY(renderer.getCaches().drawReorderDisabled)) { @@ -551,10 +553,11 @@ void DeferredDisplayList::addDrawOp(OpenGLRenderer& renderer, DrawOp* op) { } else { targetBatch = new DrawBatch(deferInfo); mBatchLookup[deferInfo.batchId] = targetBatch; - DEFER_LOGD("creating Batch %p, bid %x, at %d", - targetBatch, deferInfo.batchId, insertBatchIndex); } + DEFER_LOGD("creating %singBatch %p, bid %x, at %d", + deferInfo.mergeable ? "Merg" : "Draw", + targetBatch, deferInfo.batchId, insertBatchIndex); mBatches.insertAt(targetBatch, insertBatchIndex); } @@ -633,8 +636,9 @@ status_t DeferredDisplayList::flush(OpenGLRenderer& renderer, Rect& dirty) { return status; } -void DeferredDisplayList::discardDrawingBatches(unsigned int maxIndex) { +void DeferredDisplayList::discardDrawingBatches(const unsigned int maxIndex) { for (unsigned int i = mEarliestUnclearedIndex; i <= maxIndex; i++) { + // leave deferred state ops alone for simplicity (empty save restore pairs may now exist) if (mBatches[i] && mBatches[i]->purelyDrawBatch()) { DrawBatch* b = (DrawBatch*) mBatches[i]; delete mBatches[i]; diff --git a/libs/hwui/DeferredDisplayList.h b/libs/hwui/DeferredDisplayList.h index 7aa1672..33feb7e 100644 --- a/libs/hwui/DeferredDisplayList.h +++ b/libs/hwui/DeferredDisplayList.h @@ -100,7 +100,7 @@ private: int getStateOpDeferFlags() const; int getDrawOpDeferFlags() const; - void discardDrawingBatches(unsigned int maxIndex); + void discardDrawingBatches(const unsigned int maxIndex); // layer space bounds of rendering Rect mBounds; |