summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
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;