summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2013-06-13 19:24:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-06-13 19:24:17 +0000
commitb28f8c82d92b06e7eba3bcb5b5c2e9757597a7c9 (patch)
tree57b03f6b1579e1ee54b77c991a33dd9c501ac0cc
parent6fbb5553a5b2d7c19ea411ace9a46e18262698c4 (diff)
parentf70119cd776f871a82c94be8522dce02e04c73a8 (diff)
downloadframeworks_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.cpp10
-rw-r--r--libs/hwui/DeferredDisplayList.h2
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;