From c5c5a14c06de249d8e0445fd24699e1d9aa04549 Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Mon, 2 Jul 2012 16:49:28 -0700 Subject: [PATCH] Only set acquire fences on overlay layers Change-Id: I08e8173f83580de5a4e43a0ba5ea03e5ec6e8782 --- services/surfaceflinger/Layer.cpp | 9 +++++---- services/surfaceflinger/Layer.h | 1 + services/surfaceflinger/LayerBase.cpp | 4 ++++ services/surfaceflinger/LayerBase.h | 2 +- services/surfaceflinger/SurfaceFlinger.cpp | 17 +++++++++++++++-- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 5b9327dd6..0d1cb45bb 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -300,20 +300,21 @@ void Layer::setPerFrameData(HWComposer::HWCLayerInterface& layer) { // 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 = 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 29515f04c..b6ae0ae80 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -66,6 +66,7 @@ public: // 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 fd4c22394..8350d27ce 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -299,6 +299,10 @@ void LayerBase::setPerFrameData(HWComposer::HWCLayerInterface& layer) { 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 fb2e9bd72..83e871c11 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -115,7 +115,7 @@ public: 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 6dfbe5b55..3b2bf00ed 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -528,12 +528,25 @@ void SurfaceFlinger::postFramebuffer() // 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();