Loading services/surfaceflinger/Scheduler/VSyncReactor.cpp +27 −2 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ #define LOG_TAG "VSyncReactor" //#define LOG_NDEBUG 0 #include "VSyncReactor.h" #include <cutils/properties.h> #include <log/log.h> #include <utils/Trace.h> #include "../TracedOrdinal.h" #include "TimeKeeper.h" #include "VSyncDispatch.h" #include "VSyncTracker.h" Loading @@ -32,12 +34,35 @@ nsecs_t SystemClock::now() const { return systemTime(SYSTEM_TIME_MONOTONIC); } class PredictedVsyncTracer { public: PredictedVsyncTracer(VSyncDispatch& dispatch) : mRegistration(dispatch, std::bind(&PredictedVsyncTracer::callback, this, std::placeholders::_1, std::placeholders::_2), "PredictedVsyncTracer") { mRegistration.schedule(0, 0); } private: TracedOrdinal<bool> mParity = {"VSYNC-predicted", 0}; VSyncCallbackRegistration mRegistration; void callback(nsecs_t /*vsyncTime*/, nsecs_t /*targetWakeupTim*/) { mParity = !mParity; mRegistration.schedule(0, 0); } }; VSyncReactor::VSyncReactor(std::unique_ptr<Clock> clock, std::unique_ptr<VSyncDispatch> dispatch, std::unique_ptr<VSyncTracker> tracker, size_t pendingFenceLimit) : mClock(std::move(clock)), mTracker(std::move(tracker)), mDispatch(std::move(dispatch)), mPendingLimit(pendingFenceLimit) {} mPendingLimit(pendingFenceLimit), mPredictedVsyncTracer(property_get_bool("debug.sf.show_predicted_vsync", false) ? std::make_unique<PredictedVsyncTracer>(*mDispatch) : nullptr) {} VSyncReactor::~VSyncReactor() = default; Loading Loading @@ -287,7 +312,7 @@ status_t VSyncReactor::addEventListener(const char* name, nsecs_t phase, auto it = mCallbacks.find(callback); if (it == mCallbacks.end()) { // TODO (b/146557561): resolve lastCallbackTime semantics in DispSync i/f. static auto constexpr maxListeners = 3; static auto constexpr maxListeners = 4; if (mCallbacks.size() >= maxListeners) { ALOGE("callback %s not added, exceeded callback limit of %i (currently %zu)", name, maxListeners, mCallbacks.size()); Loading services/surfaceflinger/Scheduler/VSyncReactor.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ class Clock; class VSyncDispatch; class VSyncTracker; class CallbackRepeater; class PredictedVsyncTracer; // TODO (b/145217110): consider renaming. class VSyncReactor : public android::DispSync { Loading Loading @@ -86,6 +87,8 @@ private: std::unordered_map<DispSync::Callback*, std::unique_ptr<CallbackRepeater>> mCallbacks GUARDED_BY(mMutex); const std::unique_ptr<PredictedVsyncTracer> mPredictedVsyncTracer; }; class SystemClock : public Clock { Loading Loading
services/surfaceflinger/Scheduler/VSyncReactor.cpp +27 −2 Original line number Diff line number Diff line Loading @@ -19,8 +19,10 @@ #define LOG_TAG "VSyncReactor" //#define LOG_NDEBUG 0 #include "VSyncReactor.h" #include <cutils/properties.h> #include <log/log.h> #include <utils/Trace.h> #include "../TracedOrdinal.h" #include "TimeKeeper.h" #include "VSyncDispatch.h" #include "VSyncTracker.h" Loading @@ -32,12 +34,35 @@ nsecs_t SystemClock::now() const { return systemTime(SYSTEM_TIME_MONOTONIC); } class PredictedVsyncTracer { public: PredictedVsyncTracer(VSyncDispatch& dispatch) : mRegistration(dispatch, std::bind(&PredictedVsyncTracer::callback, this, std::placeholders::_1, std::placeholders::_2), "PredictedVsyncTracer") { mRegistration.schedule(0, 0); } private: TracedOrdinal<bool> mParity = {"VSYNC-predicted", 0}; VSyncCallbackRegistration mRegistration; void callback(nsecs_t /*vsyncTime*/, nsecs_t /*targetWakeupTim*/) { mParity = !mParity; mRegistration.schedule(0, 0); } }; VSyncReactor::VSyncReactor(std::unique_ptr<Clock> clock, std::unique_ptr<VSyncDispatch> dispatch, std::unique_ptr<VSyncTracker> tracker, size_t pendingFenceLimit) : mClock(std::move(clock)), mTracker(std::move(tracker)), mDispatch(std::move(dispatch)), mPendingLimit(pendingFenceLimit) {} mPendingLimit(pendingFenceLimit), mPredictedVsyncTracer(property_get_bool("debug.sf.show_predicted_vsync", false) ? std::make_unique<PredictedVsyncTracer>(*mDispatch) : nullptr) {} VSyncReactor::~VSyncReactor() = default; Loading Loading @@ -287,7 +312,7 @@ status_t VSyncReactor::addEventListener(const char* name, nsecs_t phase, auto it = mCallbacks.find(callback); if (it == mCallbacks.end()) { // TODO (b/146557561): resolve lastCallbackTime semantics in DispSync i/f. static auto constexpr maxListeners = 3; static auto constexpr maxListeners = 4; if (mCallbacks.size() >= maxListeners) { ALOGE("callback %s not added, exceeded callback limit of %i (currently %zu)", name, maxListeners, mCallbacks.size()); Loading
services/surfaceflinger/Scheduler/VSyncReactor.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ class Clock; class VSyncDispatch; class VSyncTracker; class CallbackRepeater; class PredictedVsyncTracer; // TODO (b/145217110): consider renaming. class VSyncReactor : public android::DispSync { Loading Loading @@ -86,6 +87,8 @@ private: std::unordered_map<DispSync::Callback*, std::unique_ptr<CallbackRepeater>> mCallbacks GUARDED_BY(mMutex); const std::unique_ptr<PredictedVsyncTracer> mPredictedVsyncTracer; }; class SystemClock : public Clock { Loading