hwc/fb/overlay: wait for fbpost and pan display
Draw sequence in hwc_set
--eglSwapBuffers
--wait for fb_post. Its ok to draw to External only at this point.
--draw to external | Parallel with PAN
--commit to external | Parallel with PAN
--wait for pan (happening in fb_post) to finish.
Call MSMFB_OVERLAY_SET ioctl only when params change.
These thing together ensure a correct sequence and should fix tearing and
stuttering, the latter assuming there are no other display pipeline delays.
Acked-by: Arun Kumar K.R <akumarkr@codeaurora.org>
Change-Id: Ibb0ad8485fa6b30dc6ac07ae8b25a760941c08ce
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index c795b99..d161f4a 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -131,15 +131,17 @@
bool MdpCtrl::set() {
//deferred calcs, so APIs could be called in any order.
doTransform();
- if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
- ALOGE("MdpCtrl failed to setOverlay, restoring last known "
- "good ov info");
- mdp_wrapper::dump("== Bad OVInfo is: ", mOVInfo);
- mdp_wrapper::dump("== Last good known OVInfo is: ", mLkgo);
- this->restore();
- return false;
+ if(this->ovChanged()) {
+ if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
+ ALOGE("MdpCtrl failed to setOverlay, restoring last known "
+ "good ov info");
+ mdp_wrapper::dump("== Bad OVInfo is: ", mOVInfo);
+ mdp_wrapper::dump("== Last good known OVInfo is: ", mLkgo);
+ this->restore();
+ return false;
+ }
+ this->save();
}
- this->save();
return true;
}