diff options
author | Vinu Deokaran <vinud@codeaurora.org> | 2016-02-12 15:52:17 -0500 |
---|---|---|
committer | Arne Coucheron <arco68@gmail.com> | 2020-04-25 00:30:12 +0200 |
commit | 7178e057d771d7886c5f31c79d684614b57bbe3f (patch) | |
tree | 3d69b1ef11760fdaaebb4960e165c4a791273cbc | |
parent | 3c1bd9e92e78388ebccb2a3289a9cfe034aa90dd (diff) | |
download | hardware_qcom_display-lineage-16.0-caf-8960.tar.gz hardware_qcom_display-lineage-16.0-caf-8960.tar.bz2 hardware_qcom_display-lineage-16.0-caf-8960.zip |
hwc: wait for commit finish when unset overlaylineage-16.0-caf-8960
When there is unset overlay in prepare, commit needs to be sync
mode and wait for VSYNC. Otherwise, kernel resources may not be
ready for next overlay set.
Change-Id: Ibfc64ddd035993781eca2b4393650ce716d87549
-rw-r--r-- | libhwcomposer/hwc.cpp | 9 | ||||
-rw-r--r-- | liboverlay/overlay.cpp | 7 | ||||
-rw-r--r-- | liboverlay/overlay.h | 2 |
3 files changed, 15 insertions, 3 deletions
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp index b2c43e220..b6b31d69e 100644 --- a/libhwcomposer/hwc.cpp +++ b/libhwcomposer/hwc.cpp @@ -566,7 +566,8 @@ static int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { } } - if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { + if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, + ctx->mOverlay->waitForCommitFinish())) { ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); ret = -1; } @@ -619,7 +620,8 @@ static int hwc_set_external(hwc_context_t *ctx, } } - if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { + if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, + ctx->mOverlay->waitForCommitFinish())) { ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); ret = -1; } @@ -669,7 +671,8 @@ static int hwc_set_virtual(hwc_context_t *ctx, } } - if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { + if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, + ctx->mOverlay->waitForCommitFinish())) { ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); ret = -1; } diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp index 919115300..8c85d5c65 100644 --- a/liboverlay/overlay.cpp +++ b/liboverlay/overlay.cpp @@ -65,6 +65,7 @@ void Overlay::configBegin() { void Overlay::configDone() { const int TMP_STR_BUF_SIZE = 32; + mWaitForCommitFinish = false; if(PipeBook::pipeUsageUnchanged()) return; for(int i = 0; i < PipeBook::NUM_PIPES; i++) { @@ -78,6 +79,11 @@ void Overlay::configDone() { strlcat(mDumpStr, str, DUMP_STR_MAX); } mPipeBook[i].destroy(); + // Need to wait for commit to finish when unset layers. + // Otherwise, kernel resources may not released yet for next set. + if (!mWaitForCommitFinish) { + mWaitForCommitFinish = true; + } } } dump(); @@ -384,6 +390,7 @@ void Overlay::PipeBook::destroy() { Overlay* Overlay::sInstance = 0; int Overlay::sDpyFbMap[DPY_MAX] = {0, -1,-1}; +bool Overlay::mWaitForCommitFinish = false; int Overlay::PipeBook::NUM_PIPES = 0; int Overlay::PipeBook::sPipeUsageBitmap = 0; int Overlay::PipeBook::sLastUsageBitmap = 0; diff --git a/liboverlay/overlay.h b/liboverlay/overlay.h index 23780b347..334f2bbe8 100644 --- a/liboverlay/overlay.h +++ b/liboverlay/overlay.h @@ -94,6 +94,7 @@ public: /* Returns the framebuffer node backing up the display */ static int getFbForDpy(const int& dpy); static bool displayCommit(const int& fd, uint32_t wait_for_finish = 0); + bool waitForCommitFinish() { return mWaitForCommitFinish; } private: /* Ctor setup */ @@ -156,6 +157,7 @@ private: /* Singleton Instance*/ static Overlay *sInstance; static int sDpyFbMap[DPY_MAX]; + static bool mWaitForCommitFinish; }; inline void Overlay::validate(int index) { |