Loading services/surfaceflinger/SurfaceFlinger.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -8185,7 +8185,7 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit }); } if (mLegacyFrontEndEnabled && !mLayerLifecycleManagerEnabled) { mDrawingState.traverseInZOrder([&refreshArgs, cursorOnly, &layers](Layer* layer) { auto moveSnapshots = [&layers, &refreshArgs, cursorOnly](Layer* layer) { if (const auto& layerFE = layer->getCompositionEngineLayerFE()) { if (cursorOnly && layer->getLayerSnapshot()->compositionType != Loading @@ -8196,7 +8196,22 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit refreshArgs.layers.push_back(layerFE); layers.emplace_back(layer, layerFE.get()); } }); }; if (cursorOnly || !mVisibleRegionsDirty) { // for hot path avoid traversals by walking though the previous composition list for (sp<Layer> layer : mPreviouslyComposedLayers) { moveSnapshots(layer.get()); } } else { mPreviouslyComposedLayers.clear(); mDrawingState.traverseInZOrder( [&moveSnapshots](Layer* layer) { moveSnapshots(layer); }); mPreviouslyComposedLayers.reserve(layers.size()); for (auto [layer, _] : layers) { mPreviouslyComposedLayers.push_back(sp<Layer>::fromExisting(layer)); } } } return layers; Loading services/surfaceflinger/SurfaceFlinger.h +5 −0 Original line number Diff line number Diff line Loading @@ -1204,6 +1204,11 @@ private: std::unordered_set<sp<Layer>, SpHash<Layer>> mLayersWithBuffersRemoved; // 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 // avoid an expensive traversal of the layer hierarchy when there are no // visible region changes. Because this is a list of strong pointers, this will // extend the life of the layer but this list is only updated in the main thread. std::vector<sp<Layer>> mPreviouslyComposedLayers; BootStage mBootStage = BootStage::BOOTLOADER; Loading services/surfaceflinger/tests/unittests/CompositionTest.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -680,6 +680,9 @@ struct SidebandLayerProperties : public BaseLayerProperties<SidebandLayerPropert NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM), false); test->mFlinger.setLayerSidebandStream(layer, stream); auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer); layerDrawingState.crop = Rect(0, 0, SidebandLayerProperties::HEIGHT, SidebandLayerProperties::WIDTH); } static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) { Loading Loading @@ -814,6 +817,7 @@ struct BaseLayerVariant { Mock::VerifyAndClear(test->mComposer); test->mFlinger.mutableDrawingState().layersSortedByZ.add(layer); test->mFlinger.mutableVisibleRegionsDirty() = true; } static void cleanupInjectedLayers(CompositionTest* test) { Loading @@ -822,6 +826,7 @@ struct BaseLayerVariant { test->mDisplay->getCompositionDisplay()->clearOutputLayers(); test->mFlinger.mutableDrawingState().layersSortedByZ.clear(); test->mFlinger.mutablePreviouslyComposedLayers().clear(); // Layer should be unregistered with scheduler. test->mFlinger.commit(); Loading services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -587,6 +587,7 @@ public: auto& mutablePhysicalDisplays() { return mFlinger->mPhysicalDisplays; } auto& mutableDrawingState() { return mFlinger->mDrawingState; } auto& mutableGeometryDirty() { return mFlinger->mGeometryDirty; } auto& mutableVisibleRegionsDirty() { return mFlinger->mVisibleRegionsDirty; } auto& mutableMainThreadId() { return mFlinger->mMainThreadId; } auto& mutablePendingHotplugEvents() { return mFlinger->mPendingHotplugEvents; } auto& mutableTexturePool() { return mFlinger->mTexturePool; } Loading @@ -598,6 +599,7 @@ public: auto& mutableHwcPhysicalDisplayIdMap() { return getHwComposer().mPhysicalDisplayIdMap; } auto& mutablePrimaryHwcDisplayId() { return getHwComposer().mPrimaryHwcDisplayId; } auto& mutableActiveDisplayId() { return mFlinger->mActiveDisplayId; } auto& mutablePreviouslyComposedLayers() { return mFlinger->mPreviouslyComposedLayers; } auto& mutableActiveDisplayRotationFlags() { return SurfaceFlinger::sActiveDisplayRotationFlags; Loading Loading
services/surfaceflinger/SurfaceFlinger.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -8185,7 +8185,7 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit }); } if (mLegacyFrontEndEnabled && !mLayerLifecycleManagerEnabled) { mDrawingState.traverseInZOrder([&refreshArgs, cursorOnly, &layers](Layer* layer) { auto moveSnapshots = [&layers, &refreshArgs, cursorOnly](Layer* layer) { if (const auto& layerFE = layer->getCompositionEngineLayerFE()) { if (cursorOnly && layer->getLayerSnapshot()->compositionType != Loading @@ -8196,7 +8196,22 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit refreshArgs.layers.push_back(layerFE); layers.emplace_back(layer, layerFE.get()); } }); }; if (cursorOnly || !mVisibleRegionsDirty) { // for hot path avoid traversals by walking though the previous composition list for (sp<Layer> layer : mPreviouslyComposedLayers) { moveSnapshots(layer.get()); } } else { mPreviouslyComposedLayers.clear(); mDrawingState.traverseInZOrder( [&moveSnapshots](Layer* layer) { moveSnapshots(layer); }); mPreviouslyComposedLayers.reserve(layers.size()); for (auto [layer, _] : layers) { mPreviouslyComposedLayers.push_back(sp<Layer>::fromExisting(layer)); } } } return layers; Loading
services/surfaceflinger/SurfaceFlinger.h +5 −0 Original line number Diff line number Diff line Loading @@ -1204,6 +1204,11 @@ private: std::unordered_set<sp<Layer>, SpHash<Layer>> mLayersWithBuffersRemoved; // 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 // avoid an expensive traversal of the layer hierarchy when there are no // visible region changes. Because this is a list of strong pointers, this will // extend the life of the layer but this list is only updated in the main thread. std::vector<sp<Layer>> mPreviouslyComposedLayers; BootStage mBootStage = BootStage::BOOTLOADER; Loading
services/surfaceflinger/tests/unittests/CompositionTest.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -680,6 +680,9 @@ struct SidebandLayerProperties : public BaseLayerProperties<SidebandLayerPropert NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM), false); test->mFlinger.setLayerSidebandStream(layer, stream); auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer); layerDrawingState.crop = Rect(0, 0, SidebandLayerProperties::HEIGHT, SidebandLayerProperties::WIDTH); } static void setupHwcSetSourceCropBufferCallExpectations(CompositionTest* test) { Loading Loading @@ -814,6 +817,7 @@ struct BaseLayerVariant { Mock::VerifyAndClear(test->mComposer); test->mFlinger.mutableDrawingState().layersSortedByZ.add(layer); test->mFlinger.mutableVisibleRegionsDirty() = true; } static void cleanupInjectedLayers(CompositionTest* test) { Loading @@ -822,6 +826,7 @@ struct BaseLayerVariant { test->mDisplay->getCompositionDisplay()->clearOutputLayers(); test->mFlinger.mutableDrawingState().layersSortedByZ.clear(); test->mFlinger.mutablePreviouslyComposedLayers().clear(); // Layer should be unregistered with scheduler. test->mFlinger.commit(); Loading
services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -587,6 +587,7 @@ public: auto& mutablePhysicalDisplays() { return mFlinger->mPhysicalDisplays; } auto& mutableDrawingState() { return mFlinger->mDrawingState; } auto& mutableGeometryDirty() { return mFlinger->mGeometryDirty; } auto& mutableVisibleRegionsDirty() { return mFlinger->mVisibleRegionsDirty; } auto& mutableMainThreadId() { return mFlinger->mMainThreadId; } auto& mutablePendingHotplugEvents() { return mFlinger->mPendingHotplugEvents; } auto& mutableTexturePool() { return mFlinger->mTexturePool; } Loading @@ -598,6 +599,7 @@ public: auto& mutableHwcPhysicalDisplayIdMap() { return getHwComposer().mPhysicalDisplayIdMap; } auto& mutablePrimaryHwcDisplayId() { return getHwComposer().mPrimaryHwcDisplayId; } auto& mutableActiveDisplayId() { return mFlinger->mActiveDisplayId; } auto& mutablePreviouslyComposedLayers() { return mFlinger->mPreviouslyComposedLayers; } auto& mutableActiveDisplayRotationFlags() { return SurfaceFlinger::sActiveDisplayRotationFlags; Loading