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/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 669cf17..37eb8ea 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -17,6 +17,9 @@
 
 #include <EGL/egl.h>
 #include <overlay.h>
+#include <cutils/properties.h>
+#include <gralloc_priv.h>
+#include <fb_priv.h>
 #include "hwc_utils.h"
 #include "mdp_version.h"
 #include "hwc_video.h"
@@ -205,4 +208,33 @@
     }
 }
 
+void wait4fbPost(hwc_context_t* ctx) {
+    framebuffer_device_t *fbDev = ctx->mFbDev;
+    if(fbDev) {
+        private_module_t* m = reinterpret_cast<private_module_t*>(
+                              fbDev->common.module);
+        //wait for the fb_post to be called
+        pthread_mutex_lock(&m->fbPostLock);
+        while(m->fbPostDone == false) {
+            pthread_cond_wait(&(m->fbPostCond), &(m->fbPostLock));
+        }
+        m->fbPostDone = false;
+        pthread_mutex_unlock(&m->fbPostLock);
+    }
+}
+
+void wait4Pan(hwc_context_t* ctx) {
+    framebuffer_device_t *fbDev = ctx->mFbDev;
+    if(fbDev) {
+        private_module_t* m = reinterpret_cast<private_module_t*>(
+                              fbDev->common.module);
+        //wait for the fb_post's PAN to finish
+        pthread_mutex_lock(&m->fbPanLock);
+        while(m->fbPanDone == false) {
+            pthread_cond_wait(&(m->fbPanCond), &(m->fbPanLock));
+        }
+        m->fbPanDone = false;
+        pthread_mutex_unlock(&m->fbPanLock);
+    }
+}
 };//namespace