Merge "overlay: Reset pipes on config failure"
diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index 9b91760..a15d0a8 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -143,11 +143,15 @@
ret = true;
PipeBook::setUse((int)dest);
} else {
- PipeBook::resetUse((int)dest);
int dpy = mPipeBook[index].mDisplay;
for(int i = 0; i < PipeBook::NUM_PIPES; i++)
- if (mPipeBook[i].mDisplay == dpy)
+ if (mPipeBook[i].mDisplay == dpy) {
PipeBook::resetAllocation(i);
+ PipeBook::resetUse(i);
+ if(mPipeBook[i].valid()) {
+ mPipeBook[i].mPipe->forceSet();
+ }
+ }
}
return ret;
}
@@ -317,6 +321,9 @@
// Mark as available for this round
PipeBook::resetUse(i);
PipeBook::resetAllocation(i);
+ if(mPipeBook[i].valid()) {
+ mPipeBook[i].mPipe->forceSet();
+ }
}
}
}
diff --git a/liboverlay/overlayCtrlData.h b/liboverlay/overlayCtrlData.h
index 513ebb9..c3a7aa3 100644
--- a/liboverlay/overlayCtrlData.h
+++ b/liboverlay/overlayCtrlData.h
@@ -85,6 +85,7 @@
void dump() const;
/* Return the dump in the specified buffer */
void getDump(char *buf, size_t len);
+ void forceSet();
private:
// mdp ctrl struct(info e.g.)
@@ -224,6 +225,10 @@
mMdp.getDump(buf, len);
}
+inline void Ctrl::forceSet() {
+ mMdp.forceSet();
+}
+
inline Data::Data() {
mMdp.reset();
}
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index 4c77f2e..3e75d4e 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -54,6 +54,7 @@
mLkgo.id = MSMFB_NEW_REQUEST;
mOrientation = utils::OVERLAY_TRANSFORM_0;
mDownscale = 0;
+ mForceSet = false;
#ifdef USES_POST_PROCESSING
mPPChanged = false;
memset(&mParams, 0, sizeof(struct compute_params));
@@ -183,7 +184,8 @@
}
}
- if(this->ovChanged()) {
+ if(this->ovChanged() || mForceSet) {
+ mForceSet = false;
if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
ALOGE("MdpCtrl failed to setOverlay, restoring last known "
"good ov info");
diff --git a/liboverlay/overlayMdp.h b/liboverlay/overlayMdp.h
index f77ffae..056d982 100644
--- a/liboverlay/overlayMdp.h
+++ b/liboverlay/overlayMdp.h
@@ -81,6 +81,7 @@
utils::Dim getSrcRectDim() const;
/* setVisualParam */
bool setVisualParams(const MetaData_t& data);
+ void forceSet();
private:
/* Perform transformation calculations */
@@ -125,6 +126,8 @@
/* FD for the mdp fbnum */
OvFD mFd;
int mDownscale;
+ bool mForceSet;
+
#ifdef USES_POST_PROCESSING
/* PP Compute Params */
struct compute_params mParams;
@@ -319,6 +322,10 @@
mOVInfo.flags |= MDP_SOURCE_ROTATED_90;
}
+inline void MdpCtrl::forceSet() {
+ mForceSet = true;
+}
+
/////// MdpCtrl3D //////
inline MdpCtrl3D::MdpCtrl3D() { reset(); }
diff --git a/liboverlay/pipes/overlayGenPipe.cpp b/liboverlay/pipes/overlayGenPipe.cpp
index 90697a7..f5d4475 100644
--- a/liboverlay/pipes/overlayGenPipe.cpp
+++ b/liboverlay/pipes/overlayGenPipe.cpp
@@ -236,5 +236,8 @@
return true;
}
+void GenericPipe::forceSet() {
+ mCtrlData.ctrl.forceSet();
+}
} //namespace overlay
diff --git a/liboverlay/pipes/overlayGenPipe.h b/liboverlay/pipes/overlayGenPipe.h
index 63ffd32..5463eb8 100644
--- a/liboverlay/pipes/overlayGenPipe.h
+++ b/liboverlay/pipes/overlayGenPipe.h
@@ -74,6 +74,10 @@
void dump() const;
/* Return the dump in the specified buffer */
void getDump(char *buf, size_t len);
+ /* Marks the pipe for forcible setting of params
+ * even if they haven't changed
+ */
+ void forceSet();
private:
/* set Closed pipe */