summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
authorWeizhung Ding <weizhungding@google.com>2022-07-29 08:42:58 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-07-29 08:42:58 +0000
commitddf7185f612bcc52aeffca976f36c3124ae87a3c (patch)
tree31e762849aa87b3c91dffac53a78e09dc9a4e1d0 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
parent366b0e633df30f26dde7748fb6a53ed4eebbcbfe (diff)
parent45f7cd7c78fba26e0e311440ca325d63d81632c5 (diff)
libhwc2.1: support display-off asynchronously am: 0ec923a4f6 am: 45f7cd7c78
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/google/graphics/common/+/19442449 Change-Id: I36aaee82669a2ae64aec7c1f13dd4ae91c928c42 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index c217175..73b327a 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -1927,6 +1927,8 @@ int32_t ExynosDisplayDrmInterface::clearDisplayPlanes(DrmModeAtomicReq &drmReq)
int32_t ExynosDisplayDrmInterface::clearDisplay(bool needModeClear)
{
+ ExynosDevice *exynosDevice = mExynosDisplay->mDevice;
+ const bool isAsyncOff = needModeClear && exynosDevice->isDispOffAsyncSupported();
int ret = NO_ERROR;
DrmModeAtomicReq drmReq(this);
@@ -1947,7 +1949,7 @@ int32_t ExynosDisplayDrmInterface::clearDisplay(bool needModeClear)
}
/* Disable ModeSet */
- if (needModeClear) {
+ if (needModeClear && !isAsyncOff) {
if ((ret = clearDisplayMode(drmReq)) < 0) {
HWC_LOGE(mExynosDisplay, "%s: Failed to apply display mode", __func__);
return ret;
@@ -1961,6 +1963,23 @@ int32_t ExynosDisplayDrmInterface::clearDisplay(bool needModeClear)
return ret;
}
+ /* During async off we're clearing planes within a single refresh cycle
+ * and then offloading display off asynchronously.
+ */
+ if (isAsyncOff) {
+ if ((ret = clearDisplayMode(drmReq)) < 0) {
+ HWC_LOGE(mExynosDisplay, "%s: Failed to apply display mode", __func__);
+ return ret;
+ }
+
+ ret = drmReq.commit(DRM_MODE_ATOMIC_ALLOW_MODESET | DRM_MODE_ATOMIC_NONBLOCK, true);
+ if (ret) {
+ HWC_LOGE(mExynosDisplay, "%s:: Failed to commit pset ret=%d in clearDisplay()\n",
+ __func__, ret);
+ return ret;
+ }
+ }
+
if (needModeClear) mActiveModeState.forceModeSet();
return NO_ERROR;