Loading services/surfaceflinger/Layer.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ #include "RenderEngine/RenderEngine.h" #include <mutex> #define DEBUG_RESIZE 0 namespace android { Loading Loading @@ -1091,6 +1093,20 @@ uint32_t Layer::getProducerStickyTransform() const { return static_cast<uint32_t>(producerStickyTransform); } bool Layer::latchUnsignaledBuffers() { static bool propertyLoaded = false; static bool latch = false; static std::mutex mutex; std::lock_guard<std::mutex> 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()) { Loading @@ -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; Loading services/surfaceflinger/Layer.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading services/surfaceflinger/SurfaceFlinger.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -1009,7 +1013,7 @@ void SurfaceFlinger::onMessageReceived(int32_t what) { mPreviousPresentFence != Fence::NO_FENCE && mPreviousPresentFence->getSignalTime() == INT64_MAX; ATRACE_INT("FrameMissed", static_cast<int>(frameMissed)); if (frameMissed) { if (mPropagateBackpressure && frameMissed) { signalLayerUpdate(); break; } Loading services/surfaceflinger/SurfaceFlinger.h +3 −0 Original line number Diff line number Diff line Loading @@ -526,6 +526,9 @@ private: bool mBootFinished; bool mForceFullDamage; FenceTracker mFenceTracker; #ifdef USE_HWC2 bool mPropagateBackpressure = true; #endif // these are thread safe mutable MessageQueue mEventQueue; Loading Loading
services/surfaceflinger/Layer.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ #include "RenderEngine/RenderEngine.h" #include <mutex> #define DEBUG_RESIZE 0 namespace android { Loading Loading @@ -1091,6 +1093,20 @@ uint32_t Layer::getProducerStickyTransform() const { return static_cast<uint32_t>(producerStickyTransform); } bool Layer::latchUnsignaledBuffers() { static bool propertyLoaded = false; static bool latch = false; static std::mutex mutex; std::lock_guard<std::mutex> 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()) { Loading @@ -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; Loading
services/surfaceflinger/Layer.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/surfaceflinger/SurfaceFlinger.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -1009,7 +1013,7 @@ void SurfaceFlinger::onMessageReceived(int32_t what) { mPreviousPresentFence != Fence::NO_FENCE && mPreviousPresentFence->getSignalTime() == INT64_MAX; ATRACE_INT("FrameMissed", static_cast<int>(frameMissed)); if (frameMissed) { if (mPropagateBackpressure && frameMissed) { signalLayerUpdate(); break; } Loading
services/surfaceflinger/SurfaceFlinger.h +3 −0 Original line number Diff line number Diff line Loading @@ -526,6 +526,9 @@ private: bool mBootFinished; bool mForceFullDamage; FenceTracker mFenceTracker; #ifdef USE_HWC2 bool mPropagateBackpressure = true; #endif // these are thread safe mutable MessageQueue mEventQueue; Loading