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

Commit 89f5d4eb authored by Alec Mouri's avatar Alec Mouri
Browse files

Front buffered layers vote for max

...because all known use-cases for beam racing want low latency which
implies clocking the display to max

Bug: 305997105
Test: libsurfaceflinger_unittest
Test: test app with front buffered layers + youtube pip stays at max
Change-Id: Ibe33d4b43ea4943874f104409e3bc247f00cae33
parent 14bebe0a
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -332,6 +332,14 @@ FloatRect LayerSnapshot::sourceBounds() const {
    return geomBufferSize.toFloatRect();
    return geomBufferSize.toFloatRect();
}
}


bool LayerSnapshot::isFrontBuffered() const {
    if (!externalTexture) {
        return false;
    }

    return externalTexture->getUsage() & AHARDWAREBUFFER_USAGE_FRONT_BUFFER;
}

Hwc2::IComposerClient::BlendMode LayerSnapshot::getBlendMode(
Hwc2::IComposerClient::BlendMode LayerSnapshot::getBlendMode(
        const RequestedLayerState& requested) const {
        const RequestedLayerState& requested) const {
    auto blendMode = Hwc2::IComposerClient::BlendMode::NONE;
    auto blendMode = Hwc2::IComposerClient::BlendMode::NONE;
+1 −0
Original line number Original line Diff line number Diff line
@@ -143,6 +143,7 @@ struct LayerSnapshot : public compositionengine::LayerFECompositionState {
    std::string getIsVisibleReason() const;
    std::string getIsVisibleReason() const;
    bool hasInputInfo() const;
    bool hasInputInfo() const;
    FloatRect sourceBounds() const;
    FloatRect sourceBounds() const;
    bool isFrontBuffered() const;
    Hwc2::IComposerClient::BlendMode getBlendMode(const RequestedLayerState& requested) const;
    Hwc2::IComposerClient::BlendMode getBlendMode(const RequestedLayerState& requested) const;
    friend std::ostream& operator<<(std::ostream& os, const LayerSnapshot& obj);
    friend std::ostream& operator<<(std::ostream& os, const LayerSnapshot& obj);
    void merge(const RequestedLayerState& requested, bool forceUpdate, bool displayChanges,
    void merge(const RequestedLayerState& requested, bool forceUpdate, bool displayChanges,
+8 −0
Original line number Original line Diff line number Diff line
@@ -4230,6 +4230,14 @@ ui::Dataspace Layer::getDataSpace() const {
    return hasBufferOrSidebandStream() ? mBufferInfo.mDataspace : mDrawingState.dataspace;
    return hasBufferOrSidebandStream() ? mBufferInfo.mDataspace : mDrawingState.dataspace;
}
}


bool Layer::isFrontBuffered() const {
    if (mBufferInfo.mBuffer == nullptr) {
        return false;
    }

    return mBufferInfo.mBuffer->getUsage() & AHARDWAREBUFFER_USAGE_FRONT_BUFFER;
}

ui::Dataspace Layer::translateDataspace(ui::Dataspace dataspace) {
ui::Dataspace Layer::translateDataspace(ui::Dataspace dataspace) {
    ui::Dataspace updatedDataspace = dataspace;
    ui::Dataspace updatedDataspace = dataspace;
    // translate legacy dataspaces to modern dataspaces
    // translate legacy dataspaces to modern dataspaces
+9 −8
Original line number Original line Diff line number Diff line
@@ -342,6 +342,8 @@ public:
    //
    //
    ui::Dataspace getDataSpace() const;
    ui::Dataspace getDataSpace() const;


    virtual bool isFrontBuffered() const;

    virtual sp<LayerFE> getCompositionEngineLayerFE() const;
    virtual sp<LayerFE> getCompositionEngineLayerFE() const;
    virtual sp<LayerFE> copyCompositionEngineLayerFE() const;
    virtual sp<LayerFE> copyCompositionEngineLayerFE() const;
    sp<LayerFE> getCompositionEngineLayerFE(const frontend::LayerHierarchy::TraversalPath&);
    sp<LayerFE> getCompositionEngineLayerFE(const frontend::LayerHierarchy::TraversalPath&);
@@ -915,14 +917,13 @@ public:
    void recordLayerHistoryBufferUpdate(const scheduler::LayerProps&, nsecs_t now);
    void recordLayerHistoryBufferUpdate(const scheduler::LayerProps&, nsecs_t now);
    void recordLayerHistoryAnimationTx(const scheduler::LayerProps&, nsecs_t now);
    void recordLayerHistoryAnimationTx(const scheduler::LayerProps&, nsecs_t now);
    auto getLayerProps() const {
    auto getLayerProps() const {
        return scheduler::LayerProps{
        return scheduler::LayerProps{.visible = isVisible(),
                .visible = isVisible(),
                                     .bounds = getBounds(),
                                     .bounds = getBounds(),
                                     .transform = getTransform(),
                                     .transform = getTransform(),
                                     .setFrameRateVote = getFrameRateForLayerTree(),
                                     .setFrameRateVote = getFrameRateForLayerTree(),
                                     .frameRateSelectionPriority = getFrameRateSelectionPriority(),
                                     .frameRateSelectionPriority = getFrameRateSelectionPriority(),
                                     .isSmallDirty = mSmallDirty,
                                     .isSmallDirty = mSmallDirty,
        };
                                     .isFrontBuffered = isFrontBuffered()};
    };
    };
    bool hasBuffer() const { return mBufferInfo.mBuffer != nullptr; }
    bool hasBuffer() const { return mBufferInfo.mBuffer != nullptr; }
    void setTransformHint(std::optional<ui::Transform::RotationFlags> transformHint) {
    void setTransformHint(std::optional<ui::Transform::RotationFlags> transformHint) {
+5 −0
Original line number Original line Diff line number Diff line
@@ -51,6 +51,11 @@ bool isLayerActive(const LayerInfo& info, nsecs_t threshold) {
        return true;
        return true;
    }
    }


    // Make all front buffered layers active
    if (FlagManager::getInstance().vrr_config() && info.isFrontBuffered() && info.isVisible()) {
        return true;
    }

    return info.isVisible() && info.getLastUpdatedTime() >= threshold;
    return info.isVisible() && info.getLastUpdatedTime() >= threshold;
}
}


Loading