hwc: Support swap interval zero
Set debug.egl.swapinterval to zero to disable
fences with MDP composition enabling swap interval zero.
This is to measure performance only and will cause tearing.
CRs-fixed: 429343
Change-Id: I1460a02d568e69826800486a9a695d7a8953d4f8
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 2f35567..b4d9827 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -238,15 +238,25 @@
int count = 0;
int releaseFd = -1;
int fbFd = -1;
+ bool swapzero = false;
data.flags = MDP_BUF_SYNC_FLAG_WAIT;
data.acq_fen_fd = acquireFd;
data.rel_fen_fd = &releaseFd;
+ char property[PROPERTY_VALUE_MAX];
+ if(property_get("debug.egl.swapinterval", property, "1") > 0) {
+ if(atoi(property) == 0)
+ swapzero = true;
+ }
+
//Accumulate acquireFenceFds
for(uint32_t i = 0; i < list->numHwLayers; i++) {
if((list->hwLayers[i].compositionType == HWC_OVERLAY ||
list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) &&
list->hwLayers[i].acquireFenceFd != -1 ){
- acquireFd[count++] = list->hwLayers[i].acquireFenceFd;
+ if(UNLIKELY(swapzero))
+ acquireFd[count++] = -1;
+ else
+ acquireFd[count++] = list->hwLayers[i].acquireFenceFd;
}
}
@@ -254,7 +264,8 @@
fbFd = ctx->dpyAttr[dpy].fd;
//Waits for acquire fences, returns a release fence
- ret = ioctl(fbFd, MSMFB_BUFFER_SYNC, &data);
+ if(LIKELY(!swapzero))
+ ret = ioctl(fbFd, MSMFB_BUFFER_SYNC, &data);
if(ret < 0) {
ALOGE("ioctl MSMFB_BUFFER_SYNC failed, err=%s",
strerror(errno));
@@ -269,10 +280,18 @@
list->hwLayers[i].acquireFenceFd = -1;
}
//Populate releaseFenceFds.
- list->hwLayers[i].releaseFenceFd = dup(releaseFd);
+ if(UNLIKELY(swapzero))
+ list->hwLayers[i].releaseFenceFd = -1;
+ else
+ list->hwLayers[i].releaseFenceFd = dup(releaseFd);
}
}
- list->retireFenceFd = releaseFd;
+ if(UNLIKELY(swapzero)){
+ list->retireFenceFd = -1;
+ close(releaseFd);
+ } else {
+ list->retireFenceFd = releaseFd;
+ }
return ret;
}