Loading services/surfaceflinger/Layer.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -98,8 +98,9 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& n mQueueItems(), mLastFrameNumberReceived(0), mAutoRefresh(false), mFreezeGeometryUpdates(false) { mFreezeGeometryUpdates(false), mCurrentChildren(LayerVector::StateSet::Current), mDrawingChildren(LayerVector::StateSet::Drawing) { mCurrentCrop.makeInvalid(); uint32_t layerFlags = 0; Loading Loading @@ -137,7 +138,6 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& n CompositorTiming compositorTiming; flinger->getCompositorTiming(&compositorTiming); mFrameEventHistory.initializeCompositorTiming(compositorTiming); } void Layer::onFirstRef() {} Loading Loading @@ -1677,7 +1677,7 @@ __attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::mak return children; } LayerVector traverse; LayerVector traverse(stateSet); for (const wp<Layer>& weakRelative : state.zOrderRelatives) { sp<Layer> strongRelative = weakRelative.promote(); if (strongRelative != nullptr) { Loading Loading @@ -1775,7 +1775,7 @@ LayerVector Layer::makeChildrenTraversalList(LayerVector::StateSet stateSet, const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; const State& state = useDrawing ? mDrawingState : mCurrentState; LayerVector traverse; LayerVector traverse(stateSet); for (const wp<Layer>& weakRelative : state.zOrderRelatives) { sp<Layer> strongRelative = weakRelative.promote(); // Only add relative layers that are also descendents of the top most parent of the tree. Loading services/surfaceflinger/LayerVector.cpp +18 −7 Original line number Diff line number Diff line Loading @@ -19,26 +19,37 @@ namespace android { LayerVector::LayerVector() = default; LayerVector::LayerVector(const StateSet stateSet) : mStateSet(stateSet) {} LayerVector::LayerVector(const LayerVector& rhs) : SortedVector<sp<Layer>>(rhs) { } LayerVector::LayerVector(const LayerVector& rhs, const StateSet stateSet) : SortedVector<sp<Layer>>(rhs), mStateSet(stateSet) {} LayerVector::~LayerVector() = default; // This operator override is needed to prevent mStateSet from getting copied over. LayerVector& LayerVector::operator=(const LayerVector& rhs) { SortedVector::operator=(rhs); return *this; } int LayerVector::do_compare(const void* lhs, const void* rhs) const { // sort layers per layer-stack, then by z-order and finally by sequence const auto& l = *reinterpret_cast<const sp<Layer>*>(lhs); const auto& r = *reinterpret_cast<const sp<Layer>*>(rhs); uint32_t ls = l->getCurrentState().layerStack; uint32_t rs = r->getCurrentState().layerStack; const auto& lState = (mStateSet == StateSet::Current) ? l->getCurrentState() : l->getDrawingState(); const auto& rState = (mStateSet == StateSet::Current) ? r->getCurrentState() : r->getDrawingState(); uint32_t ls = lState.layerStack; uint32_t rs = rState.layerStack; if (ls != rs) return (ls > rs) ? 1 : -1; int32_t lz = l->getCurrentState().z; int32_t rz = r->getCurrentState().z; int32_t lz = lState.z; int32_t rz = rState.z; if (lz != rz) return (lz > rz) ? 1 : -1; Loading services/surfaceflinger/LayerVector.h +9 −4 Original line number Diff line number Diff line Loading @@ -32,22 +32,27 @@ class Layer; */ class LayerVector : public SortedVector<sp<Layer>> { public: LayerVector(); LayerVector(const LayerVector& rhs); ~LayerVector() override; enum class StateSet { Invalid, Current, Drawing, }; explicit LayerVector(const StateSet stateSet); LayerVector(const LayerVector& rhs, const StateSet stateSet); ~LayerVector() override; LayerVector& operator=(const LayerVector& rhs); // Sorts layer by layer-stack, Z order, and finally creation order (sequence). int do_compare(const void* lhs, const void* rhs) const override; using Visitor = std::function<void(Layer*)>; void traverseInReverseZOrder(StateSet stateSet, const Visitor& visitor) const; void traverseInZOrder(StateSet stateSet, const Visitor& visitor) const; private: const StateSet mStateSet; }; } Loading services/surfaceflinger/SurfaceFlinger.h +1 −1 Original line number Diff line number Diff line Loading @@ -369,7 +369,7 @@ private: class State { public: explicit State(LayerVector::StateSet set) : stateSet(set) {} explicit State(LayerVector::StateSet set) : stateSet(set), layersSortedByZ(set) {} State& operator=(const State& other) { // We explicitly don't copy stateSet so that, e.g., mDrawingState // always uses the Drawing StateSet. Loading Loading
services/surfaceflinger/Layer.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -98,8 +98,9 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& n mQueueItems(), mLastFrameNumberReceived(0), mAutoRefresh(false), mFreezeGeometryUpdates(false) { mFreezeGeometryUpdates(false), mCurrentChildren(LayerVector::StateSet::Current), mDrawingChildren(LayerVector::StateSet::Drawing) { mCurrentCrop.makeInvalid(); uint32_t layerFlags = 0; Loading Loading @@ -137,7 +138,6 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& n CompositorTiming compositorTiming; flinger->getCompositorTiming(&compositorTiming); mFrameEventHistory.initializeCompositorTiming(compositorTiming); } void Layer::onFirstRef() {} Loading Loading @@ -1677,7 +1677,7 @@ __attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::mak return children; } LayerVector traverse; LayerVector traverse(stateSet); for (const wp<Layer>& weakRelative : state.zOrderRelatives) { sp<Layer> strongRelative = weakRelative.promote(); if (strongRelative != nullptr) { Loading Loading @@ -1775,7 +1775,7 @@ LayerVector Layer::makeChildrenTraversalList(LayerVector::StateSet stateSet, const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren; const State& state = useDrawing ? mDrawingState : mCurrentState; LayerVector traverse; LayerVector traverse(stateSet); for (const wp<Layer>& weakRelative : state.zOrderRelatives) { sp<Layer> strongRelative = weakRelative.promote(); // Only add relative layers that are also descendents of the top most parent of the tree. Loading
services/surfaceflinger/LayerVector.cpp +18 −7 Original line number Diff line number Diff line Loading @@ -19,26 +19,37 @@ namespace android { LayerVector::LayerVector() = default; LayerVector::LayerVector(const StateSet stateSet) : mStateSet(stateSet) {} LayerVector::LayerVector(const LayerVector& rhs) : SortedVector<sp<Layer>>(rhs) { } LayerVector::LayerVector(const LayerVector& rhs, const StateSet stateSet) : SortedVector<sp<Layer>>(rhs), mStateSet(stateSet) {} LayerVector::~LayerVector() = default; // This operator override is needed to prevent mStateSet from getting copied over. LayerVector& LayerVector::operator=(const LayerVector& rhs) { SortedVector::operator=(rhs); return *this; } int LayerVector::do_compare(const void* lhs, const void* rhs) const { // sort layers per layer-stack, then by z-order and finally by sequence const auto& l = *reinterpret_cast<const sp<Layer>*>(lhs); const auto& r = *reinterpret_cast<const sp<Layer>*>(rhs); uint32_t ls = l->getCurrentState().layerStack; uint32_t rs = r->getCurrentState().layerStack; const auto& lState = (mStateSet == StateSet::Current) ? l->getCurrentState() : l->getDrawingState(); const auto& rState = (mStateSet == StateSet::Current) ? r->getCurrentState() : r->getDrawingState(); uint32_t ls = lState.layerStack; uint32_t rs = rState.layerStack; if (ls != rs) return (ls > rs) ? 1 : -1; int32_t lz = l->getCurrentState().z; int32_t rz = r->getCurrentState().z; int32_t lz = lState.z; int32_t rz = rState.z; if (lz != rz) return (lz > rz) ? 1 : -1; Loading
services/surfaceflinger/LayerVector.h +9 −4 Original line number Diff line number Diff line Loading @@ -32,22 +32,27 @@ class Layer; */ class LayerVector : public SortedVector<sp<Layer>> { public: LayerVector(); LayerVector(const LayerVector& rhs); ~LayerVector() override; enum class StateSet { Invalid, Current, Drawing, }; explicit LayerVector(const StateSet stateSet); LayerVector(const LayerVector& rhs, const StateSet stateSet); ~LayerVector() override; LayerVector& operator=(const LayerVector& rhs); // Sorts layer by layer-stack, Z order, and finally creation order (sequence). int do_compare(const void* lhs, const void* rhs) const override; using Visitor = std::function<void(Layer*)>; void traverseInReverseZOrder(StateSet stateSet, const Visitor& visitor) const; void traverseInZOrder(StateSet stateSet, const Visitor& visitor) const; private: const StateSet mStateSet; }; } Loading
services/surfaceflinger/SurfaceFlinger.h +1 −1 Original line number Diff line number Diff line Loading @@ -369,7 +369,7 @@ private: class State { public: explicit State(LayerVector::StateSet set) : stateSet(set) {} explicit State(LayerVector::StateSet set) : stateSet(set), layersSortedByZ(set) {} State& operator=(const State& other) { // We explicitly don't copy stateSet so that, e.g., mDrawingState // always uses the Drawing StateSet. Loading