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

Commit 5ed0389c authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "SurfaceFlinger: Layer::getFrameRate() with relatives" into rvc-dev am: 8e46e756

Change-Id: I062eac5179a6da6d8c4e8390cd371136564edf07
parents c0fc357d 8e46e756
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -1140,8 +1140,7 @@ public:
            return err;
            return err;
        }
        }


        err = remote()->transact(BnSurfaceComposer::SET_FRAME_RATE, data, &reply,
        err = remote()->transact(BnSurfaceComposer::SET_FRAME_RATE, data, &reply);
                                 IBinder::FLAG_ONEWAY);
        if (err != NO_ERROR) {
        if (err != NO_ERROR) {
            ALOGE("setFrameRate: failed to transact: %s (%d)", strerror(-err), err);
            ALOGE("setFrameRate: failed to transact: %s (%d)", strerror(-err), err);
            return err;
            return err;
+75 −10
Original line number Original line Diff line number Diff line
@@ -116,6 +116,7 @@ Layer::Layer(const LayerCreationArgs& args)
    mCurrentState.frameRateSelectionPriority = PRIORITY_UNSET;
    mCurrentState.frameRateSelectionPriority = PRIORITY_UNSET;
    mCurrentState.metadata = args.metadata;
    mCurrentState.metadata = args.metadata;
    mCurrentState.shadowRadius = 0.f;
    mCurrentState.shadowRadius = 0.f;
    mCurrentState.treeHasFrameRateVote = false;


    // drawing state & current state are identical
    // drawing state & current state are identical
    mDrawingState = mCurrentState;
    mDrawingState = mCurrentState;
@@ -1334,6 +1335,44 @@ bool Layer::setShadowRadius(float shadowRadius) {
    return true;
    return true;
}
}


void Layer::updateTreeHasFrameRateVote() {
    const auto traverseTree = [&](const LayerVector::Visitor& visitor) {
        auto parent = getParent();
        while (parent) {
            visitor(parent.get());
            parent = parent->getParent();
        }

        traverse(LayerVector::StateSet::Current, visitor);
    };

    // update parents and children about the vote
    // First traverse the tree and count how many layers has votes
    int layersWithVote = 0;
    traverseTree([&layersWithVote](Layer* layer) {
        if (layer->mCurrentState.frameRate.rate > 0 ||
            layer->mCurrentState.frameRate.type == FrameRateCompatibility::NoVote) {
            layersWithVote++;
        }
    });

    // Now update the other layers
    bool transactionNeeded = false;
    traverseTree([layersWithVote, &transactionNeeded](Layer* layer) {
        if (layer->mCurrentState.treeHasFrameRateVote != layersWithVote > 0) {
            layer->mCurrentState.sequence++;
            layer->mCurrentState.treeHasFrameRateVote = layersWithVote > 0;
            layer->mCurrentState.modified = true;
            layer->setTransactionFlags(eTransactionNeeded);
            transactionNeeded = true;
        }
    });

    if (transactionNeeded) {
        mFlinger->setTransactionFlags(eTraversalNeeded);
    }
}

bool Layer::setFrameRate(FrameRate frameRate) {
bool Layer::setFrameRate(FrameRate frameRate) {
    if (!mFlinger->useFrameRateApi) {
    if (!mFlinger->useFrameRateApi) {
        return false;
        return false;
@@ -1345,12 +1384,26 @@ bool Layer::setFrameRate(FrameRate frameRate) {
    mCurrentState.sequence++;
    mCurrentState.sequence++;
    mCurrentState.frameRate = frameRate;
    mCurrentState.frameRate = frameRate;
    mCurrentState.modified = true;
    mCurrentState.modified = true;

    updateTreeHasFrameRateVote();

    setTransactionFlags(eTransactionNeeded);
    setTransactionFlags(eTransactionNeeded);
    return true;
    return true;
}
}


Layer::FrameRate Layer::getFrameRate() const {
Layer::FrameRate Layer::getFrameRateForLayerTree() const {
    return getDrawingState().frameRate;
    const auto frameRate = getDrawingState().frameRate;
    if (frameRate.rate > 0 || frameRate.type == FrameRateCompatibility::NoVote) {
        return frameRate;
    }

    // This layer doesn't have a frame rate. If one of its ancestors or successors
    // have a vote, return a NoVote for ancestors/successors to set the vote
    if (getDrawingState().treeHasFrameRateVote) {
        return {0, FrameRateCompatibility::NoVote};
    }

    return frameRate;
}
}


void Layer::deferTransactionUntil_legacy(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
void Layer::deferTransactionUntil_legacy(const sp<Layer>& barrierLayer, uint64_t frameNumber) {
@@ -1608,6 +1661,7 @@ void Layer::addChild(const sp<Layer>& layer) {


    mCurrentChildren.add(layer);
    mCurrentChildren.add(layer);
    layer->setParent(this);
    layer->setParent(this);
    updateTreeHasFrameRateVote();
}
}


ssize_t Layer::removeChild(const sp<Layer>& layer) {
ssize_t Layer::removeChild(const sp<Layer>& layer) {
@@ -1615,7 +1669,24 @@ ssize_t Layer::removeChild(const sp<Layer>& layer) {
    setTransactionFlags(eTransactionNeeded);
    setTransactionFlags(eTransactionNeeded);


    layer->setParent(nullptr);
    layer->setParent(nullptr);
    return mCurrentChildren.remove(layer);
    const auto removeResult = mCurrentChildren.remove(layer);

    updateTreeHasFrameRateVote();
    layer->updateTreeHasFrameRateVote();

    return removeResult;
}

void Layer::reparentChildren(const sp<Layer>& newParent) {
    if (attachChildren()) {
        setTransactionFlags(eTransactionNeeded);
    }

    for (const sp<Layer>& child : mCurrentChildren) {
        newParent->addChild(child);
    }
    mCurrentChildren.clear();
    updateTreeHasFrameRateVote();
}
}


bool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
bool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
@@ -1631,13 +1702,7 @@ bool Layer::reparentChildren(const sp<IBinder>& newParentHandle) {
        return false;
        return false;
    }
    }


    if (attachChildren()) {
    reparentChildren(newParent);
        setTransactionFlags(eTransactionNeeded);
    }
    for (const sp<Layer>& child : mCurrentChildren) {
        newParent->addChild(child);
    }
    mCurrentChildren.clear();


    return true;
    return true;
}
}
+9 −2
Original line number Original line Diff line number Diff line
@@ -259,6 +259,9 @@ public:
        int32_t frameRateSelectionPriority;
        int32_t frameRateSelectionPriority;


        FrameRate frameRate;
        FrameRate frameRate;

        // Indicates whether parents / children of this layer had set FrameRate
        bool treeHasFrameRateVote;
    };
    };


    explicit Layer(const LayerCreationArgs& args);
    explicit Layer(const LayerCreationArgs& args);
@@ -344,7 +347,8 @@ public:
    virtual void deferTransactionUntil_legacy(const sp<Layer>& barrierLayer, uint64_t frameNumber);
    virtual void deferTransactionUntil_legacy(const sp<Layer>& barrierLayer, uint64_t frameNumber);
    virtual bool setOverrideScalingMode(int32_t overrideScalingMode);
    virtual bool setOverrideScalingMode(int32_t overrideScalingMode);
    virtual bool setMetadata(const LayerMetadata& data);
    virtual bool setMetadata(const LayerMetadata& data);
    virtual bool reparentChildren(const sp<IBinder>& layer);
    bool reparentChildren(const sp<IBinder>& newParentHandle);
    void reparentChildren(const sp<Layer>& newParent);
    virtual void setChildrenDrawingParent(const sp<Layer>& layer);
    virtual void setChildrenDrawingParent(const sp<Layer>& layer);
    virtual bool reparent(const sp<IBinder>& newParentHandle);
    virtual bool reparent(const sp<IBinder>& newParentHandle);
    virtual bool detachChildren();
    virtual bool detachChildren();
@@ -801,7 +805,7 @@ public:
    Rect getCroppedBufferSize(const Layer::State& s) const;
    Rect getCroppedBufferSize(const Layer::State& s) const;


    bool setFrameRate(FrameRate frameRate);
    bool setFrameRate(FrameRate frameRate);
    virtual FrameRate getFrameRate() const;
    virtual FrameRate getFrameRateForLayerTree() const;


protected:
protected:
    // constant
    // constant
@@ -830,6 +834,7 @@ protected:
    // For unit tests
    // For unit tests
    friend class TestableSurfaceFlinger;
    friend class TestableSurfaceFlinger;
    friend class RefreshRateSelectionTest;
    friend class RefreshRateSelectionTest;
    friend class SetFrameRateTest;


    virtual void commitTransaction(const State& stateToCommit);
    virtual void commitTransaction(const State& stateToCommit);


@@ -1017,6 +1022,8 @@ private:
    LayerVector makeChildrenTraversalList(LayerVector::StateSet stateSet,
    LayerVector makeChildrenTraversalList(LayerVector::StateSet stateSet,
                                          const std::vector<Layer*>& layersInTree);
                                          const std::vector<Layer*>& layersInTree);


    void updateTreeHasFrameRateVote();

    // Cached properties computed from drawing state
    // Cached properties computed from drawing state
    // Effective transform taking into account parent transforms and any parent scaling.
    // Effective transform taking into account parent transforms and any parent scaling.
    ui::Transform mEffectiveTransform;
    ui::Transform mEffectiveTransform;
+2 −2
Original line number Original line Diff line number Diff line
@@ -39,7 +39,7 @@ namespace android::scheduler::impl {
namespace {
namespace {


bool isLayerActive(const Layer& layer, const LayerInfo& info, nsecs_t threshold) {
bool isLayerActive(const Layer& layer, const LayerInfo& info, nsecs_t threshold) {
    if (layer.getFrameRate().rate > 0) {
    if (layer.getFrameRateForLayerTree().rate > 0) {
        return layer.isVisible();
        return layer.isVisible();
    }
    }
    return layer.isVisible() && info.getLastUpdatedTime() >= threshold;
    return layer.isVisible() && info.getLastUpdatedTime() >= threshold;
@@ -109,7 +109,7 @@ LayerHistory::Summary LayerHistory::summarize(nsecs_t now) {
        // Only use the layer if the reference still exists.
        // Only use the layer if the reference still exists.
        if (layer || CC_UNLIKELY(mTraceEnabled)) {
        if (layer || CC_UNLIKELY(mTraceEnabled)) {
            // Check if frame rate was set on layer.
            // Check if frame rate was set on layer.
            const auto frameRate = layer->getFrameRate();
            const auto frameRate = layer->getFrameRateForLayerTree();
            if (frameRate.rate > 0.f) {
            if (frameRate.rate > 0.f) {
                const auto voteType = [&]() {
                const auto voteType = [&]() {
                    switch (frameRate.type) {
                    switch (frameRate.type) {
+2 −2
Original line number Original line Diff line number Diff line
@@ -40,7 +40,7 @@ namespace android::scheduler::impl {
namespace {
namespace {


bool isLayerActive(const Layer& layer, const LayerInfoV2& info, nsecs_t threshold) {
bool isLayerActive(const Layer& layer, const LayerInfoV2& info, nsecs_t threshold) {
    if (layer.getFrameRate().rate > 0) {
    if (layer.getFrameRateForLayerTree().rate > 0) {
        return layer.isVisible();
        return layer.isVisible();
    }
    }
    return layer.isVisible() && info.getLastUpdatedTime() >= threshold;
    return layer.isVisible() && info.getLastUpdatedTime() >= threshold;
@@ -166,7 +166,7 @@ void LayerHistoryV2::partitionLayers(nsecs_t now) {
        if (const auto layer = weak.promote(); layer && isLayerActive(*layer, *info, threshold)) {
        if (const auto layer = weak.promote(); layer && isLayerActive(*layer, *info, threshold)) {
            i++;
            i++;
            // Set layer vote if set
            // Set layer vote if set
            const auto frameRate = layer->getFrameRate();
            const auto frameRate = layer->getFrameRateForLayerTree();
            const auto voteType = [&]() {
            const auto voteType = [&]() {
                switch (frameRate.type) {
                switch (frameRate.type) {
                    case Layer::FrameRateCompatibility::Default:
                    case Layer::FrameRateCompatibility::Default:
Loading