Create z reordering boundaries around dispatchDraw
bug:16012254
This means rendernodes with a Z will no longer be drawn at the end of
their parent's DisplayList, but at the end of the associated reorder
region (DisplayListData::Chunk).
Change-Id: Ia033fee9d9a4db567b2a8d5e90fc57a4d0a64544
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index b5c0159..7350082 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -57,6 +57,8 @@
DisplayListRenderer();
virtual ~DisplayListRenderer();
+ void insertReorderBarrier(bool enableReorder);
+
DisplayListData* finishRecording();
// ----------------------------------------------------------------------------
@@ -154,19 +156,27 @@
mHighContrastText = highContrastText;
}
private:
- void insertRestoreToCount();
- void insertTranslate();
+ enum DeferredBarrierType {
+ kBarrier_None,
+ kBarrier_InOrder,
+ kBarrier_OutOfOrder,
+ };
+
+ void flushRestoreToCount();
+ void flushTranslate();
+ void flushReorderBarrier();
LinearAllocator& alloc() { return mDisplayListData->allocator; }
// Each method returns final index of op
- int addStateOp(StateOp* op);
- int addDrawOp(DrawOp* op);
- int addOpInternal(DisplayListOp* op) {
- insertRestoreToCount();
- insertTranslate();
- return mDisplayListData->displayListOps.add(op);
- }
+ size_t addOpAndUpdateChunk(DisplayListOp* op);
+ // flushes any deferred operations, and appends the op
+ size_t flushAndAddOp(DisplayListOp* op);
+
+ size_t addStateOp(StateOp* op);
+ size_t addDrawOp(DrawOp* op);
+ size_t addRenderNodeOp(DrawRenderNodeOp* op);
+
template<class T>
inline const T* refBuffer(const T* srcBuffer, int32_t count) {
@@ -277,7 +287,8 @@
float mTranslateX;
float mTranslateY;
- bool mHasTranslate;
+ bool mHasDeferredTranslate;
+ DeferredBarrierType mDeferredBarrierType;
bool mHighContrastText;
int mRestoreSaveCount;