summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhwcomposer/hwc.cpp9
-rw-r--r--liboverlay/overlay.cpp7
-rw-r--r--liboverlay/overlay.h2
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) {