summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoenchen <joenchen@google.com>2023-05-02 03:19:23 +0000
committerjoenchen <joenchen@google.com>2023-05-12 09:59:54 +0000
commit72c453d6e93c6a8646fa7a301948114b6e29b861 (patch)
tree59c297595bf3de74a32255170d93f83d95b70a9e
parent466f2a9cfec1a64a204b15d0cb04a3989cbc4797 (diff)
libhwc2.1: disconnect link between plane and crtc after power on
HWC cannot just assign a plane’s crtc from crtc-0 to crtc-1 directly, and it must turn off the plane first Bug: 277874775 Test: enable/disable DDC in translation app Change-Id: I7771821fc618528f63610449c506ed93ec8a8ddc
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp15
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h1
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h1
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp4
4 files changed, 21 insertions, 0 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index af4facc..27d541b 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -2000,6 +2000,21 @@ int32_t ExynosDisplayDrmInterface::clearDisplayMode(DrmModeAtomicReq &drmReq)
return NO_ERROR;
}
+int32_t ExynosDisplayDrmInterface::triggerClearDisplayPlanes()
+{
+ ATRACE_CALL();
+ DrmModeAtomicReq drmReq(this);
+
+ clearDisplayPlanes(drmReq);
+ int ret = NO_ERROR;
+ if ((ret = drmReq.commit(0, true))) {
+ HWC_LOGE(mExynosDisplay, "%s:: Failed to commit pset ret=(%d)\n",
+ __func__, ret);
+ return ret;
+ }
+ return ret;
+}
+
int32_t ExynosDisplayDrmInterface::clearDisplayPlanes(DrmModeAtomicReq &drmReq)
{
int ret = NO_ERROR;
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h
index bf5c9aa..78ed3e4 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h
@@ -331,6 +331,7 @@ class ExynosDisplayDrmInterface :
int32_t panelVsize() { return mPanelResolutionVsize; }
int32_t getPanelResolution();
uint32_t getCrtcId() { return mDrmCrtc->id(); }
+ int32_t triggerClearDisplayPlanes();
protected:
enum class HalMipiSyncType : uint32_t {
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h b/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h
index d133774..2eabdfc 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h
@@ -53,6 +53,7 @@ class ExynosDisplayInterface {
virtual int32_t updateHdrCapabilities();
virtual int32_t deliverWinConfigData() {return NO_ERROR;};
virtual int32_t clearDisplay(bool __unused needModeClear = false) {return NO_ERROR;};
+ virtual int32_t triggerClearDisplayPlanes() { return NO_ERROR; }
virtual int32_t disableSelfRefresh(uint32_t __unused disable) {return NO_ERROR;};
virtual int32_t setForcePanic() {return NO_ERROR;};
virtual int getDisplayFd() {return -1;};
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index b1b6aee..fb925db 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -277,6 +277,10 @@ int32_t ExynosPrimaryDisplay::setPowerOn() {
updateAppliedActiveConfig(0, 0);
int ret = NO_ERROR;
if (mDisplayId != 0 || !mFirstPowerOn) {
+ if (mDevice->hasOtherDisplayOn(this)) {
+ // TODO: This is useful for cmd mode, and b/282094671 tries to handles video mode
+ mDisplayInterface->triggerClearDisplayPlanes();
+ }
ret = applyPendingConfig();
}