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();