summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinu Deokaran <vinud@codeaurora.org>2016-02-12 15:52:17 -0500
committerArne Coucheron <arco68@gmail.com>2020-04-25 00:30:12 +0200
commit7178e057d771d7886c5f31c79d684614b57bbe3f (patch)
tree3d69b1ef11760fdaaebb4960e165c4a791273cbc
parent3c1bd9e92e78388ebccb2a3289a9cfe034aa90dd (diff)
downloadhardware_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.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) {