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

Commit a02943f3 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

[sf] optimize snapshot updates

Modify the snapshot update logic so its easier to maintain. Instead of
walking the tree and updating all the snapshots, this cl introduces a
preliminary step of walking though all the requested changes and
updating the affected snapshots by merging the changes to the snapshot.
This is followed by walking down the tree and updating properties that
are dependent on the parent snapshots.

If the changes are confined to buffer updates, then the fast path avoids
walking down the tree.

Bug: 238781169
Test: presubmit

Change-Id: Ic9aa66c376bf7ea80e38b321dd08b8d0f69559a9
parent e371d683
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -270,9 +270,9 @@ struct layer_state_t {
            layer_state_t::eFrameRateChanged | layer_state_t::eFixedTransformHintChanged;

    // Changes affecting data sent to input.
    static constexpr uint64_t INPUT_CHANGES = layer_state_t::GEOMETRY_CHANGES |
            layer_state_t::HIERARCHY_CHANGES | layer_state_t::eInputInfoChanged |
            layer_state_t::eDropInputModeChanged | layer_state_t::eTrustedOverlayChanged;
    static constexpr uint64_t INPUT_CHANGES = layer_state_t::eInputInfoChanged |
            layer_state_t::eDropInputModeChanged | layer_state_t::eTrustedOverlayChanged |
            layer_state_t::eLayerStackChanged;

    // Changes that affect the visible region on a display.
    static constexpr uint64_t VISIBLE_REGION_CHANGES =
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

#define ATRACE_TAG ATRACE_TAG_GRAPHICS
#undef LOG_TAG
#define LOG_TAG "LayerHierarchy"
#define LOG_TAG "SurfaceFlinger"

#include "LayerHierarchy.h"
#include "LayerLog.h"
+4 −4
Original line number Diff line number Diff line
@@ -42,10 +42,10 @@ class LayerHierarchyBuilder;
class LayerHierarchy {
public:
    enum Variant : uint32_t {
        Attached,
        Detached,
        Relative,
        Mirror,
        Attached, // child of the parent
        Detached, // child of the parent but currently relative parented to another layer
        Relative, // relative child of the parent
        Mirror,   // mirrored from another layer
        ftl_first = Attached,
        ftl_last = Mirror,
    };
+23 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
#define ATRACE_TAG ATRACE_TAG_GRAPHICS

#undef LOG_TAG
#define LOG_TAG "LayerLifecycleManager"
#define LOG_TAG "SurfaceFlinger"

#include "LayerLifecycleManager.h"
#include "Client.h" // temporarily needed for LayerCreationArgs
@@ -51,6 +51,7 @@ void LayerLifecycleManager::addLayers(std::vector<std::unique_ptr<RequestedLayer
                             it->second.owner.getDebugString().c_str());
        }
        mAddedLayers.push_back(newLayer.get());
        mChangedLayers.push_back(newLayer.get());
        layer.parentId = linkLayer(layer.parentId, layer.id);
        layer.relativeParentId = linkLayer(layer.relativeParentId, layer.id);
        if (layer.layerStackToMirror != ui::INVALID_LAYER_STACK) {
@@ -202,6 +203,10 @@ void LayerLifecycleManager::applyTransactions(const std::vector<TransactionState
                continue;
            }

            if (layer->changes.get() == 0) {
                mChangedLayers.push_back(layer);
            }

            if (transaction.flags & ISurfaceComposer::eAnimation) {
                layer->changes |= RequestedLayerState::Changes::Animation;
            }
@@ -244,6 +249,7 @@ void LayerLifecycleManager::applyTransactions(const std::vector<TransactionState
                    bgColorLayer->what |= layer_state_t::eColorChanged |
                            layer_state_t::eDataspaceChanged | layer_state_t::eAlphaChanged;
                    bgColorLayer->changes |= RequestedLayerState::Changes::Content;
                    mChangedLayers.push_back(bgColorLayer);
                    mGlobalChanges |= RequestedLayerState::Changes::Content;
                }
            }
@@ -290,6 +296,7 @@ void LayerLifecycleManager::commitChanges() {
        }
    }
    mDestroyedLayers.clear();
    mChangedLayers.clear();
    mGlobalChanges.clear();
}

@@ -310,10 +317,25 @@ const std::vector<std::unique_ptr<RequestedLayerState>>& LayerLifecycleManager::
    return mDestroyedLayers;
}

const std::vector<RequestedLayerState*>& LayerLifecycleManager::getChangedLayers() const {
    return mChangedLayers;
}

const ftl::Flags<RequestedLayerState::Changes> LayerLifecycleManager::getGlobalChanges() const {
    return mGlobalChanges;
}

const RequestedLayerState* LayerLifecycleManager::getLayerFromId(uint32_t id) const {
    if (id == UNASSIGNED_LAYER_ID) {
        return nullptr;
    }
    auto it = mIdToLayer.find(id);
    if (it == mIdToLayer.end()) {
        return nullptr;
    }
    return &it->second.owner;
}

RequestedLayerState* LayerLifecycleManager::getLayerFromId(uint32_t id) {
    if (id == UNASSIGNED_LAYER_ID) {
        return nullptr;
+4 −0
Original line number Diff line number Diff line
@@ -76,7 +76,9 @@ public:
    void removeLifecycleListener(std::shared_ptr<ILifecycleListener>);
    const std::vector<std::unique_ptr<RequestedLayerState>>& getLayers() const;
    const std::vector<std::unique_ptr<RequestedLayerState>>& getDestroyedLayers() const;
    const std::vector<RequestedLayerState*>& getChangedLayers() const;
    const ftl::Flags<RequestedLayerState::Changes> getGlobalChanges() const;
    const RequestedLayerState* getLayerFromId(uint32_t) const;

private:
    friend class LayerLifecycleManagerTest;
@@ -111,6 +113,8 @@ private:
    // Keeps track of all the layers that were added in order. Changes will be cleared once
    // committed.
    std::vector<RequestedLayerState*> mAddedLayers;
    // Keeps track of new and layers with states changes since last commit.
    std::vector<RequestedLayerState*> mChangedLayers;
};

} // namespace android::surfaceflinger::frontend
Loading