Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a5cd067 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Use correct StateSet for LayerVector compare."

parents 9205fd7d fd462615
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -94,6 +94,8 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& n
        mLastFrameNumberReceived(0),
        mLastFrameNumberReceived(0),
        mAutoRefresh(false),
        mAutoRefresh(false),
        mFreezeGeometryUpdates(false),
        mFreezeGeometryUpdates(false),
        mCurrentChildren(LayerVector::StateSet::Current),
        mDrawingChildren(LayerVector::StateSet::Drawing),
        mBE{this, name.string()} {
        mBE{this, name.string()} {


    mCurrentCrop.makeInvalid();
    mCurrentCrop.makeInvalid();
@@ -133,7 +135,6 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& n
    CompositorTiming compositorTiming;
    CompositorTiming compositorTiming;
    flinger->getCompositorTiming(&compositorTiming);
    flinger->getCompositorTiming(&compositorTiming);
    mFrameEventHistory.initializeCompositorTiming(compositorTiming);
    mFrameEventHistory.initializeCompositorTiming(compositorTiming);

}
}


void Layer::onFirstRef() {}
void Layer::onFirstRef() {}
@@ -1672,7 +1673,7 @@ __attribute__((no_sanitize("unsigned-integer-overflow"))) LayerVector Layer::mak
        return children;
        return children;
    }
    }


    LayerVector traverse;
    LayerVector traverse(stateSet);
    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
        sp<Layer> strongRelative = weakRelative.promote();
        sp<Layer> strongRelative = weakRelative.promote();
        if (strongRelative != nullptr) {
        if (strongRelative != nullptr) {
@@ -1770,7 +1771,7 @@ LayerVector Layer::makeChildrenTraversalList(LayerVector::StateSet stateSet,
    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
    const LayerVector& children = useDrawing ? mDrawingChildren : mCurrentChildren;
    const State& state = useDrawing ? mDrawingState : mCurrentState;
    const State& state = useDrawing ? mDrawingState : mCurrentState;


    LayerVector traverse;
    LayerVector traverse(stateSet);
    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
    for (const wp<Layer>& weakRelative : state.zOrderRelatives) {
        sp<Layer> strongRelative = weakRelative.promote();
        sp<Layer> strongRelative = weakRelative.promote();
        // Only add relative layers that are also descendents of the top most parent of the tree.
        // Only add relative layers that are also descendents of the top most parent of the tree.
+18 −7
Original line number Original line Diff line number Diff line
@@ -19,26 +19,37 @@


namespace android {
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;
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
int LayerVector::do_compare(const void* lhs, const void* rhs) const
{
{
    // sort layers per layer-stack, then by z-order and finally by sequence
    // sort layers per layer-stack, then by z-order and finally by sequence
    const auto& l = *reinterpret_cast<const sp<Layer>*>(lhs);
    const auto& l = *reinterpret_cast<const sp<Layer>*>(lhs);
    const auto& r = *reinterpret_cast<const sp<Layer>*>(rhs);
    const auto& r = *reinterpret_cast<const sp<Layer>*>(rhs);


    uint32_t ls = l->getCurrentState().layerStack;
    const auto& lState =
    uint32_t rs = r->getCurrentState().layerStack;
            (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)
    if (ls != rs)
        return (ls > rs) ? 1 : -1;
        return (ls > rs) ? 1 : -1;


    int32_t lz = l->getCurrentState().z;
    int32_t lz = lState.z;
    int32_t rz = r->getCurrentState().z;
    int32_t rz = rState.z;
    if (lz != rz)
    if (lz != rz)
        return (lz > rz) ? 1 : -1;
        return (lz > rz) ? 1 : -1;


+9 −4
Original line number Original line Diff line number Diff line
@@ -32,22 +32,27 @@ class Layer;
 */
 */
class LayerVector : public SortedVector<sp<Layer>> {
class LayerVector : public SortedVector<sp<Layer>> {
public:
public:
    LayerVector();
    LayerVector(const LayerVector& rhs);
    ~LayerVector() override;

    enum class StateSet {
    enum class StateSet {
        Invalid,
        Invalid,
        Current,
        Current,
        Drawing,
        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).
    // Sorts layer by layer-stack, Z order, and finally creation order (sequence).
    int do_compare(const void* lhs, const void* rhs) const override;
    int do_compare(const void* lhs, const void* rhs) const override;


    using Visitor = std::function<void(Layer*)>;
    using Visitor = std::function<void(Layer*)>;
    void traverseInReverseZOrder(StateSet stateSet, const Visitor& visitor) const;
    void traverseInReverseZOrder(StateSet stateSet, const Visitor& visitor) const;
    void traverseInZOrder(StateSet stateSet, const Visitor& visitor) const;
    void traverseInZOrder(StateSet stateSet, const Visitor& visitor) const;

private:
    const StateSet mStateSet;
};
};
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -371,7 +371,7 @@ private:


    class State {
    class State {
    public:
    public:
        explicit State(LayerVector::StateSet set) : stateSet(set) {}
        explicit State(LayerVector::StateSet set) : stateSet(set), layersSortedByZ(set) {}
        State& operator=(const State& other) {
        State& operator=(const State& other) {
            // We explicitly don't copy stateSet so that, e.g., mDrawingState
            // We explicitly don't copy stateSet so that, e.g., mDrawingState
            // always uses the Drawing StateSet.
            // always uses the Drawing StateSet.