diff options
10 files changed, 44 insertions, 0 deletions
diff --git a/services/surfaceflinger/CompositionEngine/tests/MockHWC2.h b/services/surfaceflinger/CompositionEngine/tests/MockHWC2.h index ff680533ea..f66de22ccf 100644 --- a/services/surfaceflinger/CompositionEngine/tests/MockHWC2.h +++ b/services/surfaceflinger/CompositionEngine/tests/MockHWC2.h @@ -75,6 +75,7 @@ public: MOCK_METHOD3(setLayerGenericMetadata, Error(const std::string&, bool, const std::vector<uint8_t>&)); MOCK_METHOD1(setWhitePointNits, Error(float)); + MOCK_METHOD1(setBlockingRegion, Error(const android::Region&)); }; } // namespace mock diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp index d253b007b9..571f4d7d9c 100644 --- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp @@ -1037,5 +1037,11 @@ Error AidlComposer::setLayerWhitePointNits(Display display, Layer layer, float w return Error::NONE; } +Error AidlComposer::setLayerBlockingRegion(Display display, Layer layer, + const std::vector<IComposerClient::Rect>& blocking) { + mWriter.setLayerBlockingRegion(translate<int64_t>(display), translate<int64_t>(layer), + translate<AidlRect>(blocking)); + return Error::NONE; +} } // namespace Hwc2 } // namespace android diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h index c72093281b..4784426bca 100644 --- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h @@ -208,7 +208,11 @@ public: Error getClientTargetProperty(Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty, float* outClientTargetWhitePointNits) override; + + // AIDL Composer HAL Error setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) override; + Error setLayerBlockingRegion(Display display, Layer layer, + const std::vector<IComposerClient::Rect>& blocking) override; private: // Many public functions above simply write a command into the command diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h index 718208bfff..7f986bc98c 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h @@ -252,6 +252,8 @@ public: // AIDL Composer virtual Error setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) = 0; + virtual Error setLayerBlockingRegion(Display display, Layer layer, + const std::vector<IComposerClient::Rect>& blocking) = 0; }; } // namespace android::Hwc2 diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index 22479d81a7..c1373f9f23 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -931,6 +931,21 @@ Error Layer::setWhitePointNits(float whitePointNits) { return static_cast<Error>(intError); } +Error Layer::setBlockingRegion(const Region& region) { + if (CC_UNLIKELY(!mDisplay)) { + return Error::BAD_DISPLAY; + } + + if (region.isRect() && mBlockingRegion.isRect() && + (region.getBounds() == mBlockingRegion.getBounds())) { + return Error::NONE; + } + mBlockingRegion = region; + const auto hwcRects = convertRegionToHwcRects(region); + const auto intError = mComposer.setLayerBlockingRegion(mDisplay->getId(), mId, hwcRects); + return static_cast<Error>(intError); +} + } // namespace impl } // namespace HWC2 } // namespace android diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index df4e4b8d0b..404cc33698 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -307,6 +307,8 @@ public: // AIDL HAL [[clang::warn_unused_result]] virtual hal::Error setWhitePointNits(float whitePointNits) = 0; + [[clang::warn_unused_result]] virtual hal::Error setBlockingRegion( + const android::Region& region) = 0; }; namespace impl { @@ -353,6 +355,7 @@ public: // AIDL HAL hal::Error setWhitePointNits(float whitePointNits) override; + hal::Error setBlockingRegion(const android::Region& region) override; private: // These are references to data owned by HWC2::Device, which will outlive @@ -368,6 +371,7 @@ private: // multiple times. android::Region mVisibleRegion = android::Region::INVALID_REGION; android::Region mDamageRegion = android::Region::INVALID_REGION; + android::Region mBlockingRegion = android::Region::INVALID_REGION; hal::Dataspace mDataSpace = hal::Dataspace::UNKNOWN; android::HdrMetadata mHdrMetadata; android::mat4 mColorMatrix; diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp index b88475581b..fbfff6170f 100644 --- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp @@ -1210,6 +1210,11 @@ Error HidlComposer::setLayerWhitePointNits(Display, Layer, float) { return Error::NONE; } +Error HidlComposer::setLayerBlockingRegion(Display, Layer, + const std::vector<IComposerClient::Rect>&) { + return Error::NONE; +} + CommandReader::~CommandReader() { resetData(); } diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h index 6c8af5df59..33bfab9799 100644 --- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h @@ -317,7 +317,11 @@ public: Error getClientTargetProperty(Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty, float* outWhitePointNits) override; + + // AIDL Composer HAL Error setLayerWhitePointNits(Display display, Layer layer, float whitePointNits) override; + Error setLayerBlockingRegion(Display display, Layer layer, + const std::vector<IComposerClient::Rect>& blocking) override; private: class CommandWriter : public CommandWriterBase { diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h index 4932ad1229..ec15a21f0e 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h @@ -145,6 +145,8 @@ public: MOCK_METHOD3(getClientTargetProperty, Error(Display, IComposerClient::ClientTargetProperty*, float*)); MOCK_METHOD3(setLayerWhitePointNits, Error(Display, Layer, float)); + MOCK_METHOD3(setLayerBlockingRegion, + Error(Display, Layer, const std::vector<IComposerClient::Rect>&)); }; } // namespace Hwc2::mock diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h index 0527d80ddc..c3b19c1ddd 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h @@ -124,6 +124,7 @@ public: MOCK_METHOD(hal::Error, setLayerGenericMetadata, (const std::string &, bool, const std::vector<uint8_t> &), (override)); MOCK_METHOD(hal::Error, setWhitePointNits, (float whitePointNits), (override)); + MOCK_METHOD(hal::Error, setBlockingRegion, (const android::Region &), (override)); }; } // namespace android::HWC2::mock |