diff options
author | 2024-10-25 16:20:13 -0400 | |
---|---|---|
committer | 2024-11-25 15:54:15 -0500 | |
commit | 5d66042a2377f5e350fd825063d7d166f6baff4c (patch) | |
tree | 1233219a273aaa946b759d76f51028c1c75c568c /services/surfaceflinger/SurfaceFlinger.cpp | |
parent | 4fabc0119c8f18e3997c00543831141e6647ba1c (diff) |
SF: Store and manage snapshots for virtual displays
Create/destroy VirtualDisplaySnapshot that tracks the virtual display's
lifetime.
For now, VirtualDisplaySnapshots will track a virtual display's
DisplayId and whether or not it's backed by Hal/Gpu. This will be
helpful when moving the cast system of DisplayIds from within
DisplayId.h to SurfaceFlinger.
Bug: 374163881
Flag: EXEMPT refactor
Test: libsurfaceflinger_unittest
Change-Id: Id730e65b24ecd10925282bd72585ac7c5635a4fe
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 37b35f2f63..824768203b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -647,11 +647,12 @@ void SurfaceFlinger::enableHalVirtualDisplays(bool enable) { } } -VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution, - ui::PixelFormat format) { +VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution, ui::PixelFormat format, + const std::string& uniqueId) { if (auto& generator = mVirtualDisplayIdGenerators.hal) { if (const auto id = generator->generateId()) { if (getHwComposer().allocateVirtualDisplay(*id, resolution, &format)) { + acquireVirtualDisplaySnapshot(*id, uniqueId); return *id; } @@ -665,6 +666,7 @@ VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution, const auto id = mVirtualDisplayIdGenerators.gpu.generateId(); LOG_ALWAYS_FATAL_IF(!id, "Failed to generate ID for GPU virtual display"); + acquireVirtualDisplaySnapshot(*id, uniqueId); return *id; } @@ -672,6 +674,7 @@ void SurfaceFlinger::releaseVirtualDisplay(VirtualDisplayId displayId) { if (const auto id = HalVirtualDisplayId::tryCast(displayId)) { if (auto& generator = mVirtualDisplayIdGenerators.hal) { generator->releaseId(*id); + releaseVirtualDisplaySnapshot(*id); } return; } @@ -679,6 +682,14 @@ void SurfaceFlinger::releaseVirtualDisplay(VirtualDisplayId displayId) { const auto id = GpuVirtualDisplayId::tryCast(displayId); LOG_ALWAYS_FATAL_IF(!id); mVirtualDisplayIdGenerators.gpu.releaseId(*id); + releaseVirtualDisplaySnapshot(*id); +} + +void SurfaceFlinger::releaseVirtualDisplaySnapshot(VirtualDisplayId displayId) { + std::lock_guard lock(mVirtualDisplaysMutex); + if (!mVirtualDisplays.erase(displayId)) { + ALOGW("%s: Virtual display snapshot was not removed", __func__); + } } std::vector<PhysicalDisplayId> SurfaceFlinger::getPhysicalDisplayIdsLocked() const { @@ -3730,7 +3741,7 @@ void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken, if (const auto& physical = state.physical) { builder.setId(physical->id); } else { - builder.setId(acquireVirtualDisplay(resolution, pixelFormat)); + builder.setId(acquireVirtualDisplay(resolution, pixelFormat, state.uniqueId)); } builder.setPixels(resolution); @@ -5717,6 +5728,14 @@ void SurfaceFlinger::dumpDisplays(std::string& result) const { utils::Dumper::Section section(dumper, ftl::Concat("Virtual Display ", displayId.value).str()); display->dump(dumper); + + if (const auto virtualIdOpt = VirtualDisplayId::tryCast(displayId)) { + std::lock_guard lock(mVirtualDisplaysMutex); + const auto virtualSnapshotIt = mVirtualDisplays.find(virtualIdOpt.value()); + if (virtualSnapshotIt != mVirtualDisplays.end()) { + virtualSnapshotIt->second.dump(dumper); + } + } } } } |