From 7178e057d771d7886c5f31c79d684614b57bbe3f Mon Sep 17 00:00:00 2001 From: Vinu Deokaran Date: Fri, 12 Feb 2016 15:52:17 -0500 Subject: hwc: wait for commit finish when unset overlay 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 --- libhwcomposer/hwc.cpp | 9 ++++++--- liboverlay/overlay.cpp | 7 +++++++ 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) { -- cgit v1.2.3