@@ -649,11 +649,12 @@ void SurfaceFlinger::enableHalVirtualDisplays(bool enable) {
649649 }
650650}
651651
652- VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay (ui::Size resolution,
653- ui::PixelFormat format ) {
652+ VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay (ui::Size resolution, ui::PixelFormat format,
653+ const std::string& uniqueId ) {
654654 if (auto & generator = mVirtualDisplayIdGenerators .hal ) {
655655 if (const auto id = generator->generateId ()) {
656656 if (getHwComposer ().allocateVirtualDisplay (*id, resolution, &format)) {
657+ acquireVirtualDisplaySnapshot (*id, uniqueId);
657658 return *id;
658659 }
659660
@@ -667,20 +668,30 @@ VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution,
667668
668669 const auto id = mVirtualDisplayIdGenerators .gpu .generateId ();
669670 LOG_ALWAYS_FATAL_IF (!id, " Failed to generate ID for GPU virtual display" );
671+ acquireVirtualDisplaySnapshot (*id, uniqueId);
670672 return *id;
671673}
672674
673675void SurfaceFlinger::releaseVirtualDisplay (VirtualDisplayId displayId) {
674676 if (const auto id = HalVirtualDisplayId::tryCast (displayId)) {
675677 if (auto & generator = mVirtualDisplayIdGenerators .hal ) {
676678 generator->releaseId (*id);
679+ releaseVirtualDisplaySnapshot (*id);
677680 }
678681 return ;
679682 }
680683
681684 const auto id = GpuVirtualDisplayId::tryCast (displayId);
682685 LOG_ALWAYS_FATAL_IF (!id);
683686 mVirtualDisplayIdGenerators .gpu .releaseId (*id);
687+ releaseVirtualDisplaySnapshot (*id);
688+ }
689+
690+ void SurfaceFlinger::releaseVirtualDisplaySnapshot (VirtualDisplayId displayId) {
691+ std::lock_guard lock (mVirtualDisplaysMutex );
692+ if (!mVirtualDisplays .erase (displayId)) {
693+ ALOGW (" %s: Virtual display snapshot was not removed" , __func__);
694+ }
684695}
685696
686697std::vector<PhysicalDisplayId> SurfaceFlinger::getPhysicalDisplayIdsLocked () const {
@@ -3798,7 +3809,7 @@ void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
37983809 if (const auto & physical = state.physical ) {
37993810 builder.setId (physical->id );
38003811 } else {
3801- builder.setId (acquireVirtualDisplay (resolution, pixelFormat));
3812+ builder.setId (acquireVirtualDisplay (resolution, pixelFormat, state. uniqueId ));
38023813 }
38033814
38043815 builder.setPixels (resolution);
@@ -5785,6 +5796,14 @@ void SurfaceFlinger::dumpDisplays(std::string& result) const {
57855796 utils::Dumper::Section section (dumper,
57865797 ftl::Concat (" Virtual Display " , displayId.value ).str ());
57875798 display->dump (dumper);
5799+
5800+ if (const auto virtualIdOpt = VirtualDisplayId::tryCast (displayId)) {
5801+ std::lock_guard lock (mVirtualDisplaysMutex );
5802+ const auto virtualSnapshotIt = mVirtualDisplays .find (virtualIdOpt.value ());
5803+ if (virtualSnapshotIt != mVirtualDisplays .end ()) {
5804+ virtualSnapshotIt->second .dump (dumper);
5805+ }
5806+ }
57885807 }
57895808 }
57905809}
0 commit comments