Partial unclipped save layer support
Not yet implemented in renderer.
Change-Id: I491ec6e7886bfa313d1db71dd5981690d45b78a9
diff --git a/libs/hwui/OpReorderer.h b/libs/hwui/OpReorderer.h
index 429913f..b824d02 100644
--- a/libs/hwui/OpReorderer.h
+++ b/libs/hwui/OpReorderer.h
@@ -53,6 +53,8 @@
Shadow,
TextureLayer,
Functor,
+ CopyToLayer,
+ CopyFromLayer,
Count // must be last
};
@@ -91,6 +93,8 @@
void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers, MergedOpReceiver*) const;
+ void deferLayerClear(const Rect& dstRect);
+
bool empty() const {
return mBatches.empty();
}
@@ -107,7 +111,12 @@
OffscreenBuffer* offscreenBuffer;
const BeginLayerOp* beginLayerOp;
const RenderNode* renderNode;
+
+ // list of deferred CopyFromLayer ops, to be deferred upon encountering EndUnclippedLayerOps
+ std::vector<BakedOpState*> activeUnclippedSaveLayers;
private:
+ void flushLayerClears(LinearAllocator& allocator);
+
std::vector<BatchBase*> mBatches;
/**
@@ -119,6 +128,8 @@
// Maps batch ids to the most recent *non-merging* batch of that id
OpBatch* mBatchLookup[OpBatchType::Count] = { nullptr };
+
+ std::vector<Rect> mClearRects;
};
public:
@@ -147,7 +158,8 @@
*/
#define X(Type) \
[](void* renderer, const BakedOpState& state) { \
- StaticDispatcher::on##Type(*(static_cast<Renderer*>(renderer)), static_cast<const Type&>(*(state.op)), state); \
+ StaticDispatcher::on##Type(*(static_cast<Renderer*>(renderer)), \
+ static_cast<const Type&>(*(state.op)), state); \
},
static BakedOpReceiver unmergedReceivers[] = BUILD_RENDERABLE_OP_LUT(X);
#undef X
@@ -233,8 +245,7 @@
void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers);
SkPath* createFrameAllocatedPath() {
- mFrameAllocatedPaths.emplace_back(new SkPath);
- return mFrameAllocatedPaths.back().get();
+ return mAllocator.create<SkPath>();
}
void deferStrokeableOp(const RecordedOp& op, batchid_t batchId,
@@ -250,8 +261,6 @@
MAP_DEFERRABLE_OPS(X)
#undef X
- std::vector<std::unique_ptr<SkPath> > mFrameAllocatedPaths;
-
// List of every deferred layer's render state. Replayed in reverse order to render a frame.
std::vector<LayerReorderer> mLayerReorderers;