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;
 }