diff options
| author | 2024-04-29 15:43:44 +0000 | |
|---|---|---|
| committer | 2024-04-29 15:43:44 +0000 | |
| commit | d50d517fb36c05ee2a877a3684fb1d3ff6e273c2 (patch) | |
| tree | 973411228ed58188fcf195431d1da503413fcfcd | |
| parent | b23408b06baa7a8b7cd711e17adf4b26ea52fd99 (diff) | |
| parent | ce6bde8dfa93038dd1063bae10b1f83eb1bc7e97 (diff) | |
Merge "Revert "[legacy sf flag] - Remove legacyFrontEndEnabled"" into main
5 files changed, 119 insertions, 82 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index c56567b286..e7d2a11e7b 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -3218,6 +3218,10 @@ 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 2b719fc29c..df226c94ff 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -531,6 +531,8 @@ 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 = @@ -2438,84 +2440,86 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, mustComposite |= mLayerLifecycleManager.getGlobalChanges().get() != 0; bool newDataLatched = false; - 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; - } + 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); + 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; } - continue; - } - const bool bgColorOnly = - !layer->externalTexture && (layer->bgColorLayerId != UNASSIGNED_LAYER_ID); - if (willReleaseBufferOnLatch) { - mLayersWithBuffersRemoved.emplace(it->second); - } - it->second->latchBufferImpl(unused, latchTime, bgColorOnly); - newDataLatched = true; + const bool bgColorOnly = + !layer->externalTexture && (layer->bgColorLayerId != UNASSIGNED_LAYER_ID); + if (willReleaseBufferOnLatch) { + mLayersWithBuffersRemoved.emplace(it->second); + } + it->second->latchBufferImpl(unused, latchTime, bgColorOnly); + newDataLatched = true; - mLayersWithQueuedFrames.emplace(it->second); - mLayersIdsWithQueuedFrames.emplace(it->second->sequence); - } + mLayersWithQueuedFrames.emplace(it->second); + mLayersIdsWithQueuedFrames.emplace(it->second->sequence); + } - 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); - }); + 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); + }); - for (auto& destroyedLayer : mLayerLifecycleManager.getDestroyedLayers()) { - mLegacyLayers.erase(destroyedLayer->id); - } + for (auto& destroyedLayer : mLayerLifecycleManager.getDestroyedLayers()) { + mLegacyLayers.erase(destroyedLayer->id); + } - { - ATRACE_NAME("LLM:commitChanges"); - mLayerLifecycleManager.commitChanges(); - } + { + 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; + // 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) { + if (mustComposite && !mLegacyFrontEndEnabled) { commitTransactions(); } @@ -2617,7 +2621,12 @@ bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId, mScheduler->getPacesetterRefreshRate()); const bool flushTransactions = clearTransactionFlags(eTransactionFlushNeeded); - bool transactionsAreEmpty = false; + bool transactionsAreEmpty; + if (mLegacyFrontEndEnabled) { + mustComposite |= + updateLayerSnapshotsLegacy(vsyncId, pacesetterFrameTarget.frameBeginTime().ns(), + flushTransactions, transactionsAreEmpty); + } if (mLayerLifecycleManagerEnabled) { mustComposite |= updateLayerSnapshots(vsyncId, pacesetterFrameTarget.frameBeginTime().ns(), @@ -5241,9 +5250,16 @@ bool SurfaceFlinger::applyTransactionState(const FrameTimelineInfo& frameTimelin nsecs_t now = systemTime(); uint32_t clientStateFlags = 0; for (auto& resolvedState : states) { - clientStateFlags |= - updateLayerCallbacksAndStats(frameTimelineInfo, resolvedState, desiredPresentTime, - isAutoTimestamp, postTime, transactionId); + if (mLegacyFrontEndEnabled) { + clientStateFlags |= + setClientStateLocked(frameTimelineInfo, resolvedState, desiredPresentTime, + isAutoTimestamp, postTime, transactionId); + + } else /*mLayerLifecycleManagerEnabled*/ { + 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)) { @@ -5315,7 +5331,7 @@ bool SurfaceFlinger::applyAndCommitDisplayTransactionStatesLocked( } mFrontEndDisplayInfosChanged = mTransactionFlags & eDisplayTransactionNeeded; - if (mFrontEndDisplayInfosChanged) { + if (mFrontEndDisplayInfosChanged && !mLegacyFrontEndEnabled) { processDisplayChangesLocked(); mFrontEndDisplayInfos.clear(); for (const auto& [_, display] : mDisplays) { @@ -5958,6 +5974,11 @@ 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; } @@ -6072,7 +6093,9 @@ void SurfaceFlinger::initializeDisplays() { std::vector<TransactionState> transactions; transactions.emplace_back(state); - { + if (mLegacyFrontEndEnabled) { + applyTransactions(transactions, VsyncId{0}); + } else { Mutex::Autolock lock(mStateLock); applyAndCommitDisplayTransactionStatesLocked(transactions); } @@ -6624,6 +6647,17 @@ 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()); @@ -6872,6 +6906,10 @@ 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 @@ -9197,7 +9235,7 @@ void SurfaceFlinger::moveSnapshotsFromCompositionArgs( snapshots[i] = std::move(layerFE->mSnapshot); } } - if (!mLayerLifecycleManagerEnabled) { + if (mLegacyFrontEndEnabled && !mLayerLifecycleManagerEnabled) { for (auto [layer, layerFE] : layers) { layer->updateLayerSnapshot(std::move(layerFE->mSnapshot)); } @@ -9234,7 +9272,7 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit layers.emplace_back(legacyLayer.get(), layerFE.get()); }); } - if (!mLayerLifecycleManagerEnabled) { + if (mLegacyFrontEndEnabled && !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 e04bf172df..44fa80607d 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -1486,6 +1486,7 @@ 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 5852b1c45f..f127213f0d 100644 --- a/services/surfaceflinger/tests/unittests/SurfaceFlinger_ColorMatrixTest.cpp +++ b/services/surfaceflinger/tests/unittests/SurfaceFlinger_ColorMatrixTest.cpp @@ -28,7 +28,6 @@ namespace android { class ColorMatrixTest : public CommitAndCompositeTest {}; TEST_F(ColorMatrixTest, colorMatrixChanged) { - mFlinger.enableLayerLifecycleManager(); EXPECT_COLOR_MATRIX_CHANGED(true, true); mFlinger.mutableTransactionFlags() |= eTransactionNeeded; @@ -46,7 +45,6 @@ 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 d40b2f8a49..85b17176fa 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -691,10 +691,6 @@ 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) { |