Merge "sde: Add support for swapinterval 0"
diff --git a/displayengine/libs/hwc/hwc_display.cpp b/displayengine/libs/hwc/hwc_display.cpp
index 8a73d3c..724b720 100644
--- a/displayengine/libs/hwc/hwc_display.cpp
+++ b/displayengine/libs/hwc/hwc_display.cpp
@@ -33,6 +33,7 @@
 #include <utils/constants.h>
 #include <qdMetaData.h>
 #include <sync/sync.h>
+#include <cutils/properties.h>
 
 #include "hwc_display.h"
 #include "hwc_debugger.h"
@@ -45,7 +46,7 @@
                        int id)
   : core_intf_(core_intf), hwc_procs_(hwc_procs), type_(type), id_(id), display_intf_(NULL),
     flush_(false), output_buffer_(NULL), dump_frame_count_(0), dump_frame_index_(0),
-    dump_input_layers_(false) {
+    dump_input_layers_(false), swap_interval_zero_(false) {
 }
 
 int HWCDisplay::Init() {
@@ -56,6 +57,13 @@
     return -EINVAL;
   }
 
+  char property[PROPERTY_VALUE_MAX];
+  if (property_get("debug.egl.swapinterval", property, "1") > 0) {
+    if (atoi(property) == 0) {
+      swap_interval_zero_ = true;
+    }
+  }
+
   return 0;
 }
 
@@ -452,6 +460,11 @@
         layer_buffer->planes[0].stride = pvt_handle->width;
       }
 
+      // if swapinterval property is set to 0 then close and reset the acquireFd
+      if (swap_interval_zero_ && hwc_layer.acquireFenceFd >= 0) {
+        close(hwc_layer.acquireFenceFd);
+        hwc_layer.acquireFenceFd = -1;
+      }
       layer_buffer->acquire_fence_fd = hwc_layer.acquireFenceFd;
     }
 
@@ -485,6 +498,14 @@
     LayerBuffer *layer_buffer = layer_stack_.layers[i].input_buffer;
 
     if (!flush_) {
+      // if swapinterval property is set to 0 then do not update f/w release fences with driver
+      // values
+      if (swap_interval_zero_) {
+        hwc_layer.releaseFenceFd = -1;
+        close(layer_buffer->release_fence_fd);
+        layer_buffer->release_fence_fd = -1;
+      }
+
       if (layer.composition != kCompositionGPU) {
         hwc_layer.releaseFenceFd = layer_buffer->release_fence_fd;
       }
@@ -509,6 +530,11 @@
   if (!flush_) {
     layer_stack_cache_.animating = layer_stack_.flags.animating;
 
+    // if swapinterval property is set to 0 then close and reset the list retire fence
+    if (swap_interval_zero_) {
+      close(layer_stack_.retire_fence_fd);
+      layer_stack_.retire_fence_fd = -1;
+    }
     content_list->retireFenceFd = layer_stack_.retire_fence_fd;
 
     if (dump_frame_count_) {
diff --git a/displayengine/libs/hwc/hwc_display.h b/displayengine/libs/hwc/hwc_display.h
index 7ef8187..d14699f 100644
--- a/displayengine/libs/hwc/hwc_display.h
+++ b/displayengine/libs/hwc/hwc_display.h
@@ -119,6 +119,7 @@
   uint32_t dump_frame_index_;
   bool dump_input_layers_;
   uint32_t last_power_mode_;
+  bool swap_interval_zero_;
 };
 
 }  // namespace sde