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

Commit 6f209e2d authored by Vishnu Nair's avatar Vishnu Nair
Browse files

[sf] Fix wakeup related to CE#needsAnotherUpdate

Layers track if they have a frame ready to be latched using
hasReadyFrame. Once the buffer is latched for a layer,
the states are cleared so hasReadyFrame is only true
if we have another buffer to be latched (not possible)
or if the auto refresh flag is set. In post composition,
this flag is checked to schedule a commit.

With the new frontend, we update the snapshot
once every commit. This means hasReadyFrame
should only track the auto refresh state.

Bug: 238781169
Test: atest android.graphics.cts.FrameRateOverrideTest#testAppBackpressure --rerun-until-failure with mixed gsi builds

Change-Id: I73fe6d69c5f34e4ce5d0efc6b7f39ae72c50b8aa
parent 04c9ef13
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -345,10 +345,9 @@ void LayerSnapshot::merge(const RequestedLayerState& requested, bool forceUpdate
    clientChanges = requested.what;
    changes = requested.changes;
    contentDirty = requested.what & layer_state_t::CONTENT_DIRTY;
    // TODO(b/238781169) scope down the changes to only buffer updates.
    hasReadyFrame = requested.hasReadyFrame();
    hasReadyFrame = requested.autoRefresh;
    sidebandStreamHasFrame = requested.hasSidebandStreamFrame();
    updateSurfaceDamage(requested, hasReadyFrame, forceFullDamage, surfaceDamage);
    updateSurfaceDamage(requested, requested.hasReadyFrame(), forceFullDamage, surfaceDamage);

    if (forceUpdate || requested.what & layer_state_t::eTransparentRegionChanged) {
        transparentRegionHint = requested.transparentRegion;
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ struct LayerSnapshot : public compositionengine::LayerFECompositionState {
    std::shared_ptr<renderengine::ExternalTexture> externalTexture;
    gui::LayerMetadata layerMetadata;
    gui::LayerMetadata relativeLayerMetadata;
    bool hasReadyFrame;
    bool hasReadyFrame; // used in post composition to check if there is another frame ready
    ui::Transform localTransformInverse;
    gui::WindowInfo inputInfo;
    ui::Transform localTransform;
+11 −9
Original line number Diff line number Diff line
@@ -2363,19 +2363,20 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs,
                mLayersWithBuffersRemoved.emplace(it->second);
            }
            it->second->latchBufferImpl(unused, latchTime, bgColorOnly);
            newDataLatched = true;
            mLayersWithQueuedFrames.emplace(it->second);
            mLayersIdsWithQueuedFrames.emplace(it->second->sequence);
        }

        for (auto& snapshot : mLayerSnapshotBuilder.getSnapshots()) {
            updateLayerHistory(*snapshot);
            if (!snapshot->hasReadyFrame) continue;
            newDataLatched = true;
            if (!snapshot->isVisible) break;

        mLayerSnapshotBuilder.forEachVisibleSnapshot([&](const frontend::LayerSnapshot& snapshot) {
            updateLayerHistory(snapshot);
            if (mLayersIdsWithQueuedFrames.find(snapshot.path.id) ==
                mLayersIdsWithQueuedFrames.end())
                return;
            Region visibleReg;
            visibleReg.set(snapshot->transformedBoundsWithoutTransparentRegion);
            invalidateLayerStack(snapshot->outputFilter, visibleReg);
        }
            visibleReg.set(snapshot.transformedBoundsWithoutTransparentRegion);
            invalidateLayerStack(snapshot.outputFilter, visibleReg);
        });

        for (auto& destroyedLayer : mLayerLifecycleManager.getDestroyedLayers()) {
            mLegacyLayers.erase(destroyedLayer->id);
@@ -2727,6 +2728,7 @@ CompositeResultsPerDisplay SurfaceFlinger::composite(
    mScheduler->modulateVsync({}, &VsyncModulator::onDisplayRefresh, hasGpuUseOrReuse);

    mLayersWithQueuedFrames.clear();
    mLayersIdsWithQueuedFrames.clear();
    if (mLayerTracingEnabled && mLayerTracing.flagIsSet(LayerTracing::TRACE_COMPOSITION)) {
        // This will block and should only be used for debugging.
        addToLayerTracing(mVisibleRegionsDirty, pacesetterTarget.frameBeginTime(), vsyncId);
+2 −0
Original line number Diff line number Diff line
@@ -1206,6 +1206,8 @@ private:
    // latched.
    std::unordered_set<sp<Layer>, SpHash<Layer>> mLayersWithQueuedFrames;
    std::unordered_set<sp<Layer>, SpHash<Layer>> mLayersWithBuffersRemoved;
    std::unordered_set<uint32_t> mLayersIdsWithQueuedFrames;

    // Tracks layers that need to update a display's dirty region.
    std::vector<sp<Layer>> mLayersPendingRefresh;
    // Sorted list of layers that were composed during previous frame. This is used to