diff options
5 files changed, 82 insertions, 119 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index c71379b686..0137a7bc50 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -3218,10 +3218,6 @@ bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer, mFlinger->mTimeStats->setPostTime(layerId, mDrawingState.frameNumber, getName().c_str(), mOwnerUid, postTime, getGameMode()); - if (mFlinger->mLegacyFrontEndEnabled) { - recordLayerHistoryBufferUpdate(getLayerProps(), systemTime()); - } - setFrameTimelineVsyncForBufferTransaction(info, postTime); if (dequeueTime && *dequeueTime != 0) { diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 3a0d34992a..ceda1e537f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -531,8 +531,6 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI mLayerLifecycleManagerEnabled = base::GetBoolProperty("persist.debug.sf.enable_layer_lifecycle_manager"s, true); - mLegacyFrontEndEnabled = !mLayerLifecycleManagerEnabled || - base::GetBoolProperty("persist.debug.sf.enable_legacy_frontend"s, false); // These are set by the HWC implementation to indicate that they will use the workarounds. mIsHotplugErrViaNegVsync = @@ -2441,86 +2439,84 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, mustComposite |= mLayerLifecycleManager.getGlobalChanges().get() != 0; bool newDataLatched = false; - if (!mLegacyFrontEndEnabled) { - ATRACE_NAME("DisplayCallbackAndStatsUpdates"); - mustComposite |= applyTransactionsLocked(update.transactions, vsyncId); - traverseLegacyLayers([&](Layer* layer) { layer->commitTransaction(); }); - const nsecs_t latchTime = systemTime(); - bool unused = false; - - for (auto& layer : mLayerLifecycleManager.getLayers()) { - if (layer->changes.test(frontend::RequestedLayerState::Changes::Created) && - layer->bgColorLayer) { - sp<Layer> bgColorLayer = getFactory().createEffectLayer( - LayerCreationArgs(this, nullptr, layer->name, - ISurfaceComposerClient::eFXSurfaceEffect, LayerMetadata(), - std::make_optional(layer->id), true)); - mLegacyLayers[bgColorLayer->sequence] = bgColorLayer; - } - const bool willReleaseBufferOnLatch = layer->willReleaseBufferOnLatch(); - - auto it = mLegacyLayers.find(layer->id); - if (it == mLegacyLayers.end() && - layer->changes.test(frontend::RequestedLayerState::Changes::Destroyed)) { - // Layer handle was created and immediately destroyed. It was destroyed before it - // was added to the map. - continue; - } - - LLOG_ALWAYS_FATAL_WITH_TRACE_IF(it == mLegacyLayers.end(), - "Couldnt find layer object for %s", - layer->getDebugString().c_str()); - if (!layer->hasReadyFrame() && !willReleaseBufferOnLatch) { - if (!it->second->hasBuffer()) { - // The last latch time is used to classify a missed frame as buffer stuffing - // instead of a missed frame. This is used to identify scenarios where we - // could not latch a buffer or apply a transaction due to backpressure. - // We only update the latch time for buffer less layers here, the latch time - // is updated for buffer layers when the buffer is latched. - it->second->updateLastLatchTime(latchTime); - } - continue; - } + ATRACE_NAME("DisplayCallbackAndStatsUpdates"); + mustComposite |= applyTransactionsLocked(update.transactions, vsyncId); + traverseLegacyLayers([&](Layer* layer) { layer->commitTransaction(); }); + const nsecs_t latchTime = systemTime(); + bool unused = false; + + for (auto& layer : mLayerLifecycleManager.getLayers()) { + if (layer->changes.test(frontend::RequestedLayerState::Changes::Created) && + layer->bgColorLayer) { + sp<Layer> bgColorLayer = getFactory().createEffectLayer( + LayerCreationArgs(this, nullptr, layer->name, + ISurfaceComposerClient::eFXSurfaceEffect, LayerMetadata(), + std::make_optional(layer->id), true)); + mLegacyLayers[bgColorLayer->sequence] = bgColorLayer; + } + const bool willReleaseBufferOnLatch = layer->willReleaseBufferOnLatch(); + + auto it = mLegacyLayers.find(layer->id); + if (it == mLegacyLayers.end() && + layer->changes.test(frontend::RequestedLayerState::Changes::Destroyed)) { + // Layer handle was created and immediately destroyed. It was destroyed before it + // was added to the map. + continue; + } - const bool bgColorOnly = - !layer->externalTexture && (layer->bgColorLayerId != UNASSIGNED_LAYER_ID); - if (willReleaseBufferOnLatch) { - mLayersWithBuffersRemoved.emplace(it->second); + LLOG_ALWAYS_FATAL_WITH_TRACE_IF(it == mLegacyLayers.end(), + "Couldnt find layer object for %s", + layer->getDebugString().c_str()); + if (!layer->hasReadyFrame() && !willReleaseBufferOnLatch) { + if (!it->second->hasBuffer()) { + // The last latch time is used to classify a missed frame as buffer stuffing + // instead of a missed frame. This is used to identify scenarios where we + // could not latch a buffer or apply a transaction due to backpressure. + // We only update the latch time for buffer less layers here, the latch time + // is updated for buffer layers when the buffer is latched. + it->second->updateLastLatchTime(latchTime); } - it->second->latchBufferImpl(unused, latchTime, bgColorOnly); - newDataLatched = true; + continue; + } - mLayersWithQueuedFrames.emplace(it->second); - mLayersIdsWithQueuedFrames.emplace(it->second->sequence); + const bool bgColorOnly = + !layer->externalTexture && (layer->bgColorLayerId != UNASSIGNED_LAYER_ID); + if (willReleaseBufferOnLatch) { + mLayersWithBuffersRemoved.emplace(it->second); } + it->second->latchBufferImpl(unused, latchTime, bgColorOnly); + newDataLatched = true; - updateLayerHistory(latchTime); - mLayerSnapshotBuilder.forEachVisibleSnapshot([&](const frontend::LayerSnapshot& snapshot) { - if (mLayersIdsWithQueuedFrames.find(snapshot.path.id) == - mLayersIdsWithQueuedFrames.end()) - return; - Region visibleReg; - visibleReg.set(snapshot.transformedBoundsWithoutTransparentRegion); - invalidateLayerStack(snapshot.outputFilter, visibleReg); - }); + mLayersWithQueuedFrames.emplace(it->second); + mLayersIdsWithQueuedFrames.emplace(it->second->sequence); + } - for (auto& destroyedLayer : mLayerLifecycleManager.getDestroyedLayers()) { - mLegacyLayers.erase(destroyedLayer->id); - } + updateLayerHistory(latchTime); + mLayerSnapshotBuilder.forEachVisibleSnapshot([&](const frontend::LayerSnapshot& snapshot) { + if (mLayersIdsWithQueuedFrames.find(snapshot.path.id) == mLayersIdsWithQueuedFrames.end()) + return; + Region visibleReg; + visibleReg.set(snapshot.transformedBoundsWithoutTransparentRegion); + invalidateLayerStack(snapshot.outputFilter, visibleReg); + }); - { - ATRACE_NAME("LLM:commitChanges"); - mLayerLifecycleManager.commitChanges(); - } + for (auto& destroyedLayer : mLayerLifecycleManager.getDestroyedLayers()) { + mLegacyLayers.erase(destroyedLayer->id); + } - // enter boot animation on first buffer latch - if (CC_UNLIKELY(mBootStage == BootStage::BOOTLOADER && newDataLatched)) { - ALOGI("Enter boot animation"); - mBootStage = BootStage::BOOTANIMATION; - } + { + ATRACE_NAME("LLM:commitChanges"); + mLayerLifecycleManager.commitChanges(); + } + + // enter boot animation on first buffer latch + if (CC_UNLIKELY(mBootStage == BootStage::BOOTLOADER && newDataLatched)) { + ALOGI("Enter boot animation"); + mBootStage = BootStage::BOOTANIMATION; } + mustComposite |= (getTransactionFlags() & ~eTransactionFlushNeeded) || newDataLatched; - if (mustComposite && !mLegacyFrontEndEnabled) { + if (mustComposite) { commitTransactions(); } @@ -2622,12 +2618,7 @@ bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId, mScheduler->getPacesetterRefreshRate()); const bool flushTransactions = clearTransactionFlags(eTransactionFlushNeeded); - bool transactionsAreEmpty; - if (mLegacyFrontEndEnabled) { - mustComposite |= - updateLayerSnapshotsLegacy(vsyncId, pacesetterFrameTarget.frameBeginTime().ns(), - flushTransactions, transactionsAreEmpty); - } + bool transactionsAreEmpty = false; if (mLayerLifecycleManagerEnabled) { mustComposite |= updateLayerSnapshots(vsyncId, pacesetterFrameTarget.frameBeginTime().ns(), @@ -5259,16 +5250,9 @@ bool SurfaceFlinger::applyTransactionState(const FrameTimelineInfo& frameTimelin nsecs_t now = systemTime(); uint32_t clientStateFlags = 0; for (auto& resolvedState : states) { - if (mLegacyFrontEndEnabled) { - clientStateFlags |= - setClientStateLocked(frameTimelineInfo, resolvedState, desiredPresentTime, - isAutoTimestamp, postTime, transactionId); - - } else /*mLayerLifecycleManagerEnabled*/ { - clientStateFlags |= updateLayerCallbacksAndStats(frameTimelineInfo, resolvedState, - desiredPresentTime, isAutoTimestamp, - postTime, transactionId); - } + clientStateFlags |= + updateLayerCallbacksAndStats(frameTimelineInfo, resolvedState, desiredPresentTime, + isAutoTimestamp, postTime, transactionId); if (!mLayerLifecycleManagerEnabled) { if ((flags & eAnimation) && resolvedState.state.surface) { if (const auto layer = LayerHandle::getLayer(resolvedState.state.surface)) { @@ -5340,7 +5324,7 @@ bool SurfaceFlinger::applyAndCommitDisplayTransactionStatesLocked( } mFrontEndDisplayInfosChanged = mTransactionFlags & eDisplayTransactionNeeded; - if (mFrontEndDisplayInfosChanged && !mLegacyFrontEndEnabled) { + if (mFrontEndDisplayInfosChanged) { processDisplayChangesLocked(); mFrontEndDisplayInfos.clear(); for (const auto& [_, display] : mDisplays) { @@ -5983,11 +5967,6 @@ status_t SurfaceFlinger::mirrorDisplay(DisplayId displayId, const LayerCreationA return result; } - if (mLegacyFrontEndEnabled) { - std::scoped_lock<std::mutex> lock(mMirrorDisplayLock); - mMirrorDisplays.emplace_back(layerStack, outResult.handle, args.client); - } - setTransactionFlags(eTransactionFlushNeeded); return NO_ERROR; } @@ -6102,9 +6081,7 @@ void SurfaceFlinger::initializeDisplays() { std::vector<TransactionState> transactions; transactions.emplace_back(state); - if (mLegacyFrontEndEnabled) { - applyTransactions(transactions, VsyncId{0}); - } else { + { Mutex::Autolock lock(mStateLock); applyAndCommitDisplayTransactionStatesLocked(transactions); } @@ -6656,17 +6633,6 @@ perfetto::protos::LayersProto SurfaceFlinger::dumpDrawingStateProto(uint32_t tra } } - if (mLegacyFrontEndEnabled) { - perfetto::protos::LayersProto layersProto; - for (const sp<Layer>& layer : mDrawingState.layersSortedByZ) { - if (stackIdsToSkip.find(layer->getLayerStack().id) != stackIdsToSkip.end()) { - continue; - } - layer->writeToProto(layersProto, traceFlags); - } - return layersProto; - } - return LayerProtoFromSnapshotGenerator(mLayerSnapshotBuilder, mFrontEndDisplayInfos, mLegacyLayers, traceFlags) .generate(mLayerHierarchyBuilder.getHierarchy()); @@ -6915,10 +6881,6 @@ void SurfaceFlinger::dumpAll(const DumpArgs& args, const std::string& compositio } result.push_back('\n'); - if (mLegacyFrontEndEnabled) { - dumpHwcLayersMinidumpLockedLegacy(result); - } - { DumpArgs plannerArgs; plannerArgs.add(); // first argument is ignored @@ -9244,7 +9206,7 @@ void SurfaceFlinger::moveSnapshotsFromCompositionArgs( snapshots[i] = std::move(layerFE->mSnapshot); } } - if (mLegacyFrontEndEnabled && !mLayerLifecycleManagerEnabled) { + if (!mLayerLifecycleManagerEnabled) { for (auto [layer, layerFE] : layers) { layer->updateLayerSnapshot(std::move(layerFE->mSnapshot)); } @@ -9281,7 +9243,7 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit layers.emplace_back(legacyLayer.get(), layerFE.get()); }); } - if (mLegacyFrontEndEnabled && !mLayerLifecycleManagerEnabled) { + if (!mLayerLifecycleManagerEnabled) { auto moveSnapshots = [&layers, &refreshArgs, cursorOnly](Layer* layer) { if (const auto& layerFE = layer->getCompositionEngineLayerFE()) { if (cursorOnly && diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 83b092d831..a707a7aa82 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -1487,7 +1487,6 @@ private: bool mPowerHintSessionEnabled; bool mLayerLifecycleManagerEnabled = false; - bool mLegacyFrontEndEnabled = true; frontend::LayerLifecycleManager mLayerLifecycleManager GUARDED_BY(kMainThreadContext); frontend::LayerHierarchyBuilder mLayerHierarchyBuilder GUARDED_BY(kMainThreadContext); diff --git a/services/surfaceflinger/tests/unittests/SurfaceFlinger_ColorMatrixTest.cpp b/services/surfaceflinger/tests/unittests/SurfaceFlinger_ColorMatrixTest.cpp index f127213f0d..5852b1c45f 100644 --- a/services/surfaceflinger/tests/unittests/SurfaceFlinger_ColorMatrixTest.cpp +++ b/services/surfaceflinger/tests/unittests/SurfaceFlinger_ColorMatrixTest.cpp @@ -28,6 +28,7 @@ namespace android { class ColorMatrixTest : public CommitAndCompositeTest {}; TEST_F(ColorMatrixTest, colorMatrixChanged) { + mFlinger.enableLayerLifecycleManager(); EXPECT_COLOR_MATRIX_CHANGED(true, true); mFlinger.mutableTransactionFlags() |= eTransactionNeeded; @@ -45,6 +46,7 @@ TEST_F(ColorMatrixTest, colorMatrixChanged) { } TEST_F(ColorMatrixTest, colorMatrixChangedAfterDisplayTransaction) { + mFlinger.enableLayerLifecycleManager(); EXPECT_COLOR_MATRIX_CHANGED(true, true); mFlinger.mutableTransactionFlags() |= eTransactionNeeded; diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index 9547723db2..a73b7d062e 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -691,6 +691,10 @@ public: return mFlinger->initTransactionTraceWriter(); } + // Needed since mLayerLifecycleManagerEnabled is false by default and must + // be enabled for tests to go through the new front end path. + void enableLayerLifecycleManager() { mFlinger->mLayerLifecycleManagerEnabled = true; } + void notifyExpectedPresentIfRequired(PhysicalDisplayId displayId, Period vsyncPeriod, TimePoint expectedPresentTime, Fps frameInterval, std::optional<Period> timeoutOpt) { |