Skip to content

Commit 5d66042

Browse files
committed
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
1 parent 4fabc01 commit 5d66042

3 files changed

Lines changed: 92 additions & 4 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright 2024 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#pragma once
18+
19+
#include <optional>
20+
#include <string>
21+
22+
#include <ui/DisplayId.h>
23+
24+
#include "Utils/Dumper.h"
25+
26+
namespace android::display {
27+
28+
// Immutable state of a virtual display, captured on creation.
29+
class VirtualDisplaySnapshot {
30+
public:
31+
VirtualDisplaySnapshot(GpuVirtualDisplayId gpuId, std::string uniqueId)
32+
: mIsGpu(true), mUniqueId(std::move(uniqueId)), mVirtualId(gpuId) {}
33+
VirtualDisplaySnapshot(HalVirtualDisplayId halId, std::string uniqueId)
34+
: mIsGpu(false), mUniqueId(std::move(uniqueId)), mVirtualId(halId) {}
35+
36+
VirtualDisplayId displayId() const { return mVirtualId; }
37+
bool isGpu() const { return mIsGpu; }
38+
39+
void dump(utils::Dumper& dumper) const {
40+
using namespace std::string_view_literals;
41+
42+
dumper.dump("isGpu"sv, mIsGpu ? "true"sv : "false"sv);
43+
dumper.dump("uniqueId"sv, mUniqueId);
44+
}
45+
46+
private:
47+
const bool mIsGpu;
48+
const std::string mUniqueId;
49+
const VirtualDisplayId mVirtualId;
50+
};
51+
52+
} // namespace android::display

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -647,11 +647,12 @@ void SurfaceFlinger::enableHalVirtualDisplays(bool enable) {
647647
}
648648
}
649649

650-
VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution,
651-
ui::PixelFormat format) {
650+
VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution, ui::PixelFormat format,
651+
const std::string& uniqueId) {
652652
if (auto& generator = mVirtualDisplayIdGenerators.hal) {
653653
if (const auto id = generator->generateId()) {
654654
if (getHwComposer().allocateVirtualDisplay(*id, resolution, &format)) {
655+
acquireVirtualDisplaySnapshot(*id, uniqueId);
655656
return *id;
656657
}
657658

@@ -665,20 +666,30 @@ VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution,
665666

666667
const auto id = mVirtualDisplayIdGenerators.gpu.generateId();
667668
LOG_ALWAYS_FATAL_IF(!id, "Failed to generate ID for GPU virtual display");
669+
acquireVirtualDisplaySnapshot(*id, uniqueId);
668670
return *id;
669671
}
670672

671673
void SurfaceFlinger::releaseVirtualDisplay(VirtualDisplayId displayId) {
672674
if (const auto id = HalVirtualDisplayId::tryCast(displayId)) {
673675
if (auto& generator = mVirtualDisplayIdGenerators.hal) {
674676
generator->releaseId(*id);
677+
releaseVirtualDisplaySnapshot(*id);
675678
}
676679
return;
677680
}
678681

679682
const auto id = GpuVirtualDisplayId::tryCast(displayId);
680683
LOG_ALWAYS_FATAL_IF(!id);
681684
mVirtualDisplayIdGenerators.gpu.releaseId(*id);
685+
releaseVirtualDisplaySnapshot(*id);
686+
}
687+
688+
void SurfaceFlinger::releaseVirtualDisplaySnapshot(VirtualDisplayId displayId) {
689+
std::lock_guard lock(mVirtualDisplaysMutex);
690+
if (!mVirtualDisplays.erase(displayId)) {
691+
ALOGW("%s: Virtual display snapshot was not removed", __func__);
692+
}
682693
}
683694

684695
std::vector<PhysicalDisplayId> SurfaceFlinger::getPhysicalDisplayIdsLocked() const {
@@ -3730,7 +3741,7 @@ void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
37303741
if (const auto& physical = state.physical) {
37313742
builder.setId(physical->id);
37323743
} else {
3733-
builder.setId(acquireVirtualDisplay(resolution, pixelFormat));
3744+
builder.setId(acquireVirtualDisplay(resolution, pixelFormat, state.uniqueId));
37343745
}
37353746

37363747
builder.setPixels(resolution);
@@ -5717,6 +5728,14 @@ void SurfaceFlinger::dumpDisplays(std::string& result) const {
57175728
utils::Dumper::Section section(dumper,
57185729
ftl::Concat("Virtual Display ", displayId.value).str());
57195730
display->dump(dumper);
5731+
5732+
if (const auto virtualIdOpt = VirtualDisplayId::tryCast(displayId)) {
5733+
std::lock_guard lock(mVirtualDisplaysMutex);
5734+
const auto virtualSnapshotIt = mVirtualDisplays.find(virtualIdOpt.value());
5735+
if (virtualSnapshotIt != mVirtualDisplays.end()) {
5736+
virtualSnapshotIt->second.dump(dumper);
5737+
}
5738+
}
57205739
}
57215740
}
57225741
}

services/surfaceflinger/SurfaceFlinger.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
#include <common/FlagManager.h>
7070
#include "Display/DisplayModeController.h"
7171
#include "Display/PhysicalDisplay.h"
72+
#include "Display/VirtualDisplaySnapshot.h"
7273
#include "DisplayDevice.h"
7374
#include "DisplayHardware/HWC2.h"
7475
#include "DisplayIdGenerator.h"
@@ -1067,8 +1068,20 @@ class SurfaceFlinger : public BnSurfaceComposer,
10671068
void enableHalVirtualDisplays(bool);
10681069

10691070
// Virtual display lifecycle for ID generation and HAL allocation.
1070-
VirtualDisplayId acquireVirtualDisplay(ui::Size, ui::PixelFormat) REQUIRES(mStateLock);
1071+
VirtualDisplayId acquireVirtualDisplay(ui::Size, ui::PixelFormat, const std::string& uniqueId)
1072+
REQUIRES(mStateLock);
1073+
template <typename ID>
1074+
void acquireVirtualDisplaySnapshot(ID displayId, const std::string& uniqueId) {
1075+
std::lock_guard lock(mVirtualDisplaysMutex);
1076+
const bool emplace_success =
1077+
mVirtualDisplays.try_emplace(displayId, displayId, uniqueId).second;
1078+
if (!emplace_success) {
1079+
ALOGW("%s: Virtual display snapshot with the same ID already exists", __func__);
1080+
}
1081+
}
1082+
10711083
void releaseVirtualDisplay(VirtualDisplayId);
1084+
void releaseVirtualDisplaySnapshot(VirtualDisplayId displayId);
10721085

10731086
// Returns a display other than `mActiveDisplayId` that can be activated, if any.
10741087
sp<DisplayDevice> getActivatableDisplay() const REQUIRES(mStateLock, kMainThreadContext);
@@ -1269,6 +1282,10 @@ class SurfaceFlinger : public BnSurfaceComposer,
12691282

12701283
display::PhysicalDisplays mPhysicalDisplays GUARDED_BY(mStateLock);
12711284

1285+
mutable std::mutex mVirtualDisplaysMutex;
1286+
ftl::SmallMap<VirtualDisplayId, const display::VirtualDisplaySnapshot, 2> mVirtualDisplays
1287+
GUARDED_BY(mVirtualDisplaysMutex);
1288+
12721289
// The inner or outer display for foldables, while unfolded or folded, respectively.
12731290
std::atomic<PhysicalDisplayId> mActiveDisplayId;
12741291

0 commit comments

Comments
 (0)