diff options
4 files changed, 30 insertions, 13 deletions
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 27146ab79c..e21b0daa96 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -283,8 +283,21 @@ Error Display::getConnectionType(ui::DisplayConnectionType* outType) const { return Error::NONE; } +bool Display::hasCapability(hal::DisplayCapability capability) const { + std::scoped_lock lock(mDisplayCapabilitiesMutex); + if (mDisplayCapabilities) { + return mDisplayCapabilities->count(capability) > 0; + } + + ALOGW("Can't query capability %d." + " Display Capabilities were not queried from HWC yet", + static_cast<int>(capability)); + + return false; +} + Error Display::supportsDoze(bool* outSupport) const { - *outSupport = mDisplayCapabilities.count(DisplayCapability::DOZE) > 0; + *outSupport = hasCapability(DisplayCapability::DOZE); return Error::NONE; } @@ -447,17 +460,21 @@ Error Display::setPowerMode(PowerMode mode) 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(static_cast<DisplayCapability>(capability)); + mDisplayCapabilities->emplace(static_cast<DisplayCapability>(capability)); } } else if (error == Error::UNSUPPORTED) { + std::scoped_lock lock(mDisplayCapabilitiesMutex); + mDisplayCapabilities.emplace(); if (mCapabilities.count(Capability::SKIP_CLIENT_COLOR_TRANSFORM)) { - mDisplayCapabilities.emplace(DisplayCapability::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); + mDisplayCapabilities->emplace(DisplayCapability::DOZE); } } }); diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index 871465d717..a65efb2931 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -17,6 +17,7 @@ #pragma once #include <android-base/expected.h> +#include <android-base/thread_annotations.h> #include <gui/HdrMetadata.h> #include <math/mat4.h> #include <ui/HdrCapabilities.h> @@ -79,7 +80,7 @@ public: virtual hal::HWDisplayId getId() const = 0; virtual bool isConnected() const = 0; virtual void setConnected(bool connected) = 0; // For use by Device only - virtual const std::unordered_set<hal::DisplayCapability>& getCapabilities() const = 0; + virtual bool hasCapability(hal::DisplayCapability) const = 0; virtual bool isVsyncPeriodSwitchSupported() const = 0; virtual void onLayerDestroyed(hal::HWLayerId layerId) = 0; @@ -175,7 +176,7 @@ public: hal::DisplayRequest* outDisplayRequests, std::unordered_map<HWC2::Layer*, hal::LayerRequest>* outLayerRequests) override; hal::Error getConnectionType(ui::DisplayConnectionType*) const override; - hal::Error supportsDoze(bool* outSupport) const override; + hal::Error supportsDoze(bool* outSupport) const override EXCLUDES(mDisplayCapabilitiesMutex); hal::Error getHdrCapabilities(android::HdrCapabilities* outCapabilities) const override; hal::Error getDisplayedContentSamplingAttributes(hal::PixelFormat* outFormat, hal::Dataspace* outDataspace, @@ -214,9 +215,7 @@ public: hal::HWDisplayId getId() const override { return mId; } bool isConnected() const override { return mIsConnected; } void setConnected(bool connected) override; // For use by Device only - const std::unordered_set<hal::DisplayCapability>& getCapabilities() const override { - return mDisplayCapabilities; - }; + bool hasCapability(hal::DisplayCapability) const override EXCLUDES(mDisplayCapabilitiesMutex); bool isVsyncPeriodSwitchSupported() const override; void onLayerDestroyed(hal::HWLayerId layerId) override; @@ -243,8 +242,10 @@ private: using Layers = std::unordered_map<hal::HWLayerId, std::weak_ptr<HWC2::impl::Layer>>; Layers mLayers; + mutable std::mutex mDisplayCapabilitiesMutex; std::once_flag mDisplayCapabilityQueryFlag; - std::unordered_set<hal::DisplayCapability> mDisplayCapabilities; + std::optional<std::unordered_set<hal::DisplayCapability>> mDisplayCapabilities + GUARDED_BY(mDisplayCapabilitiesMutex); }; } // namespace impl diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 256bca9570..c63ba0e055 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -183,7 +183,7 @@ bool HWComposer::hasCapability(hal::Capability capability) const { bool HWComposer::hasDisplayCapability(HalDisplayId displayId, hal::DisplayCapability capability) const { RETURN_IF_INVALID_DISPLAY(displayId, false); - return mDisplayData.at(displayId).hwcDisplay->getCapabilities().count(capability) > 0; + return mDisplayData.at(displayId).hwcDisplay->hasCapability(capability); } std::optional<DisplayIdentificationInfo> HWComposer::onHotplug(hal::HWDisplayId hwcDisplayId, diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h index c3919d9310..fe1544ec18 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h @@ -30,8 +30,7 @@ public: MOCK_METHOD(hal::HWDisplayId, getId, (), (const, override)); MOCK_METHOD(bool, isConnected, (), (const, override)); MOCK_METHOD(void, setConnected, (bool), (override)); - MOCK_METHOD(const std::unordered_set<hal::DisplayCapability> &, getCapabilities, (), - (const, override)); + MOCK_METHOD(bool, hasCapability, (hal::DisplayCapability), (const, override)); MOCK_METHOD(bool, isVsyncPeriodSwitchSupported, (), (const, override)); MOCK_METHOD(void, onLayerDestroyed, (hal::HWLayerId), (override)); |