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)