summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeizhung Ding <weizhungding@google.com>2023-05-10 10:12:25 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2023-05-10 10:12:25 +0000
commit25001f3ea723c503414ba6cb8dcc8461a04fb6c2 (patch)
tree50e16d945763d0179f547a97e17e095907c77c8f
parentd6bd3d5d55881536c66766546ab8a98a37c790ca (diff)
parent536007c1efe2cba081681c69c5d1298209ace460 (diff)
Merge "libhwc2.1: skip async_off if multiple displays are enabled" into udc-dev
-rw-r--r--libhwc2.1/libdevice/ExynosDevice.cpp11
-rw-r--r--libhwc2.1/libdevice/ExynosDevice.h1
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp3
3 files changed, 14 insertions, 1 deletions
diff --git a/libhwc2.1/libdevice/ExynosDevice.cpp b/libhwc2.1/libdevice/ExynosDevice.cpp
index 97d7a15..99fbc1a 100644
--- a/libhwc2.1/libdevice/ExynosDevice.cpp
+++ b/libhwc2.1/libdevice/ExynosDevice.cpp
@@ -276,6 +276,17 @@ bool ExynosDevice::isLastValidate(ExynosDisplay *display)
return true;
}
+bool ExynosDevice::hasOtherDisplayOn(ExynosDisplay *display) {
+ for (uint32_t i = 0; i < mDisplays.size(); i++) {
+ if (mDisplays[i] == display) continue;
+ if ((mDisplays[i]->mType != HWC_DISPLAY_VIRTUAL) &&
+ mDisplays[i]->mPowerModeState.has_value() &&
+ (mDisplays[i]->mPowerModeState.value() != (hwc2_power_mode_t)HWC_POWER_MODE_OFF))
+ return true;
+ }
+ return false;
+}
+
bool ExynosDevice::isDynamicRecompositionThreadAlive()
{
android_atomic_acquire_load(&mDRThreadStatus);
diff --git a/libhwc2.1/libdevice/ExynosDevice.h b/libhwc2.1/libdevice/ExynosDevice.h
index 3569643..35eb947 100644
--- a/libhwc2.1/libdevice/ExynosDevice.h
+++ b/libhwc2.1/libdevice/ExynosDevice.h
@@ -341,6 +341,7 @@ class ExynosDevice {
hwc2_function_pointer_t point);
void onVsyncIdle(hwc2_display_t displayId);
bool isDispOffAsyncSupported() { return mDisplayOffAsync; };
+ bool hasOtherDisplayOn(ExynosDisplay *display);
virtual int32_t getOverlaySupport([[maybe_unused]] OverlayProperties* caps){
return HWC2_ERROR_UNSUPPORTED;
}
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index 375153b..267b4b9 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -2025,7 +2025,8 @@ int32_t ExynosDisplayDrmInterface::clearDisplayPlanes(DrmModeAtomicReq &drmReq)
int32_t ExynosDisplayDrmInterface::clearDisplay(bool needModeClear)
{
ExynosDevice *exynosDevice = mExynosDisplay->mDevice;
- const bool isAsyncOff = needModeClear && exynosDevice->isDispOffAsyncSupported();
+ const bool isAsyncOff = needModeClear && exynosDevice->isDispOffAsyncSupported() &&
+ !exynosDevice->hasOtherDisplayOn(mExynosDisplay);
int ret = NO_ERROR;
DrmModeAtomicReq drmReq(this);