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;