diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-06-02 01:11:28 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-06-02 01:11:28 +0000 |
commit | 4f80b867b3433ddc16d416809c7e9cd5d6deb88b (patch) | |
tree | 507ee85cf915764d48de4b3fe8b4e6f0b2c1f52c | |
parent | 70522fe55cdba436e3f8db2b8b049c9a8b02fe3c (diff) | |
parent | 738df02be90749afa30316ff70ef0ed425ceb6f0 (diff) | |
download | native-4f80b867b3433ddc16d416809c7e9cd5d6deb88b.tar.gz |
Merge "Use correct StateSet for LayerVector compare." into pi-dev
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 10 | ||||
-rw-r--r-- | services/surfaceflinger/LayerVector.cpp | 25 | ||||
-rw-r--r-- | services/surfaceflinger/LayerVector.h | 13 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 2 |
4 files changed, 33 insertions, 17 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 83d08a2322..2595ec1a05 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -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; @@ -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() {} @@ -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) { @@ -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. diff --git a/services/surfaceflinger/LayerVector.cpp b/services/surfaceflinger/LayerVector.cpp index 47156c19d2..84945247a6 100644 --- a/services/surfaceflinger/LayerVector.cpp +++ b/services/surfaceflinger/LayerVector.cpp @@ -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; diff --git a/services/surfaceflinger/LayerVector.h b/services/surfaceflinger/LayerVector.h index a9adb4113a..88d7711bb8 100644 --- a/services/surfaceflinger/LayerVector.h +++ b/services/surfaceflinger/LayerVector.h @@ -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; }; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 062cb76960..8566b0387c 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -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. |