Only set acquire fences on overlay layers

Change-Id: I08e8173f83580de5a4e43a0ba5ea03e5ec6e8782
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 5b9327d..0d1cb45 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -300,20 +300,21 @@
     // NOTE: buffer can be NULL if the client never drew into this
     // layer yet, or if we ran out of memory
     layer.setBuffer(buffer);
+}
 
+void Layer::setAcquireFence(HWComposer::HWCLayerInterface& layer) {
+    int fenceFd = -1;
     if (mNeedHwcFence) {
         sp<Fence> fence = mSurfaceTexture->getCurrentFence();
         if (fence.get()) {
-            int fenceFd = fence->dup();
+            fenceFd = fence->dup();
             if (fenceFd == -1) {
                 ALOGW("failed to dup layer fence, skipping sync: %d", errno);
             }
-            layer.setAcquireFenceFd(fenceFd);
         }
         mNeedHwcFence = false;
-    } else {
-        layer.setAcquireFenceFd(-1);
     }
+    layer.setAcquireFenceFd(fenceFd);
 }
 
 void Layer::onDraw(const DisplayHardware& hw, const Region& clip) const
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 29515f0..b6ae0ae 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -66,6 +66,7 @@
     // LayerBase interface
     virtual void setGeometry(HWComposer::HWCLayerInterface& layer);
     virtual void setPerFrameData(HWComposer::HWCLayerInterface& layer);
+    virtual void setAcquireFence(HWComposer::HWCLayerInterface& layer);
     virtual void onDraw(const DisplayHardware& hw, const Region& clip) const;
     virtual uint32_t doTransaction(uint32_t transactionFlags);
     virtual void lockPageFlip(bool& recomputeVisibleRegions);
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index fd4c223..8350d27 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -299,6 +299,10 @@
     layer.setBuffer(0);
 }
 
+void LayerBase::setAcquireFence(HWComposer::HWCLayerInterface& layer) {
+    layer.setAcquireFenceFd(-1);
+}
+
 void LayerBase::setFiltering(bool filtering)
 {
     mFiltering = filtering;
diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index fb2e9bd..83e871c 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -115,7 +115,7 @@
 
     virtual void setGeometry(HWComposer::HWCLayerInterface& layer);
     virtual void setPerFrameData(HWComposer::HWCLayerInterface& layer);
-
+    virtual void setAcquireFence(HWComposer::HWCLayerInterface& layer);
 
     /**
      * draw - performs some global clipping optimizations
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 6dfbe5b..3b2bf00 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -528,12 +528,25 @@
     // h/w composer.
 
     const DisplayHardware& hw(getDefaultDisplayHardware());
+    HWComposer& hwc(hw.getHwComposer());
+    size_t numLayers = mVisibleLayersSortedByZ.size();
     const nsecs_t now = systemTime();
     mDebugInSwapBuffers = now;
+
+    if (hwc.initCheck() == NO_ERROR) {
+        HWComposer::LayerListIterator cur = hwc.begin();
+        const HWComposer::LayerListIterator end = hwc.end();
+        for (size_t i = 0; cur != end && i < numLayers; ++i, ++cur) {
+            if (cur->getCompositionType() == HWC_OVERLAY) {
+                mVisibleLayersSortedByZ[i]->setAcquireFence(*cur);
+            } else {
+                cur->setAcquireFenceFd(-1);
+            }
+        }
+    }
+
     hw.flip(mSwapRegion);
 
-    size_t numLayers = mVisibleLayersSortedByZ.size();
-    HWComposer& hwc(hw.getHwComposer());
     if (hwc.initCheck() == NO_ERROR) {
         HWComposer::LayerListIterator cur = hwc.begin();
         const HWComposer::LayerListIterator end = hwc.end();