Traverse layers in update order

bug:8540150

Layers now require traversal in update order, as it will be child
first, then parent for layer-in-layer

Fixes issue with deferred layer playback not flushing in order, and
thus child not painting before parent

Also fixes DisplayList to only be cleared after flush in deferred list

Change-Id: I2f284d00079cdb20798aeef6a1c94e823940db40
This commit is contained in:
Chris Craik
2013-04-04 14:46:24 -07:00
parent 599efc3aa3
commit 1206b9bba9
3 changed files with 7 additions and 8 deletions

View File

@@ -52,8 +52,6 @@ public:
kOpBatch_Count, // Add other batch ids before this
};
void clear();
bool isEmpty() { return mBatches.isEmpty(); }
/**
@@ -80,6 +78,8 @@ private:
*/
void resetBatchingState();
void clear();
void storeStateOpBarrier(OpenGLRenderer& renderer, StateOp* op);
void storeRestoreToCountBarrier(OpenGLRenderer& renderer, StateOp* op, int newSaveCount);

View File

@@ -167,7 +167,6 @@ void Layer::defer() {
displayList->defer(deferredState, 0);
deferredUpdateScheduled = false;
displayList = NULL;
}
void Layer::flush() {
@@ -182,7 +181,7 @@ void Layer::flush() {
renderer = NULL;
dirtyRect.setEmpty();
deferredList->clear();
displayList = NULL;
}
}

View File

@@ -571,8 +571,8 @@ void OpenGLRenderer::updateLayers() {
startMark("Defer Layer Updates");
}
// Note: it is very important to update the layers in reverse order
for (int i = count - 1; i >= 0; i--) {
// Note: it is very important to update the layers in order
for (int i = 0; i < count; i++) {
Layer* layer = mLayerUpdates.itemAt(i);
updateLayer(layer, false);
if (CC_UNLIKELY(mCaches.drawDeferDisabled)) {
@@ -594,8 +594,8 @@ void OpenGLRenderer::flushLayers() {
startMark("Apply Layer Updates");
char layerName[12];
// Note: it is very important to update the layers in reverse order
for (int i = count - 1; i >= 0; i--) {
// Note: it is very important to update the layers in order
for (int i = 0; i < count; i++) {
sprintf(layerName, "Layer #%d", i);
startMark(layerName);