summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/surfaceflinger/CompositionEngine/tests/MockHWC2.h1
-rw-r--r--services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp6
-rw-r--r--services/surfaceflinger/DisplayHardware/AidlComposerHal.h4
-rw-r--r--services/surfaceflinger/DisplayHardware/ComposerHal.h2
-rw-r--r--services/surfaceflinger/DisplayHardware/HWC2.cpp15
-rw-r--r--services/surfaceflinger/DisplayHardware/HWC2.h4
-rw-r--r--services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp5
-rw-r--r--services/surfaceflinger/DisplayHardware/HidlComposerHal.h4
-rw-r--r--services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h2
-rw-r--r--services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h1
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 1091a75a82..293a2b2c5c 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
@@ -1035,5 +1035,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 5c41982e8b..20afee5eb0 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
@@ -207,7 +207,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 f491a00c55..c93051e1be 100644
--- a/services/surfaceflinger/DisplayHardware/ComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h
@@ -237,6 +237,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 67784382f8..cd36eea623 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -932,6 +932,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 731d7f6d61..f833393125 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.h
+++ b/services/surfaceflinger/DisplayHardware/HWC2.h
@@ -305,6 +305,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 {
@@ -351,6 +353,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
@@ -366,6 +369,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 7946002d33..1ce9ccbefa 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
@@ -1208,6 +1208,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 3b62fe06e3..8b98334afe 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
@@ -316,7 +316,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 8c51313eb7..a2492e2acd 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 821fc8f8f1..cb1009f0db 100644
--- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h
+++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h
@@ -123,6 +123,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