Loading services/surfaceflinger/DisplayHardware/HWC2.cpp +21 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); } } }); Loading services/surfaceflinger/DisplayHardware/HWC2.h +7 −6 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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; Loading @@ -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 Loading services/surfaceflinger/DisplayHardware/HWComposer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h +1 −2 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading
services/surfaceflinger/DisplayHardware/HWC2.cpp +21 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); } } }); Loading
services/surfaceflinger/DisplayHardware/HWC2.h +7 −6 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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; Loading @@ -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 Loading
services/surfaceflinger/DisplayHardware/HWComposer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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, Loading
services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h +1 −2 Original line number Diff line number Diff line Loading @@ -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)); Loading