Add initial benchmarks for CanvasOp

Also some minor other tweaks

Test: this
Change-Id: Idb8a5955839893ff000de87d4899fd130ede061c
diff --git a/libs/hwui/canvas/CanvasFrontend.cpp b/libs/hwui/canvas/CanvasFrontend.cpp
index 2c839b0..8f261c83 100644
--- a/libs/hwui/canvas/CanvasFrontend.cpp
+++ b/libs/hwui/canvas/CanvasFrontend.cpp
@@ -21,7 +21,14 @@
 namespace android::uirenderer {
 
 CanvasStateHelper::CanvasStateHelper(int width, int height) {
+    resetState(width, height);
+}
+
+void CanvasStateHelper::resetState(int width, int height) {
     mInitialBounds = SkIRect::MakeWH(width, height);
+    mSaveStack.clear();
+    mClipStack.clear();
+    mTransformStack.clear();
     mSaveStack.emplace_back();
     mClipStack.emplace_back().setRect(mInitialBounds);
     mTransformStack.emplace_back();
diff --git a/libs/hwui/canvas/CanvasFrontend.h b/libs/hwui/canvas/CanvasFrontend.h
index 5fccccb..d749d2f 100644
--- a/libs/hwui/canvas/CanvasFrontend.h
+++ b/libs/hwui/canvas/CanvasFrontend.h
@@ -57,9 +57,7 @@
     }
 
     bool internalSave(SaveEntry saveEntry);
-    bool internalSave(SaveFlags::Flags flags) {
-        return internalSave(flagsToSaveEntry(flags));
-    }
+
     void internalSaveLayer(const SkCanvas::SaveLayerRec& layerRec) {
         internalSave({
             .clip = true,
@@ -90,6 +88,8 @@
         return mClipStack[mCurrentClipIndex];
     }
 
+    void resetState(int width, int height);
+
 public:
     int saveCount() const { return mSaveStack.size(); }
 
@@ -186,14 +186,26 @@
         submit(std::move(op));
     }
 
-    const CanvasOpReceiver& receiver() const { return mReceiver; }
+    const CanvasOpReceiver& receiver() const { return *mReceiver; }
+
+    CanvasOpReceiver finish() {
+        auto ret = std::move(mReceiver.value());
+        mReceiver.reset();
+        return std::move(ret);
+    }
+
+    template<class... Args>
+    void reset(int newWidth, int newHeight, Args&&... args) {
+        resetState(newWidth, newHeight);
+        mReceiver.emplace(std::forward<Args>(args)...);
+    }
 
 private:
-    CanvasOpReceiver mReceiver;
+    std::optional<CanvasOpReceiver> mReceiver;
 
     template <CanvasOpType T>
     void submit(CanvasOp<T>&& op) {
-        mReceiver.push_container(CanvasOpContainer(std::move(op), transform()));
+        mReceiver->push_container(CanvasOpContainer(std::move(op), transform()));
     }
 };
 
diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h
index b499733..e2c5eaa 100644
--- a/libs/hwui/canvas/CanvasOps.h
+++ b/libs/hwui/canvas/CanvasOps.h
@@ -277,7 +277,7 @@
 template<>
 struct CanvasOp<CanvasOpType::DrawImage> {
 
-    CanvasOp<CanvasOpType::DrawImageRect>(
+    CanvasOp(
         const sk_sp<Bitmap>& bitmap,
         float left,
         float top,
@@ -303,7 +303,7 @@
 template<>
 struct CanvasOp<CanvasOpType::DrawImageRect> {
 
-    CanvasOp<CanvasOpType::DrawImageRect>(
+    CanvasOp(
         const sk_sp<Bitmap>& bitmap,
         SkRect src,
         SkRect dst,
@@ -334,7 +334,7 @@
 template<>
 struct CanvasOp<CanvasOpType::DrawImageLattice> {
 
-    CanvasOp<CanvasOpType::DrawImageLattice>(
+    CanvasOp(
         const sk_sp<Bitmap>& bitmap,
         SkRect dst,
         SkCanvas::Lattice lattice,
diff --git a/libs/hwui/canvas/OpBuffer.h b/libs/hwui/canvas/OpBuffer.h
index 98e385f..6dc29d9 100644
--- a/libs/hwui/canvas/OpBuffer.h
+++ b/libs/hwui/canvas/OpBuffer.h
@@ -60,9 +60,8 @@
         return (size + (Alignment - 1)) & -Alignment;
     }
 
-    static constexpr auto STARTING_SIZE = PadAlign(sizeof(BufferHeader));
-
 public:
+    static constexpr auto STARTING_SIZE = PadAlign(sizeof(BufferHeader));
     using ItemHeader = OpBufferItemHeader<ItemTypes>;
 
     OpBuffer() = default;