diff options
-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) { |