From: Dan Stoza Date: Wed, 20 Jul 2016 22:38:12 +0000 (-0700) Subject: HWC2: Add properties to revert latching changes X-Git-Tag: android-x86-7.1-r1~142^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=c5da271eec001da9e11a2786f2618a45257439c3;p=android-x86%2Fframeworks-native.git HWC2: Add properties to revert latching changes Adds two properties: debug.sf.latch_unsignaled - This causes SurfaceFlinger to latch buffers even if their fences haven't signaled debug.sf.disable_backpressure - This causes SurfaceFlinger to skip propagating backpressure back to apps by not running when it detects that a prior composition missed hardware vsync Bug: 30216498 Change-Id: Idd70f472ec567a4bc03352f30f201f434cf5d660 --- diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 548b048e29..30a4d79c5b 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -51,6 +51,8 @@ #include "RenderEngine/RenderEngine.h" +#include + #define DEBUG_RESIZE 0 namespace android { @@ -1091,6 +1093,20 @@ uint32_t Layer::getProducerStickyTransform() const { return static_cast(producerStickyTransform); } +bool Layer::latchUnsignaledBuffers() { + static bool propertyLoaded = false; + static bool latch = false; + static std::mutex mutex; + std::lock_guard lock(mutex); + if (!propertyLoaded) { + char value[PROPERTY_VALUE_MAX] = {}; + property_get("debug.sf.latch_unsignaled", value, "0"); + latch = atoi(value); + propertyLoaded = true; + } + return latch; +} + uint64_t Layer::getHeadFrameNumber() const { Mutex::Autolock lock(mQueueItemLock); if (!mQueueItems.empty()) { @@ -1102,6 +1118,10 @@ uint64_t Layer::getHeadFrameNumber() const { bool Layer::headFenceHasSignaled() const { #ifdef USE_HWC2 + if (latchUnsignaledBuffers()) { + return true; + } + Mutex::Autolock lock(mQueueItemLock); if (mQueueItems.empty()) { return true; diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 78a842784f..c070539da8 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -465,6 +465,9 @@ private: // Temporary - Used only for LEGACY camera mode. uint32_t getProducerStickyTransform() const; + // Loads the corresponding system property once per process + static bool latchUnsignaledBuffers(); + // ----------------------------------------------------------------------- class SyncPoint diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index f298399ac5..8baf28c1c9 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -179,6 +179,10 @@ SurfaceFlinger::SurfaceFlinger() } ALOGI_IF(mDebugRegion, "showupdates enabled"); ALOGI_IF(mDebugDDMS, "DDMS debugging enabled"); + + property_get("debug.sf.disable_backpressure", value, "0"); + mPropagateBackpressure = !atoi(value); + ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation"); } void SurfaceFlinger::onFirstRef() @@ -924,7 +928,7 @@ void SurfaceFlinger::onMessageReceived(int32_t what) { mPreviousPresentFence != Fence::NO_FENCE && mPreviousPresentFence->getSignalTime() == INT64_MAX; ATRACE_INT("FrameMissed", static_cast(frameMissed)); - if (frameMissed) { + if (mPropagateBackpressure && frameMissed) { signalLayerUpdate(); break; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index f063aaf2c6..ad2e895ae5 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -507,6 +507,9 @@ private: bool mBootFinished; bool mForceFullDamage; FenceTracker mFenceTracker; +#ifdef USE_HWC2 + bool mPropagateBackpressure = true; +#endif // these are thread safe mutable MessageQueue mEventQueue;