Loading libs/hwui/DisplayList.cpp +31 −33 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #define ATRACE_TAG ATRACE_TAG_VIEW #include <SkCanvas.h> #include <algorithm> #include <utils/Trace.h> Loading Loading @@ -504,7 +505,7 @@ void DisplayList::computeOrdering() { void DisplayList::computeOrderingImpl( DrawDisplayListOp* opState, KeyedVector<float, Vector<DrawDisplayListOp*> >* compositedChildrenOf3dRoot, Vector<ZDrawDisplayListOpPair>* compositedChildrenOf3dRoot, const mat4* transformFrom3dRoot) { // TODO: should avoid this calculation in most cases Loading @@ -512,19 +513,15 @@ void DisplayList::computeOrderingImpl( opState->mTransformFrom3dRoot.multiply(opState->mTransformFromParent); if (mTranslationZ != 0.0f) { // TODO: other signals, such as custom 4x4 matrix // composited layer, insert into current 3d root and flag for out of order draw // composited layer, flag for out of order draw... opState->mSkipInOrderDraw = true; // ... and insert into current 3d root, keyed with pivot z for later sorting Vector3 pivot(mPivotX, mPivotY, 0.0f); mat4 totalTransform(opState->mTransformFrom3dRoot); applyViewPropertyTransforms(totalTransform); totalTransform.mapPoint3d(pivot); const float key = pivot.z; if (compositedChildrenOf3dRoot->indexOfKey(key) < 0) { compositedChildrenOf3dRoot->add(key, Vector<DrawDisplayListOp*>()); } compositedChildrenOf3dRoot->editValueFor(key).push(opState); compositedChildrenOf3dRoot->add(ZDrawDisplayListOpPair(pivot.z, opState)); } else { // standard in order draw opState->mSkipInOrderDraw = false; Loading Loading @@ -599,8 +596,8 @@ template <class T> void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& renderer, T& handler, const int level) { if (m3dNodes.size() == 0 || (mode == kNegativeZChildren && m3dNodes.keyAt(0) > 0.0f) || (mode == kPositiveZChildren && m3dNodes.keyAt(m3dNodes.size() - 1) < 0.0f)) { (mode == kNegativeZChildren && m3dNodes[0].key > 0.0f) || (mode == kPositiveZChildren && m3dNodes[m3dNodes.size() - 1].key < 0.0f)) { // nothing to draw return; } Loading @@ -612,16 +609,14 @@ void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& ren int rootRestoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); for (size_t i = 0; i < m3dNodes.size(); i++) { const float zValue = m3dNodes.keyAt(i); const float zValue = m3dNodes[i].key; DrawDisplayListOp* op = m3dNodes[i].value; if (mode == kPositiveZChildren && zValue < 0.0f) continue; if (mode == kNegativeZChildren && zValue > 0.0f) break; const Vector<DrawDisplayListOp*>& nodesAtZ = m3dNodes[i]; for (size_t j = 0; j < nodesAtZ.size(); j++) { DrawDisplayListOp* op = nodesAtZ[j]; if (mode == kPositiveZChildren) { /* draw shadow on renderer with parent matrix applied, passing in the child's total matrix if (mode == kPositiveZChildren && zValue > 0.0f) { /* draw shadow with parent matrix applied, passing in the child's total matrix * * TODO: * -determine and pass background shape (and possibly drawable alpha) Loading @@ -630,7 +625,8 @@ void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& ren */ mat4 shadowMatrix(op->mTransformFrom3dRoot); op->mDisplayList->applyViewPropertyTransforms(shadowMatrix); DisplayListOp* shadowOp = new (alloc) DrawShadowOp(shadowMatrix, op->mDisplayList->mAlpha, DisplayListOp* shadowOp = new (alloc) DrawShadowOp(shadowMatrix, op->mDisplayList->mAlpha, op->mDisplayList->getWidth(), op->mDisplayList->getHeight()); handler(shadowOp, PROPERTY_SAVECOUNT, mClipToBounds); } Loading @@ -640,7 +636,6 @@ void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& ren handler(op, renderer.getSaveCount() - 1, mClipToBounds); op->mSkipInOrderDraw = true; } } handler(new (alloc) RestoreToCountOp(rootRestoreTo), PROPERTY_SAVECOUNT, mClipToBounds); } Loading Loading @@ -683,6 +678,9 @@ void DisplayList::iterate(OpenGLRenderer& renderer, T& handler, const int level) bool quickRejected = mClipToBounds && renderer.quickRejectConservative(0, 0, mWidth, mHeight); if (!quickRejected) { // Z sort 3d children (stable-ness makes z compare fall back to standard drawing order) std::stable_sort(m3dNodes.begin(), m3dNodes.end()); // for 3d root, draw children with negative z values iterate3dChildren(kNegativeZChildren, renderer, handler, level); Loading libs/hwui/DisplayList.h +6 −4 Original line number Diff line number Diff line Loading @@ -90,7 +90,8 @@ public: class DeferStateStruct : public PlaybackStateStruct { public: DeferStateStruct(DeferredDisplayList& deferredList, OpenGLRenderer& renderer, int replayFlags) : PlaybackStateStruct(renderer, replayFlags, &(deferredList.mAllocator)), mDeferredList(deferredList) {} : PlaybackStateStruct(renderer, replayFlags, &(deferredList.mAllocator)), mDeferredList(deferredList) {} DeferredDisplayList& mDeferredList; }; Loading Loading @@ -143,7 +144,6 @@ public: kReplayFlag_ClipChildren = 0x1 }; ANDROID_API size_t getSize(); ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList); ANDROID_API static void outputLogBuffer(int fd); Loading Loading @@ -501,6 +501,8 @@ public: } private: typedef key_value_pair_t<float, DrawDisplayListOp*> ZDrawDisplayListOpPair; enum ChildrenSelectMode { kNegativeZChildren, kPositiveZChildren Loading @@ -520,7 +522,7 @@ private: void applyViewPropertyTransforms(mat4& matrix); void computeOrderingImpl(DrawDisplayListOp* opState, KeyedVector<float, Vector<DrawDisplayListOp*> >* compositedChildrenOf3dRoot, Vector<ZDrawDisplayListOpPair>* compositedChildrenOf3dRoot, const mat4* transformFromRoot); template <class T> Loading Loading @@ -607,7 +609,7 @@ private: */ // for 3d roots, contains a z sorted list of all children items KeyedVector<float, Vector<DrawDisplayListOp*> > m3dNodes; // TODO: good data structure Vector<ZDrawDisplayListOpPair> m3dNodes; }; // class DisplayList }; // namespace uirenderer Loading Loading
libs/hwui/DisplayList.cpp +31 −33 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #define ATRACE_TAG ATRACE_TAG_VIEW #include <SkCanvas.h> #include <algorithm> #include <utils/Trace.h> Loading Loading @@ -504,7 +505,7 @@ void DisplayList::computeOrdering() { void DisplayList::computeOrderingImpl( DrawDisplayListOp* opState, KeyedVector<float, Vector<DrawDisplayListOp*> >* compositedChildrenOf3dRoot, Vector<ZDrawDisplayListOpPair>* compositedChildrenOf3dRoot, const mat4* transformFrom3dRoot) { // TODO: should avoid this calculation in most cases Loading @@ -512,19 +513,15 @@ void DisplayList::computeOrderingImpl( opState->mTransformFrom3dRoot.multiply(opState->mTransformFromParent); if (mTranslationZ != 0.0f) { // TODO: other signals, such as custom 4x4 matrix // composited layer, insert into current 3d root and flag for out of order draw // composited layer, flag for out of order draw... opState->mSkipInOrderDraw = true; // ... and insert into current 3d root, keyed with pivot z for later sorting Vector3 pivot(mPivotX, mPivotY, 0.0f); mat4 totalTransform(opState->mTransformFrom3dRoot); applyViewPropertyTransforms(totalTransform); totalTransform.mapPoint3d(pivot); const float key = pivot.z; if (compositedChildrenOf3dRoot->indexOfKey(key) < 0) { compositedChildrenOf3dRoot->add(key, Vector<DrawDisplayListOp*>()); } compositedChildrenOf3dRoot->editValueFor(key).push(opState); compositedChildrenOf3dRoot->add(ZDrawDisplayListOpPair(pivot.z, opState)); } else { // standard in order draw opState->mSkipInOrderDraw = false; Loading Loading @@ -599,8 +596,8 @@ template <class T> void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& renderer, T& handler, const int level) { if (m3dNodes.size() == 0 || (mode == kNegativeZChildren && m3dNodes.keyAt(0) > 0.0f) || (mode == kPositiveZChildren && m3dNodes.keyAt(m3dNodes.size() - 1) < 0.0f)) { (mode == kNegativeZChildren && m3dNodes[0].key > 0.0f) || (mode == kPositiveZChildren && m3dNodes[m3dNodes.size() - 1].key < 0.0f)) { // nothing to draw return; } Loading @@ -612,16 +609,14 @@ void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& ren int rootRestoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); for (size_t i = 0; i < m3dNodes.size(); i++) { const float zValue = m3dNodes.keyAt(i); const float zValue = m3dNodes[i].key; DrawDisplayListOp* op = m3dNodes[i].value; if (mode == kPositiveZChildren && zValue < 0.0f) continue; if (mode == kNegativeZChildren && zValue > 0.0f) break; const Vector<DrawDisplayListOp*>& nodesAtZ = m3dNodes[i]; for (size_t j = 0; j < nodesAtZ.size(); j++) { DrawDisplayListOp* op = nodesAtZ[j]; if (mode == kPositiveZChildren) { /* draw shadow on renderer with parent matrix applied, passing in the child's total matrix if (mode == kPositiveZChildren && zValue > 0.0f) { /* draw shadow with parent matrix applied, passing in the child's total matrix * * TODO: * -determine and pass background shape (and possibly drawable alpha) Loading @@ -630,7 +625,8 @@ void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& ren */ mat4 shadowMatrix(op->mTransformFrom3dRoot); op->mDisplayList->applyViewPropertyTransforms(shadowMatrix); DisplayListOp* shadowOp = new (alloc) DrawShadowOp(shadowMatrix, op->mDisplayList->mAlpha, DisplayListOp* shadowOp = new (alloc) DrawShadowOp(shadowMatrix, op->mDisplayList->mAlpha, op->mDisplayList->getWidth(), op->mDisplayList->getHeight()); handler(shadowOp, PROPERTY_SAVECOUNT, mClipToBounds); } Loading @@ -640,7 +636,6 @@ void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& ren handler(op, renderer.getSaveCount() - 1, mClipToBounds); op->mSkipInOrderDraw = true; } } handler(new (alloc) RestoreToCountOp(rootRestoreTo), PROPERTY_SAVECOUNT, mClipToBounds); } Loading Loading @@ -683,6 +678,9 @@ void DisplayList::iterate(OpenGLRenderer& renderer, T& handler, const int level) bool quickRejected = mClipToBounds && renderer.quickRejectConservative(0, 0, mWidth, mHeight); if (!quickRejected) { // Z sort 3d children (stable-ness makes z compare fall back to standard drawing order) std::stable_sort(m3dNodes.begin(), m3dNodes.end()); // for 3d root, draw children with negative z values iterate3dChildren(kNegativeZChildren, renderer, handler, level); Loading
libs/hwui/DisplayList.h +6 −4 Original line number Diff line number Diff line Loading @@ -90,7 +90,8 @@ public: class DeferStateStruct : public PlaybackStateStruct { public: DeferStateStruct(DeferredDisplayList& deferredList, OpenGLRenderer& renderer, int replayFlags) : PlaybackStateStruct(renderer, replayFlags, &(deferredList.mAllocator)), mDeferredList(deferredList) {} : PlaybackStateStruct(renderer, replayFlags, &(deferredList.mAllocator)), mDeferredList(deferredList) {} DeferredDisplayList& mDeferredList; }; Loading Loading @@ -143,7 +144,6 @@ public: kReplayFlag_ClipChildren = 0x1 }; ANDROID_API size_t getSize(); ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList); ANDROID_API static void outputLogBuffer(int fd); Loading Loading @@ -501,6 +501,8 @@ public: } private: typedef key_value_pair_t<float, DrawDisplayListOp*> ZDrawDisplayListOpPair; enum ChildrenSelectMode { kNegativeZChildren, kPositiveZChildren Loading @@ -520,7 +522,7 @@ private: void applyViewPropertyTransforms(mat4& matrix); void computeOrderingImpl(DrawDisplayListOp* opState, KeyedVector<float, Vector<DrawDisplayListOp*> >* compositedChildrenOf3dRoot, Vector<ZDrawDisplayListOpPair>* compositedChildrenOf3dRoot, const mat4* transformFromRoot); template <class T> Loading Loading @@ -607,7 +609,7 @@ private: */ // for 3d roots, contains a z sorted list of all children items KeyedVector<float, Vector<DrawDisplayListOp*> > m3dNodes; // TODO: good data structure Vector<ZDrawDisplayListOpPair> m3dNodes; }; // class DisplayList }; // namespace uirenderer Loading