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

Commit 6846ade9 authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: partially revert df59f474

Avoid a composition cycle when the FrameRate votes updates,
but keep the old behavior for all other cases.

Bug: 339759346
Change-Id: Ic0696ddeee6ed10f1e6efcc0dbe9589d638900cd
Test: android.platform.test.scenario.gmail.OpenCloseComposeEmailMicrobenchmark#testOpenCloseComposeEmail
parent dba72f56
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -279,9 +279,6 @@ struct layer_state_t {
            layer_state_t::eDropInputModeChanged | layer_state_t::eTrustedOverlayChanged |
            layer_state_t::eLayerStackChanged;

    // Changes requiring a composition pass.
    static constexpr uint64_t REQUIRES_COMPOSITION = layer_state_t::CONTENT_DIRTY;

    // Changes that affect the visible region on a display.
    static constexpr uint64_t VISIBLE_REGION_CHANGES = layer_state_t::GEOMETRY_CHANGES |
            layer_state_t::HIERARCHY_CHANGES | layer_state_t::eAlphaChanged;
+6 −12
Original line number Diff line number Diff line
@@ -41,8 +41,7 @@ void LayerLifecycleManager::addLayers(std::vector<std::unique_ptr<RequestedLayer
        return;
    }

    mGlobalChanges |= RequestedLayerState::Changes::Hierarchy |
            RequestedLayerState::Changes::RequiresComposition;
    mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
    for (auto& newLayer : newLayers) {
        RequestedLayerState& layer = *newLayer.get();
        auto [it, inserted] = mIdToLayer.try_emplace(layer.id, References{.owner = layer});
@@ -105,8 +104,7 @@ void LayerLifecycleManager::onHandlesDestroyed(
        if (!layer.canBeDestroyed()) {
            continue;
        }
        layer.changes |= RequestedLayerState::Changes::Destroyed |
                RequestedLayerState::Changes::RequiresComposition;
        layer.changes |= RequestedLayerState::Changes::Destroyed;
        layersToBeDestroyed.emplace_back(layerId);
    }

@@ -114,8 +112,7 @@ void LayerLifecycleManager::onHandlesDestroyed(
        return;
    }

    mGlobalChanges |= RequestedLayerState::Changes::Hierarchy |
            RequestedLayerState::Changes::RequiresComposition;
    mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
    for (size_t i = 0; i < layersToBeDestroyed.size(); i++) {
        uint32_t layerId = layersToBeDestroyed[i];
        auto it = mIdToLayer.find(layerId);
@@ -145,8 +142,7 @@ void LayerLifecycleManager::onHandlesDestroyed(
            if (linkedLayer->parentId == layer.id) {
                linkedLayer->parentId = UNASSIGNED_LAYER_ID;
                if (linkedLayer->canBeDestroyed()) {
                    linkedLayer->changes |= RequestedLayerState::Changes::Destroyed |
                            RequestedLayerState::Changes::RequiresComposition;
                    linkedLayer->changes |= RequestedLayerState::Changes::Destroyed;
                    layersToBeDestroyed.emplace_back(linkedLayer->id);
                }
            }
@@ -253,8 +249,7 @@ void LayerLifecycleManager::applyTransactions(const std::vector<TransactionState
                            layer_state_t::eDataspaceChanged | layer_state_t::eAlphaChanged;
                    bgColorLayer->changes |= RequestedLayerState::Changes::Content;
                    mChangedLayers.push_back(bgColorLayer);
                    mGlobalChanges |= RequestedLayerState::Changes::Content |
                            RequestedLayerState::Changes::RequiresComposition;
                    mGlobalChanges |= RequestedLayerState::Changes::Content;
                }
            }

@@ -412,8 +407,7 @@ void LayerLifecycleManager::fixRelativeZLoop(uint32_t relativeRootId) {
    layer.relativeParentId = unlinkLayer(layer.relativeParentId, layer.id);
    layer.changes |=
            RequestedLayerState::Changes::Hierarchy | RequestedLayerState::Changes::RelativeParent;
    mGlobalChanges |= RequestedLayerState::Changes::Hierarchy |
            RequestedLayerState::Changes::RequiresComposition;
    mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
}

// Some layers mirror the entire display stack. Since we don't have a single root layer per display
+2 −6
Original line number Diff line number Diff line
@@ -58,8 +58,7 @@ RequestedLayerState::RequestedLayerState(const LayerCreationArgs& args)
        parentId(args.parentId),
        layerIdToMirror(args.layerIdToMirror) {
    layerId = static_cast<int32_t>(args.sequence);
    changes |= RequestedLayerState::Changes::Created |
            RequestedLayerState::Changes::RequiresComposition;
    changes |= RequestedLayerState::Changes::Created;
    metadata.merge(args.metadata);
    changes |= RequestedLayerState::Changes::Metadata;
    handleAlive = true;
@@ -249,8 +248,7 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta

    if (hadSomethingToDraw != hasSomethingToDraw()) {
        changes |= RequestedLayerState::Changes::Visibility |
                RequestedLayerState::Changes::VisibleRegion |
                RequestedLayerState::Changes::RequiresComposition;
                RequestedLayerState::Changes::VisibleRegion;
    }
    if (clientChanges & layer_state_t::HIERARCHY_CHANGES)
        changes |= RequestedLayerState::Changes::Hierarchy;
@@ -260,8 +258,6 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta
        changes |= RequestedLayerState::Changes::Geometry;
    if (clientChanges & layer_state_t::AFFECTS_CHILDREN)
        changes |= RequestedLayerState::Changes::AffectsChildren;
    if (clientChanges & layer_state_t::REQUIRES_COMPOSITION)
        changes |= RequestedLayerState::Changes::RequiresComposition;
    if (clientChanges & layer_state_t::INPUT_CHANGES)
        changes |= RequestedLayerState::Changes::Input;
    if (clientChanges & layer_state_t::VISIBLE_REGION_CHANGES)
+8 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include "TransactionState.h"

namespace android::surfaceflinger::frontend {
using namespace ftl::flag_operators;

// Stores client requested states for a layer.
// This struct does not store any other states or states pertaining to
@@ -57,8 +58,14 @@ struct RequestedLayerState : layer_state_t {
        BufferSize = 1u << 18,
        GameMode = 1u << 19,
        BufferUsageFlags = 1u << 20,
        RequiresComposition = 1u << 21,
    };

    static constexpr ftl::Flags<Changes> kMustComposite = Changes::Created | Changes::Destroyed |
            Changes::Hierarchy | Changes::Geometry | Changes::Content | Changes::Input |
            Changes::Z | Changes::Mirror | Changes::Parent | Changes::RelativeParent |
            Changes::Metadata | Changes::Visibility | Changes::VisibleRegion | Changes::Buffer |
            Changes::SidebandStream | Changes::Animation | Changes::BufferSize | Changes::GameMode |
            Changes::BufferUsageFlags;
    static Rect reduce(const Rect& win, const Region& exclude);
    RequestedLayerState(const LayerCreationArgs&);
    void merge(const ResolvedComposerState&);
+2 −2
Original line number Diff line number Diff line
@@ -2447,8 +2447,8 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs,
    }
    outTransactionsAreEmpty = mLayerLifecycleManager.getGlobalChanges().get() == 0;
    if (FlagManager::getInstance().vrr_bugfix_24q4()) {
        mustComposite |= mLayerLifecycleManager.getGlobalChanges().test(
                frontend::RequestedLayerState::Changes::RequiresComposition);
        mustComposite |= mLayerLifecycleManager.getGlobalChanges().any(
                frontend::RequestedLayerState::kMustComposite);
    } else {
        mustComposite |= mLayerLifecycleManager.getGlobalChanges().get() != 0;
    }
Loading