diff options
4 files changed, 68 insertions, 34 deletions
diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp index c7f9aa7b42..4c722e5485 100644 --- a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp +++ b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp @@ -296,6 +296,26 @@ bool needsInputInfo(const LayerSnapshot& snapshot, const RequestedLayerState& re gui::WindowInfo::InputConfig::NO_INPUT_CHANNEL); } +void updateMetadata(LayerSnapshot& snapshot, const RequestedLayerState& requested, + const LayerSnapshotBuilder::Args& args) { + snapshot.metadata.clear(); + for (const auto& [key, mandatory] : args.supportedLayerGenericMetadata) { + auto compatIter = args.genericLayerMetadataKeyMap.find(key); + if (compatIter == std::end(args.genericLayerMetadataKeyMap)) { + continue; + } + const uint32_t id = compatIter->second; + auto it = requested.metadata.mMap.find(id); + if (it == std::end(requested.metadata.mMap)) { + continue; + } + + snapshot.metadata.emplace(key, + compositionengine::GenericLayerMetadataEntry{mandatory, + it->second}); + } +} + void clearChanges(LayerSnapshot& snapshot) { snapshot.changes.clear(); snapshot.contentDirty = false; @@ -744,6 +764,10 @@ void LayerSnapshotBuilder::updateSnapshot(LayerSnapshot& snapshot, const Args& a : parentSnapshot.frameRate; } + if (forceUpdate || requested.what & layer_state_t::eMetadataChanged) { + updateMetadata(snapshot, requested, args); + } + if (forceUpdate || requested.changes.get() != 0) { snapshot.compositionType = requested.getCompositionType(); snapshot.dimmingEnabled = requested.dimmingEnabled; @@ -787,12 +811,10 @@ void LayerSnapshotBuilder::updateSnapshot(LayerSnapshot& snapshot, const Args& a } snapshot.forceClientComposition = snapshot.isHdrY410 || snapshot.shadowSettings.length > 0 || requested.blurRegions.size() > 0 || snapshot.stretchEffect.hasEffect(); - snapshot.isOpaque = snapshot.isContentOpaque() && !snapshot.roundedCorner.hasRoundedCorners() && + snapshot.contentOpaque = snapshot.isContentOpaque(); + snapshot.isOpaque = snapshot.contentOpaque && !snapshot.roundedCorner.hasRoundedCorners() && snapshot.color.a == 1.f; snapshot.blendMode = getBlendMode(snapshot, requested); - // TODO(b/238781169) pass this from flinger - // snapshot.fps; - // snapshot.metadata; LLOGV(snapshot.sequence, "%supdated [%d]%s changes parent:%s global:%s local:%s requested:%s %s from parent %s", args.forceUpdate == ForceUpdateFlags::ALL ? "Force " : "", requested.id, diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h index d70bdb9920..548cbc0f80 100644 --- a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h +++ b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.h @@ -53,6 +53,8 @@ public: bool forceFullDamage = false; std::optional<FloatRect> parentCrop = std::nullopt; std::unordered_set<uint32_t> excludeLayerIds; + const std::unordered_map<std::string, bool>& supportedLayerGenericMetadata; + const std::unordered_map<std::string, uint32_t>& genericLayerMetadataKeyMap; }; LayerSnapshotBuilder(); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 29af6d1b7a..39f8307549 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2197,14 +2197,17 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, LifecycleUpdate& upda { ATRACE_NAME("LayerSnapshotBuilder:update"); - frontend::LayerSnapshotBuilder::Args args{.root = mLayerHierarchyBuilder.getHierarchy(), - .layerLifecycleManager = mLayerLifecycleManager, - .displays = mFrontEndDisplayInfos, - .displayChanges = mFrontEndDisplayInfosChanged, - .globalShadowSettings = - mDrawingState.globalShadowSettings, - .supportsBlur = mSupportsBlur, - .forceFullDamage = mForceFullDamage}; + frontend::LayerSnapshotBuilder::Args + args{.root = mLayerHierarchyBuilder.getHierarchy(), + .layerLifecycleManager = mLayerLifecycleManager, + .displays = mFrontEndDisplayInfos, + .displayChanges = mFrontEndDisplayInfosChanged, + .globalShadowSettings = mDrawingState.globalShadowSettings, + .supportsBlur = mSupportsBlur, + .forceFullDamage = mForceFullDamage, + .supportedLayerGenericMetadata = + getHwComposer().getSupportedLayerGenericMetadata(), + .genericLayerMetadataKeyMap = getGenericLayerMetadataKeyMap()}; mLayerSnapshotBuilder.update(args); } @@ -7779,6 +7782,7 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit compositionengine::CompositionRefreshArgs& refreshArgs, bool cursorOnly, int64_t vsyncId) { std::vector<std::pair<Layer*, LayerFE*>> layers; if (mLayerLifecycleManagerEnabled) { + nsecs_t currentTime = systemTime(); mLayerSnapshotBuilder.forEachVisibleSnapshot( [&](std::unique_ptr<frontend::LayerSnapshot>& snapshot) { if (cursorOnly && @@ -7797,6 +7801,7 @@ std::vector<std::pair<Layer*, LayerFE*>> SurfaceFlinger::moveSnapshotsToComposit snapshot->getDebugString().c_str()); auto& legacyLayer = it->second; sp<LayerFE> layerFE = legacyLayer->getCompositionEngineLayerFE(snapshot->path); + snapshot->fps = getLayerFramerate(currentTime, snapshot->sequence); layerFE->mSnapshot = std::move(snapshot); refreshArgs.layers.push_back(layerFE); layers.emplace_back(legacyLayer.get(), layerFE.get()); @@ -7868,7 +7873,10 @@ SurfaceFlinger::getLayerSnapshotsForScreenshots(uint32_t rootLayerId, uint32_t u .supportsBlur = mSupportsBlur, .forceFullDamage = mForceFullDamage, .parentCrop = {parentCrop}, - .excludeLayerIds = std::move(excludeLayerIds)}; + .excludeLayerIds = std::move(excludeLayerIds), + .supportedLayerGenericMetadata = + getHwComposer().getSupportedLayerGenericMetadata(), + .genericLayerMetadataKeyMap = getGenericLayerMetadataKeyMap()}; mLayerSnapshotBuilder.update(args); auto getLayerSnapshotsFn = getLayerSnapshotsForScreenshots({}, uid); diff --git a/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp b/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp index aa6a14ed17..5c8bd6f95d 100644 --- a/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp +++ b/services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp @@ -75,14 +75,14 @@ protected: mHierarchyBuilder.update(mLifecycleManager.getLayers(), mLifecycleManager.getDestroyedLayers()); } - LayerSnapshotBuilder::Args args{ - .root = mHierarchyBuilder.getHierarchy(), - .layerLifecycleManager = mLifecycleManager, - .includeMetadata = false, - .displays = mFrontEndDisplayInfos, - .displayChanges = hasDisplayChanges, - .globalShadowSettings = globalShadowSettings, - }; + LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(), + .layerLifecycleManager = mLifecycleManager, + .includeMetadata = false, + .displays = mFrontEndDisplayInfos, + .displayChanges = hasDisplayChanges, + .globalShadowSettings = globalShadowSettings, + .supportedLayerGenericMetadata = {}, + .genericLayerMetadataKeyMap = {}}; actualBuilder.update(args); // rebuild layer snapshots from scratch and verify that it matches the updated state. @@ -111,23 +111,25 @@ const std::vector<uint32_t> LayerSnapshotTest::STARTING_ZORDER = {1, 11, 111 122, 1221, 13, 2}; TEST_F(LayerSnapshotTest, buildSnapshot) { - LayerSnapshotBuilder::Args args{ - .root = mHierarchyBuilder.getHierarchy(), - .layerLifecycleManager = mLifecycleManager, - .includeMetadata = false, - .displays = mFrontEndDisplayInfos, - .globalShadowSettings = globalShadowSettings, - }; + LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(), + .layerLifecycleManager = mLifecycleManager, + .includeMetadata = false, + .displays = mFrontEndDisplayInfos, + .globalShadowSettings = globalShadowSettings, + .supportedLayerGenericMetadata = {}, + .genericLayerMetadataKeyMap = {}}; LayerSnapshotBuilder builder(args); } TEST_F(LayerSnapshotTest, updateSnapshot) { - LayerSnapshotBuilder::Args args{ - .root = mHierarchyBuilder.getHierarchy(), - .layerLifecycleManager = mLifecycleManager, - .includeMetadata = false, - .displays = mFrontEndDisplayInfos, - .globalShadowSettings = globalShadowSettings, + LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(), + .layerLifecycleManager = mLifecycleManager, + .includeMetadata = false, + .displays = mFrontEndDisplayInfos, + .globalShadowSettings = globalShadowSettings, + .supportedLayerGenericMetadata = {}, + .genericLayerMetadataKeyMap = {} + }; LayerSnapshotBuilder builder; |