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

Commit 211d3ec2 authored by Rob Carr's avatar Rob Carr Committed by Automerger Merge Worker
Browse files

Merge "Prevent HDRLayerInfoListener traversal from running on every frame"...

Merge "Prevent HDRLayerInfoListener traversal from running on every frame" into sc-dev am: f6e2ea73

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/15412093

Change-Id: If9b6939b1a32073eb0a56208f9584f69e0b9e5aa
parents a05554fb f6e2ea73
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -890,7 +890,11 @@ void BufferStateLayer::gatherBufferInfo() {
    mBufferInfo.mFenceTime = std::make_shared<FenceTime>(s.acquireFence);
    mBufferInfo.mFenceTime = std::make_shared<FenceTime>(s.acquireFence);
    mBufferInfo.mFence = s.acquireFence;
    mBufferInfo.mFence = s.acquireFence;
    mBufferInfo.mTransform = s.bufferTransform;
    mBufferInfo.mTransform = s.bufferTransform;
    auto lastDataspace = mBufferInfo.mDataspace;
    mBufferInfo.mDataspace = translateDataspace(s.dataspace);
    mBufferInfo.mDataspace = translateDataspace(s.dataspace);
    if (lastDataspace != mBufferInfo.mDataspace) {
        mFlinger->mSomeDataspaceChanged = true;
    }
    mBufferInfo.mCrop = computeBufferCrop(s);
    mBufferInfo.mCrop = computeBufferCrop(s);
    mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
    mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
    mBufferInfo.mSurfaceDamage = s.surfaceDamageRegion;
    mBufferInfo.mSurfaceDamage = s.surfaceDamageRegion;
+37 −23
Original line number Original line Diff line number Diff line
@@ -1643,6 +1643,9 @@ status_t SurfaceFlinger::addHdrLayerInfoListener(const sp<IBinder>& displayToken
        hdrInfoReporter = sp<HdrLayerInfoReporter>::make();
        hdrInfoReporter = sp<HdrLayerInfoReporter>::make();
    }
    }
    hdrInfoReporter->addListener(listener);
    hdrInfoReporter->addListener(listener);


    mAddingHDRLayerInfoListener = true;
    return OK;
    return OK;
}
}


@@ -2143,6 +2146,8 @@ void SurfaceFlinger::onMessageRefresh() {
            mTracing.notify("bufferLatched");
            mTracing.notify("bufferLatched");
        }
        }
    }
    }

    mVisibleRegionsWereDirtyThisFrame = mVisibleRegionsDirty; // Cache value for use in post-comp
    mVisibleRegionsDirty = false;
    mVisibleRegionsDirty = false;


    if (mCompositionEngine->needsAnotherUpdate()) {
    if (mCompositionEngine->needsAnotherUpdate()) {
@@ -2287,6 +2292,7 @@ void SurfaceFlinger::postComposition() {


    std::vector<std::pair<std::shared_ptr<compositionengine::Display>, sp<HdrLayerInfoReporter>>>
    std::vector<std::pair<std::shared_ptr<compositionengine::Display>, sp<HdrLayerInfoReporter>>>
            hdrInfoListeners;
            hdrInfoListeners;
    bool haveNewListeners = false;
    {
    {
        Mutex::Autolock lock(mStateLock);
        Mutex::Autolock lock(mStateLock);
        if (mFpsReporter) {
        if (mFpsReporter) {
@@ -2304,8 +2310,11 @@ void SurfaceFlinger::postComposition() {
                }
                }
            }
            }
        }
        }
        haveNewListeners = mAddingHDRLayerInfoListener; // grab this with state lock
        mAddingHDRLayerInfoListener = false;
    }
    }


    if (haveNewListeners || mSomeDataspaceChanged || mVisibleRegionsWereDirtyThisFrame) {
        for (auto& [compositionDisplay, listener] : hdrInfoListeners) {
        for (auto& [compositionDisplay, listener] : hdrInfoListeners) {
            HdrLayerInfoReporter::HdrLayerInfo info;
            HdrLayerInfoReporter::HdrLayerInfo info;
            int32_t maxArea = 0;
            int32_t maxArea = 0;
@@ -2318,7 +2327,8 @@ void SurfaceFlinger::postComposition() {
                                        transfer == Dataspace::TRANSFER_HLG);
                                        transfer == Dataspace::TRANSFER_HLG);


                    if (isHdr) {
                    if (isHdr) {
                    const auto* outputLayer = compositionDisplay->getOutputLayerForLayer(layerFe);
                        const auto* outputLayer =
                            compositionDisplay->getOutputLayerForLayer(layerFe);
                        if (outputLayer) {
                        if (outputLayer) {
                            info.numberOfHdrLayers++;
                            info.numberOfHdrLayers++;
                            const auto displayFrame = outputLayer->getState().displayFrame;
                            const auto displayFrame = outputLayer->getState().displayFrame;
@@ -2334,6 +2344,10 @@ void SurfaceFlinger::postComposition() {
            });
            });
            listener->dispatchHdrLayerInfo(info);
            listener->dispatchHdrLayerInfo(info);
        }
        }
    }

    mSomeDataspaceChanged = false;
    mVisibleRegionsWereDirtyThisFrame = false;


    mTransactionCallbackInvoker.addPresentFence(mPreviousPresentFences[0].fence);
    mTransactionCallbackInvoker.addPresentFence(mPreviousPresentFences[0].fence);
    mTransactionCallbackInvoker.sendCallbacks();
    mTransactionCallbackInvoker.sendCallbacks();
+8 −0
Original line number Original line Diff line number Diff line
@@ -1240,11 +1240,19 @@ private:
    State mDrawingState{LayerVector::StateSet::Drawing};
    State mDrawingState{LayerVector::StateSet::Drawing};
    bool mVisibleRegionsDirty = false;
    bool mVisibleRegionsDirty = false;


    // VisibleRegions dirty is already cleared by postComp, but we need to track it to prevent
    // extra work in the HDR layer info listener.
    bool mVisibleRegionsWereDirtyThisFrame = false;
    // Used to ensure we omit a callback when HDR layer info listener is newly added but the
    // scene hasn't changed
    bool mAddingHDRLayerInfoListener = false;

    // Set during transaction application stage to track if the input info or children
    // Set during transaction application stage to track if the input info or children
    // for a layer has changed.
    // for a layer has changed.
    // TODO: Also move visibleRegions over to a boolean system.
    // TODO: Also move visibleRegions over to a boolean system.
    bool mInputInfoChanged = false;
    bool mInputInfoChanged = false;
    bool mSomeChildrenChanged;
    bool mSomeChildrenChanged;
    bool mSomeDataspaceChanged = false;
    bool mForceTransactionDisplayChange = false;
    bool mForceTransactionDisplayChange = false;


    bool mGeometryInvalid = false;
    bool mGeometryInvalid = false;