diff options
author | Weizhung Ding <weizhungding@google.com> | 2022-07-29 08:42:58 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-07-29 08:42:58 +0000 |
commit | ddf7185f612bcc52aeffca976f36c3124ae87a3c (patch) | |
tree | 31e762849aa87b3c91dffac53a78e09dc9a4e1d0 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | 366b0e633df30f26dde7748fb6a53ed4eebbcbfe (diff) | |
parent | 45f7cd7c78fba26e0e311440ca325d63d81632c5 (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.cpp | 21 |
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; |