Display and wfd synchronization during teardown
* Provide a binder interface call for wfd module
to inform display about the start/stop/pause/resume
of wfd session.
* This is needed for wfd-hdmi synchronization in
case of v4l2 wfd solution. If hdmi is plugged
in during v4l2 wfd session, display-hal waits in
uevent thread for wfd teardown notification from
wfd module, before going ahead with configuring
external display.
* For VDS WFD solution, display-hal waits in uevent
thread for wfd-teardown to be signalled from
the composition thread.
Change-Id: I9514cb5bc7ff81de0b5dd4cdf66d8286a64ba094
diff --git a/libhwcomposer/hwc_qclient.cpp b/libhwcomposer/hwc_qclient.cpp
index 5313795..976b23d 100644
--- a/libhwcomposer/hwc_qclient.cpp
+++ b/libhwcomposer/hwc_qclient.cpp
@@ -157,6 +157,9 @@
}
static void pauseWFD(hwc_context_t *ctx, uint32_t pause) {
+ /* TODO: Will remove pauseWFD once all the clients start using
+ * setWfdStatus to indicate the status of WFD display
+ */
int dpy = HWC_DISPLAY_VIRTUAL;
if(pause) {
//WFD Pause
@@ -167,6 +170,24 @@
}
}
+static void setWfdStatus(hwc_context_t *ctx, uint32_t wfdStatus) {
+
+ ALOGD_IF(HWC_WFDDISPSYNC_LOG,
+ "%s: Received a binder call that WFD state is %s",
+ __FUNCTION__,getExternalDisplayState(wfdStatus));
+ int dpy = HWC_DISPLAY_VIRTUAL;
+
+ if(wfdStatus == EXTERNAL_OFFLINE) {
+ ctx->mWfdSyncLock.lock();
+ ctx->mWfdSyncLock.signal();
+ ctx->mWfdSyncLock.unlock();
+ } else if(wfdStatus == EXTERNAL_PAUSE) {
+ handle_pause(ctx, dpy);
+ } else if(wfdStatus == EXTERNAL_RESUME) {
+ handle_resume(ctx, dpy);
+ }
+}
+
status_t QClient::notifyCallback(uint32_t command, const Parcel* inParcel,
Parcel* outParcel) {
status_t ret = NO_ERROR;
@@ -199,15 +220,17 @@
break;
case IQService::SET_HSIC_DATA:
setHSIC(inParcel);
+ break;
case IQService::PAUSE_WFD:
pauseWFD(mHwcContext, inParcel->readInt32());
break;
+ case IQService::SET_WFD_STATUS:
+ setWfdStatus(mHwcContext,inParcel->readInt32());
+ break;
default:
ret = NO_ERROR;
}
return ret;
}
-
-
}