diff options
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWC2.cpp | 53 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWC2.h | 1 |
2 files changed, 31 insertions, 23 deletions
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 704ece516d..29b2cfdcc7 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -78,6 +78,9 @@ Display::Display(android::Hwc2::Composer& composer, 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 @@ Error Display::setPowerMode(PowerMode mode) 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 @@ std::shared_ptr<HWC2::Layer> Display::getLayerById(HWLayerId id) const { 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 diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index f907061774..0a77d4b5c4 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -276,6 +276,7 @@ public: hal::Error getPhysicalDisplayOrientation(Hwc2::AidlTransform* outTransform) const override; private: + void loadDisplayCapabilities(); // This may fail (and return a null pointer) if no layer with this ID exists // on this display |