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.cpp b/libhwcomposer/hwc.cpp
index 4a73c64..a46a172 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -193,9 +193,14 @@
MDPComp::draw(ctx, list);
EGLBoolean success = eglSwapBuffers((EGLDisplay)list->dpy,
(EGLSurface)list->sur);
+ wait4fbPost(ctx);
+ //Can draw to HDMI only when fb_post is reached
UIMirrorOverlay::draw(ctx);
+ //HDMI commit and primary commit (PAN) happening in parallel
if(ctx->mExtDisplay->getExternalDisplay())
ctx->mExtDisplay->commit();
+ //Virtual barrier for threads to finish
+ wait4Pan(ctx);
} else {
ctx->mOverlay->setState(ovutils::OV_CLOSED);
ctx->qbuf->unlockAll();
diff --git a/libhwcomposer/hwc_uimirror.cpp b/libhwcomposer/hwc_uimirror.cpp
index 5f20875..c5f22af 100644
--- a/libhwcomposer/hwc_uimirror.cpp
+++ b/libhwcomposer/hwc_uimirror.cpp
@@ -154,12 +154,6 @@
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));
- }
- pthread_mutex_unlock(&m->fbPostLock);
switch (state) {
case ovutils::OV_UI_MIRROR:
if (!ov.queueBuffer(m->framebuffer->fd, m->currentOffset,
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
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index b586fa8..33446b9 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -77,6 +77,12 @@
void calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
const int fbWidth, const int fbHeight);
+// Waits for the fb_post to be called
+void wait4fbPost(hwc_context_t* ctx);
+
+// Waits for the fb_post to finish PAN (primary commit)
+void wait4Pan(hwc_context_t* ctx);
+
// Inline utility functions
static inline bool isSkipLayer(const hwc_layer_1_t* l) {
return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));