SF: Update capabilities for HWC virtual display
setPowerMode() is not called in HWC virtual display
so capabilities was not updated.
This change updates capabilities when HWC virtual display is created.
Bug: 329533475
Test: manual
Change-Id: Ib12a5e76cd9b1efb0dd14a6ad31983e41a0eeaba
Signed-off-by: HyunKyoung <hk310.kim@samsung.com>
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp
index 704ece5..29b2cfd 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -78,6 +78,9 @@
DisplayType type)
: mComposer(composer), mCapabilities(capabilities), mId(id), mType(type) {
ALOGV("Created display %" PRIu64, id);
+ if (mType == hal::DisplayType::VIRTUAL) {
+ loadDisplayCapabilities();
+ }
}
Display::~Display() {
@@ -482,29 +485,7 @@
auto intError = mComposer.setPowerMode(mId, intMode);
if (mode == PowerMode::ON) {
- std::call_once(mDisplayCapabilityQueryFlag, [this]() {
- std::vector<DisplayCapability> tmpCapabilities;
- auto error =
- static_cast<Error>(mComposer.getDisplayCapabilities(mId, &tmpCapabilities));
- if (error == Error::NONE) {
- std::scoped_lock lock(mDisplayCapabilitiesMutex);
- mDisplayCapabilities.emplace();
- for (auto capability : tmpCapabilities) {
- mDisplayCapabilities->emplace(capability);
- }
- } else if (error == Error::UNSUPPORTED) {
- std::scoped_lock lock(mDisplayCapabilitiesMutex);
- mDisplayCapabilities.emplace();
- if (mCapabilities.count(AidlCapability::SKIP_CLIENT_COLOR_TRANSFORM)) {
- mDisplayCapabilities->emplace(DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM);
- }
- bool dozeSupport = false;
- error = static_cast<Error>(mComposer.getDozeSupport(mId, &dozeSupport));
- if (error == Error::NONE && dozeSupport) {
- mDisplayCapabilities->emplace(DisplayCapability::DOZE);
- }
- }
- });
+ loadDisplayCapabilities();
}
return static_cast<Error>(intError);
@@ -636,6 +617,32 @@
auto it = mLayers.find(id);
return it != mLayers.end() ? it->second.lock() : nullptr;
}
+
+void Display::loadDisplayCapabilities() {
+ std::call_once(mDisplayCapabilityQueryFlag, [this]() {
+ std::vector<DisplayCapability> tmpCapabilities;
+ auto error =
+ static_cast<Error>(mComposer.getDisplayCapabilities(mId, &tmpCapabilities));
+ if (error == Error::NONE) {
+ std::scoped_lock lock(mDisplayCapabilitiesMutex);
+ mDisplayCapabilities.emplace();
+ for (auto capability : tmpCapabilities) {
+ mDisplayCapabilities->emplace(capability);
+ }
+ } else if (error == Error::UNSUPPORTED) {
+ std::scoped_lock lock(mDisplayCapabilitiesMutex);
+ mDisplayCapabilities.emplace();
+ if (mCapabilities.count(AidlCapability::SKIP_CLIENT_COLOR_TRANSFORM)) {
+ mDisplayCapabilities->emplace(DisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM);
+ }
+ bool dozeSupport = false;
+ error = static_cast<Error>(mComposer.getDozeSupport(mId, &dozeSupport));
+ if (error == Error::NONE && dozeSupport) {
+ mDisplayCapabilities->emplace(DisplayCapability::DOZE);
+ }
+ }
+ });
+}
} // namespace impl
// Layer methods