Fix a couple crashes in the new reorderer
Also fixes the layer clear scissor logic in BakedOpRenderer, fixing a
flicker.
Change-Id: I61106a18938ea35e31f0a0b585b5743544245773
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp
index c1f19a3..42fb66f 100644
--- a/libs/hwui/BakedOpRenderer.cpp
+++ b/libs/hwui/BakedOpRenderer.cpp
@@ -161,7 +161,7 @@
}
void BakedOpRenderer::clearColorBuffer(const Rect& rect) {
- if (Rect(mRenderTarget.viewportWidth, mRenderTarget.viewportHeight).contains(rect)) {
+ if (rect.contains(Rect(mRenderTarget.viewportWidth, mRenderTarget.viewportHeight))) {
// Full viewport is being cleared - disable scissor
mRenderState.scissor().setEnabled(false);
} else {
diff --git a/libs/hwui/FrameReorderer.cpp b/libs/hwui/FrameReorderer.cpp
index f492c7d..e95b267 100644
--- a/libs/hwui/FrameReorderer.cpp
+++ b/libs/hwui/FrameReorderer.cpp
@@ -40,7 +40,8 @@
mLayerStack.reserve(layers.entries().size());
// Prepare to defer Fbo0
- mLayerReorderers.emplace_back(viewportWidth, viewportHeight, Rect(clip));
+ auto fbo0 = mAllocator.create<LayerReorderer>(viewportWidth, viewportHeight, Rect(clip));
+ mLayerReorderers.push_back(fbo0);
mLayerStack.push_back(0);
mCanvasState.initializeSaveStack(viewportWidth, viewportHeight,
clip.fLeft, clip.fTop, clip.fRight, clip.fBottom,
@@ -602,7 +603,9 @@
// create a new layer repaint, and push its index on the stack
mLayerStack.push_back(mLayerReorderers.size());
- mLayerReorderers.emplace_back(layerWidth, layerHeight, repaintRect, beginLayerOp, renderNode);
+ auto newFbo = mAllocator.create<LayerReorderer>(layerWidth, layerHeight,
+ repaintRect, beginLayerOp, renderNode);
+ mLayerReorderers.push_back(newFbo);
}
void FrameReorderer::restoreForLayer() {
@@ -671,7 +674,7 @@
beginLayerOp.localMatrix,
beginLayerOp.localClip,
beginLayerOp.paint,
- &mLayerReorderers[finishedLayerIndex].offscreenBuffer);
+ &(mLayerReorderers[finishedLayerIndex]->offscreenBuffer));
BakedOpState* bakedOpState = tryBakeOpState(*drawLayerOp);
if (bakedOpState) {
@@ -681,7 +684,7 @@
// Layer won't be drawn - delete its drawing batches to prevent it from doing any work
// TODO: need to prevent any render work from being done
// - create layerop earlier for reject purposes?
- mLayerReorderers[finishedLayerIndex].clear();
+ mLayerReorderers[finishedLayerIndex]->clear();
return;
}
}
diff --git a/libs/hwui/FrameReorderer.h b/libs/hwui/FrameReorderer.h
index 562e6a1..3bb8626 100644
--- a/libs/hwui/FrameReorderer.h
+++ b/libs/hwui/FrameReorderer.h
@@ -99,7 +99,7 @@
// Relay through layers in reverse order, since layers
// later in the list will be drawn by earlier ones
for (int i = mLayerReorderers.size() - 1; i >= 1; i--) {
- LayerReorderer& layer = mLayerReorderers[i];
+ LayerReorderer& layer = *(mLayerReorderers[i]);
if (layer.renderNode) {
// cached HW layer - can't skip layer if empty
renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect);
@@ -112,7 +112,7 @@
}
}
- const LayerReorderer& fbo0 = mLayerReorderers[0];
+ const LayerReorderer& fbo0 = *(mLayerReorderers[0]);
renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect);
fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
renderer.endFrame(fbo0.repaintRect);
@@ -120,7 +120,7 @@
void dump() const {
for (auto&& layer : mLayerReorderers) {
- layer.dump();
+ layer->dump();
}
}
@@ -143,7 +143,7 @@
const BeginLayerOp* beginLayerOp, RenderNode* renderNode);
void restoreForLayer();
- LayerReorderer& currentLayer() { return mLayerReorderers[mLayerStack.back()]; }
+ LayerReorderer& currentLayer() { return *(mLayerReorderers[mLayerStack.back()]); }
BakedOpState* tryBakeOpState(const RecordedOp& recordedOp) {
return BakedOpState::tryConstruct(mAllocator, *mCanvasState.writableSnapshot(), recordedOp);
@@ -183,7 +183,7 @@
#undef X
// List of every deferred layer's render state. Replayed in reverse order to render a frame.
- std::vector<LayerReorderer> mLayerReorderers;
+ std::vector<LayerReorderer*> mLayerReorderers;
/*
* Stack of indices within mLayerReorderers representing currently active layers. If drawing
diff --git a/libs/hwui/LayerReorderer.cpp b/libs/hwui/LayerReorderer.cpp
index 946897b..60f36be 100644
--- a/libs/hwui/LayerReorderer.cpp
+++ b/libs/hwui/LayerReorderer.cpp
@@ -269,8 +269,6 @@
verts, vertCount);
BakedOpState* bakedState = BakedOpState::directConstruct(allocator,
&viewportClip, bounds, *op);
-
-
deferUnmergeableOp(allocator, bakedState, OpBatchType::Vertices);
}
}
diff --git a/libs/hwui/LayerReorderer.h b/libs/hwui/LayerReorderer.h
index 83cda81..59fd4f8 100644
--- a/libs/hwui/LayerReorderer.h
+++ b/libs/hwui/LayerReorderer.h
@@ -18,6 +18,7 @@
#include "ClipArea.h"
#include "Rect.h"
+#include "utils/Macros.h"
#include <vector>
#include <unordered_map>
@@ -67,6 +68,8 @@
* for a single FBO/layer.
*/
class LayerReorderer {
+// Prevent copy/assign because users may stash pointer to offscreenBuffer and viewportClip
+PREVENT_COPY_AND_ASSIGN(LayerReorderer);
public:
// Create LayerReorderer for Fbo0
LayerReorderer(uint32_t width, uint32_t height, const Rect& repaintRect)