diff options
author | 2020-08-26 18:22:05 -0700 | |
---|---|---|
committer | 2020-08-28 10:39:44 -0700 | |
commit | 8cb2188b3b5b923f0a4ae2bdb73ea85c2ae00820 (patch) | |
tree | 127394526414acf3b6711e23cea499adfe45e725 | |
parent | 8735eaccd72bb6880bb02d6cca398722a01cc75e (diff) |
SurfaceFlinger: DispSync -> VsyncController
Refactor the old DispSync to separate between Vsync math (VsyncTracker)
and fence / vsync callback management (VsyncController)
Bug: 162888874
Test: examine systraces
Test: SF unit tests
Change-Id: Id275620380a21aeb0017e966910cbf24860cecef
33 files changed, 411 insertions, 388 deletions
diff --git a/libs/gui/include/gui/DisplayEventReceiver.h b/libs/gui/include/gui/DisplayEventReceiver.h index 7974a0648c..0d0d10289c 100644 --- a/libs/gui/include/gui/DisplayEventReceiver.h +++ b/libs/gui/include/gui/DisplayEventReceiver.h @@ -72,6 +72,7 @@ public: struct VSync { uint32_t count; nsecs_t expectedVSyncTimestamp __attribute__((aligned(8))); + nsecs_t deadlineTimestamp __attribute__((aligned(8))); }; struct Hotplug { diff --git a/services/surfaceflinger/BufferLayerConsumer.cpp b/services/surfaceflinger/BufferLayerConsumer.cpp index 8722952bba..94cbfa1803 100644 --- a/services/surfaceflinger/BufferLayerConsumer.cpp +++ b/services/surfaceflinger/BufferLayerConsumer.cpp @@ -25,7 +25,7 @@ #include "BufferLayerConsumer.h" #include "Layer.h" -#include "Scheduler/DispSync.h" +#include "Scheduler/VsyncController.h" #include <inttypes.h> diff --git a/services/surfaceflinger/BufferLayerConsumer.h b/services/surfaceflinger/BufferLayerConsumer.h index 5e3044fd98..a28902d964 100644 --- a/services/surfaceflinger/BufferLayerConsumer.h +++ b/services/surfaceflinger/BufferLayerConsumer.h @@ -34,7 +34,6 @@ namespace android { // ---------------------------------------------------------------------------- -class DispSync; class Layer; class String8; diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index b24855d77c..6ba1942e2b 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -38,7 +38,7 @@ #include "DisplayRenderArea.h" #include "Layer.h" #include "Promise.h" -#include "Scheduler/DispSync.h" +#include "Scheduler/VsyncController.h" #include "SurfaceFlinger.h" namespace android { @@ -249,7 +249,7 @@ void RegionSamplingThread::doSample() { // until the next vsync deadline, defer this sampling work // to a later frame, when hopefully there will be more time. DisplayStatInfo stats; - mScheduler.getDisplayStatInfo(&stats); + mScheduler.getDisplayStatInfo(&stats, systemTime()); if (std::chrono::nanoseconds(stats.vsyncTime) - now < timeForRegionSampling) { ATRACE_INT(lumaSamplingStepTag, static_cast<int>(samplingStep::waitForQuietFrame)); mDiscardedFrames++; diff --git a/services/surfaceflinger/Scheduler/DispSync.h b/services/surfaceflinger/Scheduler/DispSync.h deleted file mode 100644 index f34aabce19..0000000000 --- a/services/surfaceflinger/Scheduler/DispSync.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <stddef.h> - -#include <utils/Mutex.h> -#include <utils/RefBase.h> -#include <utils/Timers.h> - -#include <ui/FenceTime.h> - -#include <memory> - -namespace android { - -class FenceTime; - -class DispSync { -public: - DispSync() = default; - virtual ~DispSync() = default; - - virtual bool addPresentFence(const std::shared_ptr<FenceTime>&) = 0; - virtual void beginResync() = 0; - virtual bool addResyncSample(nsecs_t timestamp, std::optional<nsecs_t> hwcVsyncPeriod, - bool* periodFlushed) = 0; - virtual void setPeriod(nsecs_t period) = 0; - virtual nsecs_t getPeriod() = 0; - virtual nsecs_t computeNextRefresh(int periodOffset, nsecs_t now) const = 0; - virtual void setIgnorePresentFences(bool ignore) = 0; - virtual nsecs_t expectedPresentTime(nsecs_t now) = 0; - - virtual void dump(std::string& result) const = 0; - -protected: - DispSync(DispSync const&) = delete; - DispSync& operator=(DispSync const&) = delete; -}; - -} // namespace android diff --git a/services/surfaceflinger/Scheduler/DispSyncSource.cpp b/services/surfaceflinger/Scheduler/DispSyncSource.cpp index 75f072dcd4..ce5c31ac19 100644 --- a/services/surfaceflinger/Scheduler/DispSyncSource.cpp +++ b/services/surfaceflinger/Scheduler/DispSyncSource.cpp @@ -22,16 +22,13 @@ #include <utils/Trace.h> #include <mutex> -#include "DispSync.h" #include "EventThread.h" +#include "VsyncController.h" namespace android::scheduler { using base::StringAppendF; using namespace std::chrono_literals; -// The DispSync interface has a 'repeat this callback at rate' semantic. This object adapts -// VSyncDispatch's individually-scheduled callbacks so as to meet DispSync's existing semantic -// for now. class CallbackRepeater { public: CallbackRepeater(VSyncDispatch& dispatch, VSyncDispatch::Callback cb, const char* name, diff --git a/services/surfaceflinger/Scheduler/EventThread.cpp b/services/surfaceflinger/Scheduler/EventThread.cpp index 559626b24f..f513535658 100644 --- a/services/surfaceflinger/Scheduler/EventThread.cpp +++ b/services/surfaceflinger/Scheduler/EventThread.cpp @@ -98,11 +98,13 @@ DisplayEventReceiver::Event makeHotplug(PhysicalDisplayId displayId, nsecs_t tim } DisplayEventReceiver::Event makeVSync(PhysicalDisplayId displayId, nsecs_t timestamp, - uint32_t count, nsecs_t expectedVSyncTimestamp) { + uint32_t count, nsecs_t expectedVSyncTimestamp, + nsecs_t deadlineTimestamp) { DisplayEventReceiver::Event event; event.header = {DisplayEventReceiver::DISPLAY_EVENT_VSYNC, displayId, timestamp}; event.vsync.count = count; event.vsync.expectedVSyncTimestamp = expectedVSyncTimestamp; + event.vsync.deadlineTimestamp = deadlineTimestamp; return event; } @@ -285,12 +287,12 @@ void EventThread::onScreenAcquired() { } void EventThread::onVSyncEvent(nsecs_t timestamp, nsecs_t expectedVSyncTimestamp, - nsecs_t /*deadlineTimestamp*/) { + nsecs_t deadlineTimestamp) { std::lock_guard<std::mutex> lock(mMutex); LOG_FATAL_IF(!mVSyncState); mPendingEvents.push_back(makeVSync(mVSyncState->displayId, timestamp, ++mVSyncState->count, - expectedVSyncTimestamp)); + expectedVSyncTimestamp, deadlineTimestamp)); mCondition.notify_all(); } @@ -412,9 +414,11 @@ void EventThread::threadMain(std::unique_lock<std::mutex>& lock) { LOG_FATAL_IF(!mVSyncState); const auto now = systemTime(SYSTEM_TIME_MONOTONIC); - const auto expectedVSyncTime = now + timeout.count(); + const auto deadlineTimestamp = now + timeout.count(); + const auto expectedVSyncTime = deadlineTimestamp + timeout.count(); mPendingEvents.push_back(makeVSync(mVSyncState->displayId, now, - ++mVSyncState->count, expectedVSyncTime)); + ++mVSyncState->count, expectedVSyncTime, + deadlineTimestamp)); } } } diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp index b0b5e2eff1..5271ccc704 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.cpp +++ b/services/surfaceflinger/Scheduler/Scheduler.cpp @@ -39,7 +39,6 @@ #include <numeric> #include "../Layer.h" -#include "DispSync.h" #include "DispSyncSource.h" #include "EventThread.h" #include "InjectVSyncSource.h" @@ -50,6 +49,7 @@ #include "VSyncDispatchTimerQueue.h" #include "VSyncPredictor.h" #include "VSyncReactor.h" +#include "VsyncController.h" #define RETURN_IF_INVALID_HANDLE(handle, ...) \ do { \ @@ -124,7 +124,7 @@ Scheduler::Scheduler(const scheduler::RefreshRateConfigs& configs, ISchedulerCal Scheduler::Scheduler(const scheduler::RefreshRateConfigs& configs, ISchedulerCallback& callback, Options options) - : Scheduler(createVsyncSchedule(options), configs, callback, + : Scheduler(createVsyncSchedule(options.supportKernelTimer), configs, callback, createLayerHistory(configs, options.useContentDetectionV2), options) { using namespace sysprop; @@ -180,17 +180,17 @@ Scheduler::~Scheduler() { mIdleTimer.reset(); } -Scheduler::VsyncSchedule Scheduler::createVsyncSchedule(Options options) { +Scheduler::VsyncSchedule Scheduler::createVsyncSchedule(bool supportKernelTimer) { auto clock = std::make_unique<scheduler::SystemClock>(); auto tracker = createVSyncTracker(); auto dispatch = createVSyncDispatch(*tracker); // TODO(b/144707443): Tune constants. constexpr size_t pendingFenceLimit = 20; - auto sync = + auto controller = std::make_unique<scheduler::VSyncReactor>(std::move(clock), *tracker, pendingFenceLimit, - options.supportKernelTimer); - return {std::move(sync), std::move(tracker), std::move(dispatch)}; + supportKernelTimer); + return {std::move(controller), std::move(tracker), std::move(dispatch)}; } std::unique_ptr<LayerHistory> Scheduler::createLayerHistory( @@ -204,10 +204,6 @@ std::unique_ptr<LayerHistory> Scheduler::createLayerHistory( return std::make_unique<scheduler::impl::LayerHistory>(); } -DispSync& Scheduler::getPrimaryDispSync() { - return *mVsyncSchedule.sync; -} - std::unique_ptr<VSyncSource> Scheduler::makePrimaryDispSyncSource( const char* name, std::chrono::nanoseconds workDuration, std::chrono::nanoseconds readyDuration, bool traceVsync) { @@ -318,9 +314,9 @@ void Scheduler::setDuration(ConnectionHandle handle, std::chrono::nanoseconds wo mConnections[handle].thread->setDuration(workDuration, readyDuration); } -void Scheduler::getDisplayStatInfo(DisplayStatInfo* stats) { - stats->vsyncTime = getPrimaryDispSync().computeNextRefresh(0, systemTime()); - stats->vsyncPeriod = getPrimaryDispSync().getPeriod(); +void Scheduler::getDisplayStatInfo(DisplayStatInfo* stats, nsecs_t now) { + stats->vsyncTime = mVsyncSchedule.tracker->nextAnticipatedVSyncTimeFrom(now); + stats->vsyncPeriod = mVsyncSchedule.tracker->currentPeriod(); } Scheduler::ConnectionHandle Scheduler::enableVSyncInjection(bool enable) { @@ -357,7 +353,7 @@ bool Scheduler::injectVSync(nsecs_t when, nsecs_t expectedVSyncTime, nsecs_t dea void Scheduler::enableHardwareVsync() { std::lock_guard<std::mutex> lock(mHWVsyncLock); if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) { - getPrimaryDispSync().beginResync(); + mVsyncSchedule.tracker->resetModel(); mSchedulerCallback.setVsyncEnabled(true); mPrimaryHWVsyncEnabled = true; } @@ -406,10 +402,10 @@ void Scheduler::resync() { void Scheduler::setVsyncPeriod(nsecs_t period) { std::lock_guard<std::mutex> lock(mHWVsyncLock); - getPrimaryDispSync().setPeriod(period); + mVsyncSchedule.controller->startPeriodTransition(period); if (!mPrimaryHWVsyncEnabled) { - getPrimaryDispSync().beginResync(); + mVsyncSchedule.tracker->resetModel(); mSchedulerCallback.setVsyncEnabled(true); mPrimaryHWVsyncEnabled = true; } @@ -422,8 +418,8 @@ void Scheduler::addResyncSample(nsecs_t timestamp, std::optional<nsecs_t> hwcVsy { // Scope for the lock std::lock_guard<std::mutex> lock(mHWVsyncLock); if (mPrimaryHWVsyncEnabled) { - needsHwVsync = - getPrimaryDispSync().addResyncSample(timestamp, hwcVsyncPeriod, periodFlushed); + needsHwVsync = mVsyncSchedule.controller->addHwVsyncTimestamp(timestamp, hwcVsyncPeriod, + periodFlushed); } } @@ -435,7 +431,7 @@ void Scheduler::addResyncSample(nsecs_t timestamp, std::optional<nsecs_t> hwcVsy } void Scheduler::addPresentFence(const std::shared_ptr<FenceTime>& fenceTime) { - if (getPrimaryDispSync().addPresentFence(fenceTime)) { + if (mVsyncSchedule.controller->addPresentFence(fenceTime)) { enableHardwareVsync(); } else { disableHardwareVsync(false); @@ -443,11 +439,7 @@ void Scheduler::addPresentFence(const std::shared_ptr<FenceTime>& fenceTime) { } void Scheduler::setIgnorePresentFences(bool ignore) { - getPrimaryDispSync().setIgnorePresentFences(ignore); -} - -nsecs_t Scheduler::getDispSyncExpectedPresentTime(nsecs_t now) { - return getPrimaryDispSync().expectedPresentTime(now); + mVsyncSchedule.controller->setIgnorePresentFences(ignore); } void Scheduler::registerLayer(Layer* layer) { @@ -581,7 +573,7 @@ void Scheduler::kernelIdleTimerCallback(TimerState state) { refreshRate.getFps() <= FPS_THRESHOLD_FOR_KERNEL_TIMER) { // Disable HW VSYNC if the timer expired, as we don't need it enabled if // we're not pushing frames, and if we're in PERFORMANCE mode then we'll - // need to update the DispSync model anyway. + // need to update the VsyncController model anyway. disableHardwareVsync(false /* makeUnavailable */); } @@ -624,11 +616,11 @@ void Scheduler::dump(std::string& result) const { mLayerHistory ? mLayerHistory->dump().c_str() : "(no layer history)"); } -void Scheduler::dumpVSync(std::string& s) const { +void Scheduler::dumpVsync(std::string& s) const { using base::StringAppendF; StringAppendF(&s, "VSyncReactor:\n"); - mVsyncSchedule.sync->dump(s); + mVsyncSchedule.controller->dump(s); StringAppendF(&s, "VSyncDispatch:\n"); mVsyncSchedule.dispatch->dump(s); } diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h index 9a4ac369f3..0b5c9d2c3f 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.h +++ b/services/surfaceflinger/Scheduler/Scheduler.h @@ -40,12 +40,12 @@ namespace android { using namespace std::chrono_literals; using scheduler::LayerHistory; -class DispSync; class FenceTime; class InjectVSyncSource; class PredictedVsyncTracer; namespace scheduler { +class VsyncController; class VSyncDispatch; class VSyncTracker; } // namespace scheduler @@ -69,8 +69,6 @@ public: Scheduler(const scheduler::RefreshRateConfigs&, ISchedulerCallback&); ~Scheduler(); - DispSync& getPrimaryDispSync(); - using ConnectionHandle = scheduler::ConnectionHandle; ConnectionHandle createConnection(const char* connectionName, std::chrono::nanoseconds workDuration, @@ -95,7 +93,7 @@ public: void setDuration(ConnectionHandle, std::chrono::nanoseconds workDuration, std::chrono::nanoseconds readyDuration); - void getDisplayStatInfo(DisplayStatInfo* stats); + void getDisplayStatInfo(DisplayStatInfo* stats, nsecs_t now); // Returns injector handle if injection has toggled, or an invalid handle otherwise. ConnectionHandle enableVSyncInjection(bool enable); @@ -112,13 +110,12 @@ public: void resyncToHardwareVsync(bool makeAvailable, nsecs_t period); void resync(); - // Passes a vsync sample to DispSync. periodFlushed will be true if - // DispSync detected that the vsync period changed, and false otherwise. + // Passes a vsync sample to VsyncController. periodFlushed will be true if + // VsyncController detected that the vsync period changed, and false otherwise. void addResyncSample(nsecs_t timestamp, std::optional<nsecs_t> hwcVsyncPeriod, bool* periodFlushed); void addPresentFence(const std::shared_ptr<FenceTime>&); void setIgnorePresentFences(bool ignore); - nsecs_t getDispSyncExpectedPresentTime(nsecs_t now); // Layers are registered on creation, and unregistered when the weak reference expires. void registerLayer(Layer*); @@ -138,7 +135,7 @@ public: void dump(std::string&) const; void dump(ConnectionHandle, std::string&) const; - void dumpVSync(std::string&) const; + void dumpVsync(std::string&) const; // Get the appropriate refresh for current conditions. std::optional<HwcConfigIndexType> getPreferredConfigId(); @@ -178,7 +175,7 @@ private: }; struct VsyncSchedule { - std::unique_ptr<DispSync> sync; + std::unique_ptr<scheduler::VsyncController> controller; std::unique_ptr<scheduler::VSyncTracker> tracker; std::unique_ptr<scheduler::VSyncDispatch> dispatch; }; @@ -190,7 +187,7 @@ private: Scheduler(VsyncSchedule, const scheduler::RefreshRateConfigs&, ISchedulerCallback&, std::unique_ptr<LayerHistory>, Options); - static VsyncSchedule createVsyncSchedule(Options); + static VsyncSchedule createVsyncSchedule(bool supportKernelIdleTimer); static std::unique_ptr<LayerHistory> createLayerHistory(const scheduler::RefreshRateConfigs&, bool useContentDetectionV2); diff --git a/services/surfaceflinger/Scheduler/Timer.cpp b/services/surfaceflinger/Scheduler/Timer.cpp index 59c336ab10..c9c2d84a2a 100644 --- a/services/surfaceflinger/Scheduler/Timer.cpp +++ b/services/surfaceflinger/Scheduler/Timer.cpp @@ -89,7 +89,7 @@ nsecs_t Timer::now() const { } void Timer::alarmAt(std::function<void()> const& cb, nsecs_t time) { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); using namespace std::literals; static constexpr int ns_per_s = std::chrono::duration_cast<std::chrono::nanoseconds>(1s).count(); @@ -109,7 +109,7 @@ void Timer::alarmAt(std::function<void()> const& cb, nsecs_t time) { } void Timer::alarmCancel() { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); struct itimerspec old_timer; struct itimerspec new_timer { @@ -192,7 +192,7 @@ bool Timer::dispatch() { setDebugState(DebugState::Running); std::function<void()> cb; { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); cb = mCallback; } if (cb) { @@ -211,7 +211,7 @@ bool Timer::dispatch() { } void Timer::setDebugState(DebugState state) { - std::lock_guard lk(mMutex); + std::lock_guard lock(mMutex); mDebugState = state; } @@ -233,7 +233,7 @@ const char* Timer::strDebugState(DebugState state) const { } void Timer::dump(std::string& result) const { - std::lock_guard lk(mMutex); + std::lock_guard lock(mMutex); StringAppendF(&result, "\t\tDebugState: %s\n", strDebugState(mDebugState)); } diff --git a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp index 2154a40517..ca6ea27d14 100644 --- a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp +++ b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp @@ -185,7 +185,7 @@ VSyncDispatchTimerQueue::VSyncDispatchTimerQueue(std::unique_ptr<TimeKeeper> tk, mMinVsyncDistance(minVsyncDistance) {} VSyncDispatchTimerQueue::~VSyncDispatchTimerQueue() { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); cancelTimer(); } @@ -257,7 +257,7 @@ void VSyncDispatchTimerQueue::timerCallback() { }; std::vector<Invocation> invocations; { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); auto const now = mTimeKeeper->now(); mLastTimerCallback = now; for (auto it = mCallbacks.begin(); it != mCallbacks.end(); it++) { @@ -289,7 +289,7 @@ void VSyncDispatchTimerQueue::timerCallback() { VSyncDispatchTimerQueue::CallbackToken VSyncDispatchTimerQueue::registerCallback( Callback const& callbackFn, std::string callbackName) { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); return CallbackToken{ mCallbacks .emplace(++mCallbackToken, @@ -302,7 +302,7 @@ VSyncDispatchTimerQueue::CallbackToken VSyncDispatchTimerQueue::registerCallback void VSyncDispatchTimerQueue::unregisterCallback(CallbackToken token) { std::shared_ptr<VSyncDispatchTimerQueueEntry> entry = nullptr; { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); auto it = mCallbacks.find(token); if (it != mCallbacks.end()) { entry = it->second; @@ -319,7 +319,7 @@ ScheduleResult VSyncDispatchTimerQueue::schedule(CallbackToken token, ScheduleTiming scheduleTiming) { auto result = ScheduleResult::Error; { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); auto it = mCallbacks.find(token); if (it == mCallbacks.end()) { @@ -350,7 +350,7 @@ ScheduleResult VSyncDispatchTimerQueue::schedule(CallbackToken token, } CancelResult VSyncDispatchTimerQueue::cancel(CallbackToken token) { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); auto it = mCallbacks.find(token); if (it == mCallbacks.end()) { @@ -372,7 +372,7 @@ CancelResult VSyncDispatchTimerQueue::cancel(CallbackToken token) { } void VSyncDispatchTimerQueue::dump(std::string& result) const { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); StringAppendF(&result, "\tTimer:\n"); mTimeKeeper->dump(result); StringAppendF(&result, "\tmTimerSlack: %.2fms mMinVsyncDistance: %.2fms\n", mTimerSlack / 1e6f, diff --git a/services/surfaceflinger/Scheduler/VSyncReactor.cpp b/services/surfaceflinger/Scheduler/VSyncReactor.cpp index 3c5b3f1ff5..7b5d4626dc 100644 --- a/services/surfaceflinger/Scheduler/VSyncReactor.cpp +++ b/services/surfaceflinger/Scheduler/VSyncReactor.cpp @@ -30,6 +30,8 @@ namespace android::scheduler { using base::StringAppendF; +VsyncController::~VsyncController() = default; + Clock::~Clock() = default; nsecs_t SystemClock::now() const { return systemTime(SYSTEM_TIME_MONOTONIC); @@ -44,7 +46,7 @@ VSyncReactor::VSyncReactor(std::unique_ptr<Clock> clock, VSyncTracker& tracker, VSyncReactor::~VSyncReactor() = default; -bool VSyncReactor::addPresentFence(const std::shared_ptr<FenceTime>& fence) { +bool VSyncReactor::addPresentFence(const std::shared_ptr<android::FenceTime>& fence) { if (!fence) { return false; } @@ -91,14 +93,14 @@ bool VSyncReactor::addPresentFence(const std::shared_ptr<FenceTime>& fence) { return mMoreSamplesNeeded; } -void VSyncReactor::setIgnorePresentFences(bool ignoration) { +void VSyncReactor::setIgnorePresentFences(bool ignore) { std::lock_guard lock(mMutex); - mExternalIgnoreFences = ignoration; + mExternalIgnoreFences = ignore; updateIgnorePresentFencesInternal(); } -void VSyncReactor::setIgnorePresentFencesInternal(bool ignoration) { - mInternalIgnoreFences = ignoration; +void VSyncReactor::setIgnorePresentFencesInternal(bool ignore) { + mInternalIgnoreFences = ignore; updateIgnorePresentFencesInternal(); } @@ -108,16 +110,7 @@ void VSyncReactor::updateIgnorePresentFencesInternal() { } } -nsecs_t VSyncReactor::computeNextRefresh(int periodOffset, nsecs_t now) const { - auto const currentPeriod = periodOffset ? mTracker.currentPeriod() : 0; - return mTracker.nextAnticipatedVSyncTimeFrom(now + periodOffset * currentPeriod); -} - -nsecs_t VSyncReactor::expectedPresentTime(nsecs_t now) { - return mTracker.nextAnticipatedVSyncTimeFrom(now); -} - -void VSyncReactor::startPeriodTransition(nsecs_t newPeriod) { +void VSyncReactor::startPeriodTransitionInternal(nsecs_t newPeriod) { ATRACE_CALL(); mPeriodConfirmationInProgress = true; mPeriodTransitioningTo = newPeriod; @@ -132,28 +125,20 @@ void VSyncReactor::endPeriodTransition() { mLastHwVsync.reset(); } -void VSyncReactor::setPeriod(nsecs_t period) { +void VSyncReactor::startPeriodTransition(nsecs_t period) { ATRACE_INT64("VSR-setPeriod", period); - std::lock_guard lk(mMutex); + std::lock_guard lock(mMutex); mLastHwVsync.reset(); - if (!mSupportKernelIdleTimer && period == getPeriod()) { + if (!mSupportKernelIdleTimer && period == mTracker.currentPeriod()) { endPeriodTransition(); setIgnorePresentFencesInternal(false); mMoreSamplesNeeded = false; } else { - startPeriodTransition(period); + startPeriodTransitionInternal(period); } } -nsecs_t VSyncReactor::getPeriod() { - return mTracker.currentPeriod(); -} - -void VSyncReactor::beginResync() { - mTracker.resetModel(); -} - bool VSyncReactor::periodConfirmed(nsecs_t vsync_timestamp, std::optional<nsecs_t> HwcVsyncPeriod) { if (!mPeriodConfirmationInProgress) { return false; @@ -164,13 +149,13 @@ bool VSyncReactor::periodConfirmed(nsecs_t vsync_timestamp, std::optional<nsecs_ } const bool periodIsChanging = - mPeriodTransitioningTo && (*mPeriodTransitioningTo != getPeriod()); + mPeriodTransitioningTo && (*mPeriodTransitioningTo != mTracker.currentPeriod()); if (mSupportKernelIdleTimer && !periodIsChanging) { // Clear out the Composer-provided period and use the allowance logic below HwcVsyncPeriod = {}; } - auto const period = mPeriodTransitioningTo ? *mPeriodTransitioningTo : getPeriod(); + auto const period = mPeriodTransitioningTo ? *mPeriodTransitioningTo : mTracker.currentPeriod(); static constexpr int allowancePercent = 10; static constexpr std::ratio<allowancePercent, 100> allowancePercentRatio; auto const allowance = period * allowancePercentRatio.num / allowancePercentRatio.den; @@ -182,8 +167,8 @@ bool VSyncReactor::periodConfirmed(nsecs_t vsync_timestamp, std::optional<nsecs_ return std::abs(distance - period) < allowance; } -bool VSyncReactor::addResyncSample(nsecs_t timestamp, std::optional<nsecs_t> hwcVsyncPeriod, - bool* periodFlushed) { +bool VSyncReactor::addHwVsyncTimestamp(nsecs_t timestamp, std::optional<nsecs_t> hwcVsyncPeriod, + bool* periodFlushed) { assert(periodFlushed); std::lock_guard lock(mMutex); diff --git a/services/surfaceflinger/Scheduler/VSyncReactor.h b/services/surfaceflinger/Scheduler/VSyncReactor.h index 80b5232aa1..449d4c3bee 100644 --- a/services/surfaceflinger/Scheduler/VSyncReactor.h +++ b/services/surfaceflinger/Scheduler/VSyncReactor.h @@ -22,8 +22,8 @@ #include <mutex> #include <unordered_map> #include <vector> -#include "DispSync.h" #include "TimeKeeper.h" +#include "VsyncController.h" namespace android::scheduler { class Clock; @@ -31,32 +31,26 @@ class VSyncDispatch; class VSyncTracker; // TODO (b/145217110): consider renaming. -class VSyncReactor : public android::DispSync { +class VSyncReactor : public VsyncController { public: VSyncReactor(std::unique_ptr<Clock> clock, VSyncTracker& tracker, size_t pendingFenceLimit, bool supportKernelIdleTimer); ~VSyncReactor(); - bool addPresentFence(const std::shared_ptr<FenceTime>& fence) final; - void setIgnorePresentFences(bool ignoration) final; + bool addPresentFence(const std::shared_ptr<android::FenceTime>& fence) final; + void setIgnorePresentFences(bool ignore) final; - nsecs_t computeNextRefresh(int periodOffset, nsecs_t now) const final; - nsecs_t expectedPresentTime(nsecs_t now) final; + void startPeriodTransition(nsecs_t period) final; - void setPeriod(nsecs_t period) final; - nsecs_t getPeriod() final; - - // TODO: (b/145626181) remove begin,endResync functions from DispSync i/f when possible. - void beginResync() final; - bool addResyncSample(nsecs_t timestamp, std::optional<nsecs_t> hwcVsyncPeriod, - bool* periodFlushed) final; + bool addHwVsyncTimestamp(nsecs_t timestamp, std::optional<nsecs_t> hwcVsyncPeriod, + bool* periodFlushed) final; void dump(std::string& result) const final; private: - void setIgnorePresentFencesInternal(bool ignoration) REQUIRES(mMutex); + void setIgnorePresentFencesInternal(bool ignore) REQUIRES(mMutex); void updateIgnorePresentFencesInternal() REQUIRES(mMutex); - void startPeriodTransition(nsecs_t newPeriod) REQUIRES(mMutex); + void startPeriodTransitionInternal(nsecs_t newPeriod) REQUIRES(mMutex); void endPeriodTransition() REQUIRES(mMutex); bool periodConfirmed(nsecs_t vsync_timestamp, std::optional<nsecs_t> hwcVsyncPeriod) REQUIRES(mMutex); @@ -68,7 +62,7 @@ private: mutable std::mutex mMutex; bool mInternalIgnoreFences GUARDED_BY(mMutex) = false; bool mExternalIgnoreFences GUARDED_BY(mMutex) = false; - std::vector<std::shared_ptr<FenceTime>> mUnfiredFences GUARDED_BY(mMutex); + std::vector<std::shared_ptr<android::FenceTime>> mUnfiredFences GUARDED_BY(mMutex); bool mMoreSamplesNeeded GUARDED_BY(mMutex) = false; bool mPeriodConfirmationInProgress GUARDED_BY(mMutex) = false; diff --git a/services/surfaceflinger/Scheduler/VsyncController.h b/services/surfaceflinger/Scheduler/VsyncController.h new file mode 100644 index 0000000000..0f0df222f4 --- /dev/null +++ b/services/surfaceflinger/Scheduler/VsyncController.h @@ -0,0 +1,85 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <cstddef> + +#include <utils/Mutex.h> +#include <utils/RefBase.h> +#include <utils/Timers.h> + +#include <ui/FenceTime.h> + +#include <memory> + +namespace android::scheduler { + +class FenceTime; + +class VsyncController { +public: + virtual ~VsyncController(); + + /* + * Adds a present fence to the model. The controller will use the fence time as + * a vsync signal. + * + * \param [in] fence The present fence given from the display + * \return True if the model needs more vsync signals to make + * an accurate prediction, + * False otherwise + */ + virtual bool addPresentFence(const std::shared_ptr<android::FenceTime>&) = 0; + + /* + * Adds a hw sync timestamp to the model. The controller will use the timestamp + * time as a vsync signal. + * + * \param [in] timestamp The HW Vsync timestamp + * \param [in] hwcVsyncPeriod The Vsync period reported by composer, if available + * \param [out] periodFlushed True if the vsync period changed is completed + * \return True if the model needs more vsync signals to make + * an accurate prediction, + * False otherwise + */ + virtual bool addHwVsyncTimestamp(nsecs_t timestamp, std::optional<nsecs_t> hwcVsyncPeriod, + bool* periodFlushed) = 0; + + /* + * Inform the controller that the period is changing and the controller needs to recalibrate + * itself. The controller will end the period transition internally. + * + * \param [in] period The period that the system is changing into. + */ + virtual void startPeriodTransition(nsecs_t period) = 0; + + /* + * Tells the tracker to stop using present fences to get a vsync signal. + * + * \param [in] ignore Whether to ignore the present fences or not + */ + virtual void setIgnorePresentFences(bool ignore) = 0; + + virtual void dump(std::string& result) const = 0; + +protected: + VsyncController() = default; + VsyncController(VsyncController const&) = delete; + VsyncController& operator=(VsyncController const&) = delete; +}; + +} // namespace android::scheduler diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index ccbb569500..0d5cacdcf3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -117,13 +117,13 @@ #include "Promise.h" #include "RefreshRateOverlay.h" #include "RegionSamplingThread.h" -#include "Scheduler/DispSync.h" #include "Scheduler/DispSyncSource.h" #include "Scheduler/EventThread.h" #include "Scheduler/LayerHistory.h" #include "Scheduler/MessageQueue.h" #include "Scheduler/Scheduler.h" #include "Scheduler/VsyncConfiguration.h" +#include "Scheduler/VsyncController.h" #include "StartPropertySetThread.h" #include "SurfaceFlingerProperties.h" #include "SurfaceInterceptor.h" @@ -961,7 +961,7 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken, // // Normally it's one full refresh period (to give SF a chance to // latch the buffer), but this can be reduced by configuring a - // DispSync offset. Any additional delays introduced by the hardware + // VsyncController offset. Any additional delays introduced by the hardware // composer or panel must be accounted for here. // // We add an additional 1ms to allow for processing time and @@ -979,7 +979,7 @@ status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>&, DisplayStatInfo* st return BAD_VALUE; } - mScheduler->getDisplayStatInfo(stats); + mScheduler->getDisplayStatInfo(stats, systemTime()); return NO_ERROR; } @@ -1037,7 +1037,7 @@ void SurfaceFlinger::setDesiredActiveConfig(const ActiveConfigInfo& info) { // switch. mScheduler->resyncToHardwareVsync(true, refreshRate.getVsyncPeriod()); // As we called to set period, we will call to onRefreshRateChangeCompleted once - // DispSync model is locked. + // VsyncController model is locked. modulateVsync(&VsyncModulator::onRefreshRateChangeInitiated); updatePhaseConfiguration(refreshRate); @@ -1824,11 +1824,10 @@ nsecs_t SurfaceFlinger::previousFramePresentTime() { nsecs_t SurfaceFlinger::calculateExpectedPresentTime(nsecs_t now) const { DisplayStatInfo stats; - mScheduler->getDisplayStatInfo(&stats); - const nsecs_t presentTime = mScheduler->getDispSyncExpectedPresentTime(now); + mScheduler->getDisplayStatInfo(&stats, now); // Inflate the expected present time if we're targetting the next vsync. - return mVsyncModulator->getVsyncConfig().sfOffset > 0 ? presentTime - : presentTime + stats.vsyncPeriod; + return mVsyncModulator->getVsyncConfig().sfOffset > 0 ? stats.vsyncTime + : stats.vsyncTime + stats.vsyncPeriod; } void SurfaceFlinger::onMessageReceived(int32_t what, nsecs_t expectedVSyncTime) { @@ -1874,7 +1873,7 @@ void SurfaceFlinger::onMessageInvalidate(nsecs_t expectedVSyncTime) { // smaller than a typical frame duration, but should not be so small // that it reports reasonable drift as a missed frame. DisplayStatInfo stats; - mScheduler->getDisplayStatInfo(&stats); + mScheduler->getDisplayStatInfo(&stats, systemTime()); const nsecs_t frameMissedSlop = stats.vsyncPeriod / 2; const nsecs_t previousPresentTime = previousFramePresentTime(); const TracedOrdinal<bool> frameMissed = {"PrevFrameMissed", @@ -2247,7 +2246,7 @@ void SurfaceFlinger::postComposition() getBE().mDisplayTimeline.push(presentFenceTime); DisplayStatInfo stats; - mScheduler->getDisplayStatInfo(&stats); + mScheduler->getDisplayStatInfo(&stats, systemTime()); // We use the CompositionEngine::getLastFrameRefreshTimestamp() which might // be sampled a little later than when we started doing work for this frame, @@ -4352,7 +4351,7 @@ status_t SurfaceFlinger::doDump(int fd, const DumpArgs& args, bool asProto) { } else { static const std::unordered_map<std::string, Dumper> dumpers = { {"--display-id"s, dumper(&SurfaceFlinger::dumpDisplayIdentificationData)}, - {"--dispsync"s, dumper([this](std::string& s) { mScheduler->dumpVSync(s); })}, + {"--dispsync"s, dumper([this](std::string& s) { mScheduler->dumpVsync(s); })}, {"--edid"s, argsDumper(&SurfaceFlinger::dumpRawDisplayIdentificationData)}, {"--frame-events"s, dumper(&SurfaceFlinger::dumpFrameEventsLocked)}, {"--latency"s, argsDumper(&SurfaceFlinger::dumpStatsLocked)}, @@ -4499,7 +4498,7 @@ void SurfaceFlinger::dumpVSync(std::string& result) const { } mScheduler->dump(mAppConnectionHandle, result); - mScheduler->getPrimaryDispSync().dump(result); + mScheduler->dumpVsync(result); } void SurfaceFlinger::dumpStaticScreenStats(std::string& result) const { diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index c53ae3e118..9fddf552c4 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -219,7 +219,7 @@ public: // If fences from sync Framework are supported. static bool hasSyncFramework; - // The offset in nanoseconds to use when DispSync timestamps present fence + // The offset in nanoseconds to use when VsyncController timestamps present fence // signaling time. static int64_t dispSyncPresentTimeOffset; diff --git a/services/surfaceflinger/SurfaceFlingerDefaultFactory.cpp b/services/surfaceflinger/SurfaceFlingerDefaultFactory.cpp index 2e52155be4..fb08e695de 100644 --- a/services/surfaceflinger/SurfaceFlingerDefaultFactory.cpp +++ b/services/surfaceflinger/SurfaceFlingerDefaultFactory.cpp @@ -37,10 +37,10 @@ #include "SurfaceInterceptor.h" #include "DisplayHardware/ComposerHal.h" -#include "Scheduler/DispSync.h" #include "Scheduler/MessageQueue.h" #include "Scheduler/Scheduler.h" #include "Scheduler/VsyncConfiguration.h" +#include "Scheduler/VsyncController.h" namespace android::surfaceflinger { diff --git a/services/surfaceflinger/SurfaceFlingerFactory.h b/services/surfaceflinger/SurfaceFlingerFactory.h index a0dd9992bb..753476efe7 100644 --- a/services/surfaceflinger/SurfaceFlingerFactory.h +++ b/services/surfaceflinger/SurfaceFlingerFactory.h @@ -34,7 +34,6 @@ class BufferLayerConsumer; class EffectLayer; class ContainerLayer; class DisplayDevice; -class DispSync; class GraphicBuffer; class HWComposer; class IGraphicBufferConsumer; @@ -56,6 +55,7 @@ class CompositionEngine; namespace scheduler { class VsyncConfiguration; +class VsyncController; class RefreshRateConfigs; } // namespace scheduler diff --git a/services/surfaceflinger/tests/unittests/Android.bp b/services/surfaceflinger/tests/unittests/Android.bp index 8d4aa0c4a6..a90f672898 100644 --- a/services/surfaceflinger/tests/unittests/Android.bp +++ b/services/surfaceflinger/tests/unittests/Android.bp @@ -68,13 +68,14 @@ cc_test { "mock/DisplayHardware/MockComposer.cpp", "mock/DisplayHardware/MockDisplay.cpp", "mock/DisplayHardware/MockPowerAdvisor.cpp", - "mock/MockDispSync.cpp", "mock/MockEventThread.cpp", + "mock/MockFrameTracer.cpp", "mock/MockMessageQueue.cpp", "mock/MockNativeWindowSurface.cpp", "mock/MockSurfaceInterceptor.cpp", "mock/MockTimeStats.cpp", - "mock/MockFrameTracer.cpp", + "mock/MockVsyncController.cpp", + "mock/MockVSyncTracker.cpp", "mock/system/window/MockNativeWindow.cpp", ], static_libs: [ diff --git a/services/surfaceflinger/tests/unittests/CompositionTest.cpp b/services/surfaceflinger/tests/unittests/CompositionTest.cpp index 4843f059dc..159a215667 100644 --- a/services/surfaceflinger/tests/unittests/CompositionTest.cpp +++ b/services/surfaceflinger/tests/unittests/CompositionTest.cpp @@ -41,10 +41,10 @@ #include "TestableSurfaceFlinger.h" #include "mock/DisplayHardware/MockComposer.h" #include "mock/DisplayHardware/MockPowerAdvisor.h" -#include "mock/MockDispSync.h" #include "mock/MockEventThread.h" #include "mock/MockMessageQueue.h" #include "mock/MockTimeStats.h" +#include "mock/MockVsyncController.h" #include "mock/system/window/MockNativeWindow.h" namespace android { @@ -142,17 +142,19 @@ public: new EventThreadConnection(sfEventThread.get(), ResyncCallback(), ISurfaceComposer::eConfigChangedSuppress))); - auto primaryDispSync = std::make_unique<mock::DispSync>(); + auto vsyncController = std::make_unique<mock::VsyncController>(); + auto vsyncTracker = std::make_unique<mock::VSyncTracker>(); - EXPECT_CALL(*primaryDispSync, computeNextRefresh(0, _)).WillRepeatedly(Return(0)); - EXPECT_CALL(*primaryDispSync, getPeriod()) + EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); + EXPECT_CALL(*vsyncTracker, currentPeriod()) .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE)); - EXPECT_CALL(*primaryDispSync, expectedPresentTime(_)).WillRepeatedly(Return(0)); + EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); constexpr ISchedulerCallback* kCallback = nullptr; constexpr bool kHasMultipleConfigs = true; - mFlinger.setupScheduler(std::move(primaryDispSync), std::move(eventThread), - std::move(sfEventThread), kCallback, kHasMultipleConfigs); + mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker), + std::move(eventThread), std::move(sfEventThread), kCallback, + kHasMultipleConfigs); // Layer history should be created if there are multiple configs. ASSERT_TRUE(mFlinger.scheduler()->hasLayerHistory()); diff --git a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp index b9c9fe7686..b939b9a197 100644 --- a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +++ b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp @@ -45,12 +45,12 @@ #include "TestableSurfaceFlinger.h" #include "mock/DisplayHardware/MockComposer.h" #include "mock/DisplayHardware/MockPowerAdvisor.h" -#include "mock/MockDispSync.h" #include "mock/MockEventThread.h" #include "mock/MockMessageQueue.h" #include "mock/MockNativeWindowSurface.h" #include "mock/MockSchedulerCallback.h" #include "mock/MockSurfaceInterceptor.h" +#include "mock/MockVsyncController.h" #include "mock/system/window/MockNativeWindow.h" namespace android { @@ -155,7 +155,8 @@ public: mock::MessageQueue* mMessageQueue = new mock::MessageQueue(); mock::SurfaceInterceptor* mSurfaceInterceptor = new mock::SurfaceInterceptor(); - mock::DispSync* mPrimaryDispSync = new mock::DispSync; + mock::VsyncController* mVsyncController = new mock::VsyncController; + mock::VSyncTracker* mVSyncTracker = new mock::VSyncTracker; mock::SchedulerCallback mSchedulerCallback; mock::EventThread* mEventThread = new mock::EventThread; mock::EventThread* mSFEventThread = new mock::EventThread; @@ -213,7 +214,8 @@ void DisplayTransactionTest::injectMockScheduler() { .WillOnce(Return(new EventThreadConnection(mSFEventThread, ResyncCallback(), ISurfaceComposer::eConfigChangedSuppress))); - mFlinger.setupScheduler(std::unique_ptr<DispSync>(mPrimaryDispSync), + mFlinger.setupScheduler(std::unique_ptr<scheduler::VsyncController>(mVsyncController), + std::unique_ptr<scheduler::VSyncTracker>(mVSyncTracker), std::unique_ptr<EventThread>(mEventThread), std::unique_ptr<EventThread>(mSFEventThread), &mSchedulerCallback); } @@ -3128,7 +3130,7 @@ TEST_F(DisplayTransactionTest, onInitializeDisplaysSetsUpPrimaryDisplay) { // processing. EXPECT_CALL(*mMessageQueue, invalidate()).Times(1); - EXPECT_CALL(*mPrimaryDispSync, expectedPresentTime(_)).WillRepeatedly(Return(0)); + EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); // -------------------------------------------------------------------- // Invocation @@ -3259,15 +3261,14 @@ struct EventThreadIsSupportedVariant : public EventThreadBaseSupportedVariant { }; struct DispSyncIsSupportedVariant { - static void setupBeginResyncCallExpectations(DisplayTransactionTest* test) { - EXPECT_CALL(*test->mPrimaryDispSync, setPeriod(DEFAULT_REFRESH_RATE)).Times(1); - EXPECT_CALL(*test->mPrimaryDispSync, beginResync()).Times(1); + static void setupResetModelCallExpectations(DisplayTransactionTest* test) { + EXPECT_CALL(*test->mVsyncController, startPeriodTransition(DEFAULT_REFRESH_RATE)).Times(1); + EXPECT_CALL(*test->mVSyncTracker, resetModel()).Times(1); } }; struct DispSyncNotSupportedVariant { - static void setupBeginResyncCallExpectations(DisplayTransactionTest* /* test */) {} - + static void setupResetModelCallExpectations(DisplayTransactionTest* /* test */) {} }; // -------------------------------------------------------------------- @@ -3290,7 +3291,7 @@ struct TransitionOffToOnVariant : public TransitionVariantCommon<PowerMode::OFF, static void setupCallExpectations(DisplayTransactionTest* test) { Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON); Case::EventThread::setupAcquireAndEnableVsyncCallExpectations(test); - Case::DispSync::setupBeginResyncCallExpectations(test); + Case::DispSync::setupResetModelCallExpectations(test); Case::setupRepaintEverythingCallExpectations(test); } @@ -3353,7 +3354,7 @@ struct TransitionDozeSuspendToDozeVariant template <typename Case> static void setupCallExpectations(DisplayTransactionTest* test) { Case::EventThread::setupAcquireAndEnableVsyncCallExpectations(test); - Case::DispSync::setupBeginResyncCallExpectations(test); + Case::DispSync::setupResetModelCallExpectations(test); Case::setupComposerCallExpectations(test, Case::Doze::ACTUAL_POWER_MODE_FOR_DOZE); } }; @@ -3371,7 +3372,7 @@ struct TransitionDozeSuspendToOnVariant template <typename Case> static void setupCallExpectations(DisplayTransactionTest* test) { Case::EventThread::setupAcquireAndEnableVsyncCallExpectations(test); - Case::DispSync::setupBeginResyncCallExpectations(test); + Case::DispSync::setupResetModelCallExpectations(test); Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON); } }; diff --git a/services/surfaceflinger/tests/unittests/RefreshRateSelectionTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateSelectionTest.cpp index f6bf05add8..409f90d9f9 100644 --- a/services/surfaceflinger/tests/unittests/RefreshRateSelectionTest.cpp +++ b/services/surfaceflinger/tests/unittests/RefreshRateSelectionTest.cpp @@ -14,10 +14,6 @@ * limitations under the License. */ -// TODO(b/129481165): remove the #pragma below and fix conversion issues -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wconversion" - #undef LOG_TAG #define LOG_TAG "LibSurfaceFlingerUnittests" @@ -31,8 +27,8 @@ #include "Layer.h" #include "TestableSurfaceFlinger.h" #include "mock/DisplayHardware/MockComposer.h" -#include "mock/MockDispSync.h" #include "mock/MockEventThread.h" +#include "mock/MockVsyncController.h" namespace android { @@ -64,7 +60,7 @@ protected: static constexpr int32_t PRIORITY_UNSET = -1; void setupScheduler(); - void setupComposer(int virtualDisplayCount); + void setupComposer(uint32_t virtualDisplayCount); sp<BufferQueueLayer> createBufferQueueLayer(); sp<BufferStateLayer> createBufferStateLayer(); sp<EffectLayer> createEffectLayer(); @@ -139,17 +135,18 @@ void RefreshRateSelectionTest::setupScheduler() { .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), ResyncCallback(), ISurfaceComposer::eConfigChangedSuppress))); - auto primaryDispSync = std::make_unique<mock::DispSync>(); + auto vsyncController = std::make_unique<mock::VsyncController>(); + auto vsyncTracker = std::make_unique<mock::VSyncTracker>(); - EXPECT_CALL(*primaryDispSync, computeNextRefresh(0, _)).WillRepeatedly(Return(0)); - EXPECT_CALL(*primaryDispSync, getPeriod()) + EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); + EXPECT_CALL(*vsyncTracker, currentPeriod()) .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE)); - EXPECT_CALL(*primaryDispSync, expectedPresentTime(_)).WillRepeatedly(Return(0)); - mFlinger.setupScheduler(std::move(primaryDispSync), std::move(eventThread), - std::move(sfEventThread)); + EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); + mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker), + std::move(eventThread), std::move(sfEventThread)); } -void RefreshRateSelectionTest::setupComposer(int virtualDisplayCount) { +void RefreshRateSelectionTest::setupComposer(uint32_t virtualDisplayCount) { mComposer = new Hwc2::mock::Composer(); EXPECT_CALL(*mComposer, getMaxVirtualDisplayCount()).WillOnce(Return(virtualDisplayCount)); mFlinger.setupComposer(std::unique_ptr<Hwc2::Composer>(mComposer)); @@ -281,6 +278,3 @@ TEST_F(RefreshRateSelectionTest, testPriorityOnEffectLayers) { } // namespace } // namespace android - -// TODO(b/129481165): remove the #pragma below and fix conversion issues -#pragma clang diagnostic pop // ignored "-Wconversion" diff --git a/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp b/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp index 6c01f85fc7..d4591fc4f2 100644 --- a/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp +++ b/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp @@ -32,9 +32,9 @@ #pragma clang diagnostic pop // ignored "-Wconversion" #include "TestableSurfaceFlinger.h" #include "mock/DisplayHardware/MockComposer.h" -#include "mock/MockDispSync.h" #include "mock/MockEventThread.h" #include "mock/MockMessageQueue.h" +#include "mock/MockVsyncController.h" namespace android { @@ -175,14 +175,15 @@ void SetFrameRateTest::setupScheduler() { .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), ResyncCallback(), ISurfaceComposer::eConfigChangedSuppress))); - auto primaryDispSync = std::make_unique<mock::DispSync>(); + auto vsyncController = std::make_unique<mock::VsyncController>(); + auto vsyncTracker = std::make_unique<mock::VSyncTracker>(); - EXPECT_CALL(*primaryDispSync, computeNextRefresh(0, _)).WillRepeatedly(Return(0)); - EXPECT_CALL(*primaryDispSync, getPeriod()) + EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); + EXPECT_CALL(*vsyncTracker, currentPeriod()) .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE)); - EXPECT_CALL(*primaryDispSync, expectedPresentTime(_)).WillRepeatedly(Return(0)); - mFlinger.setupScheduler(std::move(primaryDispSync), std::move(eventThread), - std::move(sfEventThread)); + EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); + mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker), + std::move(eventThread), std::move(sfEventThread)); } void SetFrameRateTest::setupComposer(uint32_t virtualDisplayCount) { diff --git a/services/surfaceflinger/tests/unittests/TestableScheduler.h b/services/surfaceflinger/tests/unittests/TestableScheduler.h index ebb2d76d1e..db3e0bd525 100644 --- a/services/surfaceflinger/tests/unittests/TestableScheduler.h +++ b/services/surfaceflinger/tests/unittests/TestableScheduler.h @@ -19,12 +19,13 @@ #include <gmock/gmock.h> #include <gui/ISurfaceComposer.h> -#include "Scheduler/DispSync.h" #include "Scheduler/EventThread.h" #include "Scheduler/LayerHistory.h" #include "Scheduler/Scheduler.h" #include "Scheduler/VSyncTracker.h" -#include "mock/MockDispSync.h" +#include "Scheduler/VsyncController.h" +#include "mock/MockVSyncTracker.h" +#include "mock/MockVsyncController.h" namespace android { @@ -32,14 +33,16 @@ class TestableScheduler : public Scheduler { public: TestableScheduler(const scheduler::RefreshRateConfigs& configs, ISchedulerCallback& callback, bool useContentDetectionV2) - : TestableScheduler(std::make_unique<mock::DispSync>(), configs, callback, + : TestableScheduler(std::make_unique<mock::VsyncController>(), + std::make_unique<mock::VSyncTracker>(), configs, callback, useContentDetectionV2) {} - TestableScheduler(std::unique_ptr<DispSync> primaryDispSync, + TestableScheduler(std::unique_ptr<scheduler::VsyncController> vsyncController, + std::unique_ptr<scheduler::VSyncTracker> vsyncTracker, const scheduler::RefreshRateConfigs& configs, ISchedulerCallback& callback, bool useContentDetectionV2) - : Scheduler({std::move(primaryDispSync), nullptr, nullptr}, configs, callback, - createLayerHistory(configs, useContentDetectionV2), + : Scheduler({std::move(vsyncController), std::move(vsyncTracker), nullptr}, configs, + callback, createLayerHistory(configs, useContentDetectionV2), {.supportKernelTimer = false, .useContentDetection = true, .useContentDetectionV2 = useContentDetectionV2}) {} @@ -95,7 +98,7 @@ public: // not report a leaked object, since the Scheduler instance may // still be referenced by something despite our best efforts to destroy // it after each test is done. - mVsyncSchedule.sync.reset(); + mVsyncSchedule.controller.reset(); mConnections.clear(); } }; diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index 8c4232df88..b024568cbc 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -189,7 +189,8 @@ public: } // The ISchedulerCallback argument can be nullptr for a no-op implementation. - void setupScheduler(std::unique_ptr<DispSync> primaryDispSync, + void setupScheduler(std::unique_ptr<scheduler::VsyncController> vsyncController, + std::unique_ptr<scheduler::VSyncTracker> vsyncTracker, std::unique_ptr<EventThread> appEventThread, std::unique_ptr<EventThread> sfEventThread, ISchedulerCallback* callback = nullptr, bool hasMultipleConfigs = false) { @@ -217,9 +218,9 @@ public: mFlinger->mVsyncModulator.emplace(mFlinger->mVsyncConfiguration->getCurrentConfigs()); constexpr bool kUseContentDetectionV2 = false; - mScheduler = - new TestableScheduler(std::move(primaryDispSync), *mFlinger->mRefreshRateConfigs, - *(callback ?: this), kUseContentDetectionV2); + mScheduler = new TestableScheduler(std::move(vsyncController), std::move(vsyncTracker), + *mFlinger->mRefreshRateConfigs, *(callback ?: this), + kUseContentDetectionV2); mFlinger->mAppConnectionHandle = mScheduler->createConnection(std::move(appEventThread)); mFlinger->mSfConnectionHandle = mScheduler->createConnection(std::move(sfEventThread)); diff --git a/services/surfaceflinger/tests/unittests/TransactionApplicationTest.cpp b/services/surfaceflinger/tests/unittests/TransactionApplicationTest.cpp index 44b3dc0ea1..28415bcb12 100644 --- a/services/surfaceflinger/tests/unittests/TransactionApplicationTest.cpp +++ b/services/surfaceflinger/tests/unittests/TransactionApplicationTest.cpp @@ -31,9 +31,9 @@ #include "TestableScheduler.h" #include "TestableSurfaceFlinger.h" -#include "mock/MockDispSync.h" #include "mock/MockEventThread.h" #include "mock/MockMessageQueue.h" +#include "mock/MockVsyncController.h" namespace android { @@ -75,11 +75,12 @@ public: new EventThreadConnection(sfEventThread.get(), ResyncCallback(), ISurfaceComposer::eConfigChangedSuppress))); - EXPECT_CALL(*mPrimaryDispSync, computeNextRefresh(0, _)).WillRepeatedly(Return(0)); - EXPECT_CALL(*mPrimaryDispSync, getPeriod()) + EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); + EXPECT_CALL(*mVSyncTracker, currentPeriod()) .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_REFRESH_RATE)); - mFlinger.setupScheduler(std::unique_ptr<mock::DispSync>(mPrimaryDispSync), + mFlinger.setupScheduler(std::unique_ptr<mock::VsyncController>(mVsyncController), + std::unique_ptr<mock::VSyncTracker>(mVSyncTracker), std::move(eventThread), std::move(sfEventThread)); } @@ -89,7 +90,8 @@ public: std::unique_ptr<mock::EventThread> mEventThread = std::make_unique<mock::EventThread>(); mock::MessageQueue* mMessageQueue = new mock::MessageQueue(); - mock::DispSync* mPrimaryDispSync = new mock::DispSync(); + mock::VsyncController* mVsyncController = new mock::VsyncController(); + mock::VSyncTracker* mVSyncTracker = new mock::VSyncTracker(); struct TransactionInfo { Vector<ComposerState> states; @@ -123,7 +125,7 @@ public: ASSERT_EQ(0, mFlinger.getTransactionQueue().size()); // called in SurfaceFlinger::signalTransaction EXPECT_CALL(*mMessageQueue, invalidate()).Times(1); - EXPECT_CALL(*mPrimaryDispSync, expectedPresentTime(_)).WillOnce(Return(systemTime())); + EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillOnce(Return(systemTime())); TransactionInfo transaction; setupSingle(transaction, flags, syncInputWindows, /*desiredPresentTime*/ -1); @@ -156,7 +158,7 @@ public: // first check will see desired present time has not passed, // but afterwards it will look like the desired present time has passed nsecs_t time = systemTime(); - EXPECT_CALL(*mPrimaryDispSync, expectedPresentTime(_)) + EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)) .WillOnce(Return(time + nsecs_t(5 * 1e8))); TransactionInfo transaction; setupSingle(transaction, flags, syncInputWindows, @@ -179,7 +181,7 @@ public: // called in SurfaceFlinger::signalTransaction nsecs_t time = systemTime(); EXPECT_CALL(*mMessageQueue, invalidate()).Times(1); - EXPECT_CALL(*mPrimaryDispSync, expectedPresentTime(_)) + EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)) .WillOnce(Return(time + nsecs_t(5 * 1e8))); // transaction that should go on the pending thread TransactionInfo transactionA; @@ -244,7 +246,7 @@ TEST_F(TransactionApplicationTest, Flush_RemovesFromQueue) { EXPECT_CALL(*mMessageQueue, invalidate()).Times(1); // nsecs_t time = systemTime(); - EXPECT_CALL(*mPrimaryDispSync, expectedPresentTime(_)) + EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)) .WillOnce(Return(nsecs_t(5 * 1e8))) .WillOnce(Return(s2ns(2))); TransactionInfo transactionA; // transaction to go on pending queue diff --git a/services/surfaceflinger/tests/unittests/VSyncDispatchRealtimeTest.cpp b/services/surfaceflinger/tests/unittests/VSyncDispatchRealtimeTest.cpp index 3408fed3e0..1e5139c49e 100644 --- a/services/surfaceflinger/tests/unittests/VSyncDispatchRealtimeTest.cpp +++ b/services/surfaceflinger/tests/unittests/VSyncDispatchRealtimeTest.cpp @@ -65,7 +65,7 @@ public: bool addVsyncTimestamp(nsecs_t) final { return true; } nsecs_t nextAnticipatedVSyncTimeFrom(nsecs_t time_point) const final { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); auto const normalized_to_base = time_point - mBase; auto const floor = (normalized_to_base) % mPeriod; if (floor == 0) { @@ -75,13 +75,13 @@ public: } void set_interval(nsecs_t interval, nsecs_t last_known) { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); mPeriod = interval; mBase = last_known; } nsecs_t currentPeriod() const final { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); return mPeriod; } @@ -118,11 +118,11 @@ public: .earliestVsync = systemTime(SYSTEM_TIME_MONOTONIC) + mWorkload + mReadyDuration}); for (auto i = 0u; i < iterations - 1; i++) { - std::unique_lock<decltype(mMutex)> lk(mMutex); - mCv.wait(lk, [&] { return mCalled; }); + std::unique_lock lock(mMutex); + mCv.wait(lock, [&] { return mCalled; }); mCalled = false; auto last = mLastTarget; - lk.unlock(); + lock.unlock(); onEachFrame(last); @@ -132,8 +132,8 @@ public: } // wait for the last callback. - std::unique_lock<decltype(mMutex)> lk(mMutex); - mCv.wait(lk, [&] { return mCalled; }); + std::unique_lock lock(mMutex); + mCv.wait(lock, [&] { return mCalled; }); } void with_callback_times(std::function<void(std::vector<nsecs_t> const&)> const& fn) const { @@ -142,7 +142,7 @@ public: private: void callback_called(nsecs_t time) { - std::lock_guard<decltype(mMutex)> lk(mMutex); + std::lock_guard lock(mMutex); mCallbackTimes.push_back(time); mCalled = true; mLastTarget = time; diff --git a/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp b/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp index 24e243fe77..69731fdbed 100644 --- a/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp +++ b/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp @@ -144,18 +144,18 @@ public: operator VSyncDispatch::CallbackToken() const { return mToken; } void pause(nsecs_t, nsecs_t) { - std::unique_lock<std::mutex> lk(mMutex); + std::unique_lock lock(mMutex); mPause = true; mCv.notify_all(); - mCv.wait_for(lk, mPauseAmount, [this] { return !mPause; }); + mCv.wait_for(lock, mPauseAmount, [this] { return !mPause; }); mResourcePresent = (mResource.lock() != nullptr); } bool waitForPause() { - std::unique_lock<std::mutex> lk(mMutex); - auto waiting = mCv.wait_for(lk, 10s, [this] { return mPause; }); + std::unique_lock lock(mMutex); + auto waiting = mCv.wait_for(lock, 10s, [this] { return mPause; }); return waiting; } @@ -164,7 +164,7 @@ public: bool resourcePresent() { return mResourcePresent; } void unpause() { - std::unique_lock<std::mutex> lk(mMutex); + std::unique_lock lock(mMutex); mPause = false; mCv.notify_all(); } diff --git a/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp b/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp index 0eae01e138..0dcaf26bae 100644 --- a/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp +++ b/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp @@ -70,24 +70,24 @@ public: MOCK_CONST_METHOD1(dump, void(std::string&)); }; -std::shared_ptr<FenceTime> generateInvalidFence() { +std::shared_ptr<android::FenceTime> generateInvalidFence() { sp<Fence> fence = new Fence(); - return std::make_shared<FenceTime>(fence); + return std::make_shared<android::FenceTime>(fence); } -std::shared_ptr<FenceTime> generatePendingFence() { +std::shared_ptr<android::FenceTime> generatePendingFence() { sp<Fence> fence = new Fence(dup(fileno(tmpfile()))); - return std::make_shared<FenceTime>(fence); + return std::make_shared<android::FenceTime>(fence); } -void signalFenceWithTime(std::shared_ptr<FenceTime> const& fence, nsecs_t time) { - FenceTime::Snapshot snap(time); +void signalFenceWithTime(std::shared_ptr<android::FenceTime> const& fence, nsecs_t time) { + android::FenceTime::Snapshot snap(time); fence->applyTrustedSnapshot(snap); } -std::shared_ptr<FenceTime> generateSignalledFenceWithTime(nsecs_t time) { +std::shared_ptr<android::FenceTime> generateSignalledFenceWithTime(nsecs_t time) { sp<Fence> fence = new Fence(dup(fileno(tmpfile()))); - std::shared_ptr<FenceTime> ft = std::make_shared<FenceTime>(fence); + std::shared_ptr<android::FenceTime> ft = std::make_shared<android::FenceTime>(fence); signalFenceWithTime(ft, time); return ft; } @@ -152,7 +152,7 @@ TEST_F(VSyncReactorTest, addingPendingFenceAddsSignalled) { } TEST_F(VSyncReactorTest, limitsPendingFences) { - std::array<std::shared_ptr<FenceTime>, kPendingLimit * 2> fences; + std::array<std::shared_ptr<android::FenceTime>, kPendingLimit * 2> fences; std::array<nsecs_t, fences.size()> fakeTimes; std::generate(fences.begin(), fences.end(), [] { return generatePendingFence(); }); std::generate(fakeTimes.begin(), fakeTimes.end(), [i = 10]() mutable { @@ -193,86 +193,48 @@ TEST_F(VSyncReactorTest, ignoresProperlyAfterAPeriodConfirmation) { mReactor.setIgnorePresentFences(true); nsecs_t const newPeriod = 5000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); - EXPECT_TRUE(mReactor.addResyncSample(0, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(0, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_FALSE(mReactor.addResyncSample(newPeriod, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(newPeriod, std::nullopt, &periodFlushed)); EXPECT_TRUE(periodFlushed); EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0))); } -TEST_F(VSyncReactorTest, queriesTrackerForNextRefreshNow) { - nsecs_t const fakeTimestamp = 4839; - EXPECT_CALL(*mMockTracker, currentPeriod()).Times(0); - EXPECT_CALL(*mMockTracker, nextAnticipatedVSyncTimeFrom(_)) - .Times(1) - .WillOnce(Return(fakeTimestamp)); - - EXPECT_THAT(mReactor.computeNextRefresh(0, mMockClock->now()), Eq(fakeTimestamp)); -} - -TEST_F(VSyncReactorTest, queriesTrackerForExpectedPresentTime) { - nsecs_t const fakeTimestamp = 4839; - EXPECT_CALL(*mMockTracker, currentPeriod()).Times(0); - EXPECT_CALL(*mMockTracker, nextAnticipatedVSyncTimeFrom(_)) - .Times(1) - .WillOnce(Return(fakeTimestamp)); - - EXPECT_THAT(mReactor.expectedPresentTime(mMockClock->now()), Eq(fakeTimestamp)); -} - -TEST_F(VSyncReactorTest, queriesTrackerForNextRefreshFuture) { - nsecs_t const fakeTimestamp = 4839; - nsecs_t const fakePeriod = 1010; - nsecs_t const mFakeNow = 2214; - int const numPeriodsOut = 3; - EXPECT_CALL(*mMockClock, now()).WillOnce(Return(mFakeNow)); - EXPECT_CALL(*mMockTracker, currentPeriod()).WillOnce(Return(fakePeriod)); - EXPECT_CALL(*mMockTracker, nextAnticipatedVSyncTimeFrom(mFakeNow + numPeriodsOut * fakePeriod)) - .WillOnce(Return(fakeTimestamp)); - EXPECT_THAT(mReactor.computeNextRefresh(numPeriodsOut, mMockClock->now()), Eq(fakeTimestamp)); -} - -TEST_F(VSyncReactorTest, getPeriod) { - nsecs_t const fakePeriod = 1010; - EXPECT_CALL(*mMockTracker, currentPeriod()).WillOnce(Return(fakePeriod)); - EXPECT_THAT(mReactor.getPeriod(), Eq(fakePeriod)); -} - TEST_F(VSyncReactorTest, setPeriodCalledOnceConfirmedChange) { nsecs_t const newPeriod = 5000; EXPECT_CALL(*mMockTracker, setPeriod(_)).Times(0); - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); bool periodFlushed = true; - EXPECT_TRUE(mReactor.addResyncSample(10000, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(10000, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_TRUE(mReactor.addResyncSample(20000, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(20000, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); Mock::VerifyAndClearExpectations(mMockTracker.get()); EXPECT_CALL(*mMockTracker, setPeriod(newPeriod)).Times(1); - EXPECT_FALSE(mReactor.addResyncSample(25000, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(25000, std::nullopt, &periodFlushed)); EXPECT_TRUE(periodFlushed); } TEST_F(VSyncReactorTest, changingPeriodBackAbortsConfirmationProcess) { nsecs_t sampleTime = 0; nsecs_t const newPeriod = 5000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); bool periodFlushed = true; - EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - mReactor.setPeriod(period); - EXPECT_FALSE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed)); + mReactor.startPeriodTransition(period); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); } @@ -281,16 +243,18 @@ TEST_F(VSyncReactorTest, changingToAThirdPeriodWillWaitForLastPeriod) { nsecs_t const secondPeriod = 5000; nsecs_t const thirdPeriod = 2000; - mReactor.setPeriod(secondPeriod); + mReactor.startPeriodTransition(secondPeriod); bool periodFlushed = true; - EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - mReactor.setPeriod(thirdPeriod); - EXPECT_TRUE(mReactor.addResyncSample(sampleTime += secondPeriod, std::nullopt, &periodFlushed)); + mReactor.startPeriodTransition(thirdPeriod); + EXPECT_TRUE( + mReactor.addHwVsyncTimestamp(sampleTime += secondPeriod, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_FALSE(mReactor.addResyncSample(sampleTime += thirdPeriod, std::nullopt, &periodFlushed)); + EXPECT_FALSE( + mReactor.addHwVsyncTimestamp(sampleTime += thirdPeriod, std::nullopt, &periodFlushed)); EXPECT_TRUE(periodFlushed); } @@ -305,9 +269,10 @@ TEST_F(VSyncReactorTest, reportedBadTimestampFromPredictorWillReactivateHwVSync) nsecs_t skewyPeriod = period >> 1; bool periodFlushed = false; nsecs_t sampleTime = 0; - EXPECT_TRUE(mReactor.addResyncSample(sampleTime += skewyPeriod, std::nullopt, &periodFlushed)); + EXPECT_TRUE( + mReactor.addHwVsyncTimestamp(sampleTime += skewyPeriod, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_FALSE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); } @@ -325,22 +290,22 @@ TEST_F(VSyncReactorTest, reportedBadTimestampFromPredictorWillReactivateHwVSyncP TEST_F(VSyncReactorTest, presentFenceAdditionDoesNotInterruptConfirmationProcess) { nsecs_t const newPeriod = 5000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0))); } TEST_F(VSyncReactorTest, setPeriodCalledFirstTwoEventsNewPeriod) { nsecs_t const newPeriod = 5000; EXPECT_CALL(*mMockTracker, setPeriod(_)).Times(0); - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); bool periodFlushed = true; - EXPECT_TRUE(mReactor.addResyncSample(5000, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(5000, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); Mock::VerifyAndClearExpectations(mMockTracker.get()); EXPECT_CALL(*mMockTracker, setPeriod(newPeriod)).Times(1); - EXPECT_FALSE(mReactor.addResyncSample(10000, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(10000, std::nullopt, &periodFlushed)); EXPECT_TRUE(periodFlushed); } @@ -349,7 +314,7 @@ TEST_F(VSyncReactorTest, addResyncSampleTypical) { bool periodFlushed = false; EXPECT_CALL(*mMockTracker, addVsyncTimestamp(fakeTimestamp)); - EXPECT_FALSE(mReactor.addResyncSample(fakeTimestamp, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(fakeTimestamp, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); } @@ -357,23 +322,23 @@ TEST_F(VSyncReactorTest, addResyncSamplePeriodChanges) { bool periodFlushed = false; nsecs_t const newPeriod = 4000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); auto time = 0; auto constexpr numTimestampSubmissions = 10; for (auto i = 0; i < numTimestampSubmissions; i++) { time += period; - EXPECT_TRUE(mReactor.addResyncSample(time, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); } time += newPeriod; - EXPECT_FALSE(mReactor.addResyncSample(time, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(time, std::nullopt, &periodFlushed)); EXPECT_TRUE(periodFlushed); for (auto i = 0; i < numTimestampSubmissions; i++) { time += newPeriod; - EXPECT_FALSE(mReactor.addResyncSample(time, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(time, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); } } @@ -382,14 +347,14 @@ TEST_F(VSyncReactorTest, addPresentFenceWhileAwaitingPeriodConfirmationRequestsH auto time = 0; bool periodFlushed = false; nsecs_t const newPeriod = 4000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); time += period; - mReactor.addResyncSample(time, std::nullopt, &periodFlushed); + mReactor.addHwVsyncTimestamp(time, std::nullopt, &periodFlushed); EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0))); time += newPeriod; - mReactor.addResyncSample(time, std::nullopt, &periodFlushed); + mReactor.addHwVsyncTimestamp(time, std::nullopt, &periodFlushed); EXPECT_FALSE(mReactor.addPresentFence(generateSignalledFenceWithTime(0))); } @@ -398,7 +363,7 @@ TEST_F(VSyncReactorTest, hwVsyncIsRequestedForTracker) { auto time = 0; bool periodFlushed = false; nsecs_t const newPeriod = 4000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); static auto constexpr numSamplesWithNewPeriod = 4; Sequence seq; @@ -412,20 +377,20 @@ TEST_F(VSyncReactorTest, hwVsyncIsRequestedForTracker) { .WillRepeatedly(Return(false)); EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_)).Times(numSamplesWithNewPeriod); - EXPECT_TRUE(mReactor.addResyncSample(time += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += period, std::nullopt, &periodFlushed)); - EXPECT_TRUE(mReactor.addResyncSample(time += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += period, std::nullopt, &periodFlushed)); // confirmed period, but predictor wants numRequest samples. This one and prior are valid. - EXPECT_TRUE(mReactor.addResyncSample(time += newPeriod, std::nullopt, &periodFlushed)); - EXPECT_TRUE(mReactor.addResyncSample(time += newPeriod, std::nullopt, &periodFlushed)); - EXPECT_FALSE(mReactor.addResyncSample(time += newPeriod, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += newPeriod, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += newPeriod, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(time += newPeriod, std::nullopt, &periodFlushed)); } TEST_F(VSyncReactorTest, hwVsyncturnsOffOnConfirmationWhenTrackerDoesntRequest) { auto time = 0; bool periodFlushed = false; nsecs_t const newPeriod = 4000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); Sequence seq; EXPECT_CALL(*mMockTracker, needsMoreSamples()) @@ -434,9 +399,9 @@ TEST_F(VSyncReactorTest, hwVsyncturnsOffOnConfirmationWhenTrackerDoesntRequest) .WillRepeatedly(Return(false)); EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_)).Times(2); - EXPECT_TRUE(mReactor.addResyncSample(time += period, std::nullopt, &periodFlushed)); - EXPECT_TRUE(mReactor.addResyncSample(time += period, std::nullopt, &periodFlushed)); - EXPECT_FALSE(mReactor.addResyncSample(time += newPeriod, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += period, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(time += newPeriod, std::nullopt, &periodFlushed)); } TEST_F(VSyncReactorTest, hwVsyncIsRequestedForTrackerMultiplePeriodChanges) { @@ -445,7 +410,7 @@ TEST_F(VSyncReactorTest, hwVsyncIsRequestedForTrackerMultiplePeriodChanges) { nsecs_t const newPeriod1 = 4000; nsecs_t const newPeriod2 = 7000; - mReactor.setPeriod(newPeriod1); + mReactor.startPeriodTransition(newPeriod1); Sequence seq; EXPECT_CALL(*mMockTracker, needsMoreSamples()) @@ -458,22 +423,17 @@ TEST_F(VSyncReactorTest, hwVsyncIsRequestedForTrackerMultiplePeriodChanges) { .WillRepeatedly(Return(false)); EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_)).Times(7); - EXPECT_TRUE(mReactor.addResyncSample(time += period, std::nullopt, &periodFlushed)); - EXPECT_TRUE(mReactor.addResyncSample(time += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += period, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += period, std::nullopt, &periodFlushed)); // confirmed period, but predictor wants numRequest samples. This one and prior are valid. - EXPECT_TRUE(mReactor.addResyncSample(time += newPeriod1, std::nullopt, &periodFlushed)); - EXPECT_TRUE(mReactor.addResyncSample(time += newPeriod1, std::nullopt, &periodFlushed)); - - mReactor.setPeriod(newPeriod2); - EXPECT_TRUE(mReactor.addResyncSample(time += newPeriod1, std::nullopt, &periodFlushed)); - EXPECT_TRUE(mReactor.addResyncSample(time += newPeriod2, std::nullopt, &periodFlushed)); - EXPECT_TRUE(mReactor.addResyncSample(time += newPeriod2, std::nullopt, &periodFlushed)); - EXPECT_FALSE(mReactor.addResyncSample(time += newPeriod2, std::nullopt, &periodFlushed)); -} - -TEST_F(VSyncReactorTest, beginResyncResetsModel) { - EXPECT_CALL(*mMockTracker, resetModel()); - mReactor.beginResync(); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += newPeriod1, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += newPeriod1, std::nullopt, &periodFlushed)); + + mReactor.startPeriodTransition(newPeriod2); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += newPeriod1, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += newPeriod2, std::nullopt, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(time += newPeriod2, std::nullopt, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(time += newPeriod2, std::nullopt, &periodFlushed)); } TEST_F(VSyncReactorTest, periodChangeWithGivenVsyncPeriod) { @@ -482,13 +442,13 @@ TEST_F(VSyncReactorTest, periodChangeWithGivenVsyncPeriod) { mReactor.setIgnorePresentFences(true); nsecs_t const newPeriod = 5000; - mReactor.setPeriod(newPeriod); + mReactor.startPeriodTransition(newPeriod); - EXPECT_TRUE(mReactor.addResyncSample(0, 0, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(0, 0, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_TRUE(mReactor.addResyncSample(newPeriod, 0, &periodFlushed)); + EXPECT_TRUE(mReactor.addHwVsyncTimestamp(newPeriod, 0, &periodFlushed)); EXPECT_FALSE(periodFlushed); - EXPECT_FALSE(mReactor.addResyncSample(newPeriod, newPeriod, &periodFlushed)); + EXPECT_FALSE(mReactor.addHwVsyncTimestamp(newPeriod, newPeriod, &periodFlushed)); EXPECT_TRUE(periodFlushed); EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0))); @@ -505,25 +465,25 @@ TEST_F(VSyncReactorTest, periodIsMeasuredIfIgnoringComposer) { // First, set the same period, which should only be confirmed when we receive two // matching callbacks - idleReactor.setPeriod(10000); - EXPECT_TRUE(idleReactor.addResyncSample(0, 0, &periodFlushed)); + idleReactor.startPeriodTransition(10000); + EXPECT_TRUE(idleReactor.addHwVsyncTimestamp(0, 0, &periodFlushed)); EXPECT_FALSE(periodFlushed); // Correct period but incorrect timestamp delta - EXPECT_TRUE(idleReactor.addResyncSample(0, 10000, &periodFlushed)); + EXPECT_TRUE(idleReactor.addHwVsyncTimestamp(0, 10000, &periodFlushed)); EXPECT_FALSE(periodFlushed); // Correct period and correct timestamp delta - EXPECT_FALSE(idleReactor.addResyncSample(10000, 10000, &periodFlushed)); + EXPECT_FALSE(idleReactor.addHwVsyncTimestamp(10000, 10000, &periodFlushed)); EXPECT_TRUE(periodFlushed); // Then, set a new period, which should be confirmed as soon as we receive a callback // reporting the new period nsecs_t const newPeriod = 5000; - idleReactor.setPeriod(newPeriod); + idleReactor.startPeriodTransition(newPeriod); // Incorrect timestamp delta and period - EXPECT_TRUE(idleReactor.addResyncSample(20000, 10000, &periodFlushed)); + EXPECT_TRUE(idleReactor.addHwVsyncTimestamp(20000, 10000, &periodFlushed)); EXPECT_FALSE(periodFlushed); // Incorrect timestamp delta but correct period - EXPECT_FALSE(idleReactor.addResyncSample(20000, 5000, &periodFlushed)); + EXPECT_FALSE(idleReactor.addHwVsyncTimestamp(20000, 5000, &periodFlushed)); EXPECT_TRUE(periodFlushed); EXPECT_TRUE(idleReactor.addPresentFence(generateSignalledFenceWithTime(0))); diff --git a/services/surfaceflinger/tests/unittests/mock/MockDispSync.cpp b/services/surfaceflinger/tests/unittests/mock/MockVSyncTracker.cpp index bbd9f770f6..8a181232d8 100644 --- a/services/surfaceflinger/tests/unittests/mock/MockDispSync.cpp +++ b/services/surfaceflinger/tests/unittests/mock/MockVSyncTracker.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "mock/MockDispSync.h" +#include "mock/MockVSyncTracker.h" #include <thread> using namespace std::chrono_literals; @@ -22,8 +22,8 @@ namespace android { namespace mock { // Explicit default instantiation is recommended. -DispSync::DispSync() = default; -DispSync::~DispSync() = default; +VSyncTracker::VSyncTracker() = default; +VSyncTracker::~VSyncTracker() = default; } // namespace mock } // namespace android diff --git a/services/surfaceflinger/tests/unittests/mock/MockVSyncTracker.h b/services/surfaceflinger/tests/unittests/mock/MockVSyncTracker.h new file mode 100644 index 0000000000..03ddc8508f --- /dev/null +++ b/services/surfaceflinger/tests/unittests/mock/MockVSyncTracker.h @@ -0,0 +1,39 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <gmock/gmock.h> + +#include "Scheduler/VSyncTracker.h" + +namespace android::mock { + +class VSyncTracker : public android::scheduler::VSyncTracker { +public: + VSyncTracker(); + ~VSyncTracker() override; + + MOCK_METHOD1(addVsyncTimestamp, bool(nsecs_t)); + MOCK_CONST_METHOD1(nextAnticipatedVSyncTimeFrom, nsecs_t(nsecs_t)); + MOCK_CONST_METHOD0(currentPeriod, nsecs_t()); + MOCK_METHOD1(setPeriod, void(nsecs_t)); + MOCK_METHOD0(resetModel, void()); + MOCK_CONST_METHOD0(needsMoreSamples, bool()); + MOCK_CONST_METHOD1(dump, void(std::string&)); +}; + +} // namespace android::mock diff --git a/services/surfaceflinger/tests/unittests/mock/MockVsyncController.cpp b/services/surfaceflinger/tests/unittests/mock/MockVsyncController.cpp new file mode 100644 index 0000000000..25ae1bd312 --- /dev/null +++ b/services/surfaceflinger/tests/unittests/mock/MockVsyncController.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mock/MockVsyncController.h" +#include <thread> + +using namespace std::chrono_literals; +namespace android::mock { + +// Explicit default instantiation is recommended. +VsyncController::VsyncController() = default; +VsyncController::~VsyncController() = default; + +} // namespace android::mock diff --git a/services/surfaceflinger/tests/unittests/mock/MockDispSync.h b/services/surfaceflinger/tests/unittests/mock/MockVsyncController.h index 41445c8ae6..1d87546a19 100644 --- a/services/surfaceflinger/tests/unittests/mock/MockDispSync.h +++ b/services/surfaceflinger/tests/unittests/mock/MockVsyncController.h @@ -18,26 +18,20 @@ #include <gmock/gmock.h> -#include "Scheduler/DispSync.h" +#include "Scheduler/VsyncController.h" namespace android { namespace mock { -class DispSync : public android::DispSync { +class VsyncController : public android::scheduler::VsyncController { public: - DispSync(); - ~DispSync() override; + VsyncController(); + ~VsyncController() override; MOCK_METHOD1(addPresentFence, bool(const std::shared_ptr<FenceTime>&)); - MOCK_METHOD0(beginResync, void()); - MOCK_METHOD3(addResyncSample, bool(nsecs_t, std::optional<nsecs_t>, bool*)); - MOCK_METHOD1(setPeriod, void(nsecs_t)); - MOCK_METHOD0(getPeriod, nsecs_t()); - MOCK_METHOD0(getIntendedPeriod, nsecs_t()); - MOCK_METHOD1(setRefreshSkipCount, void(int)); - MOCK_CONST_METHOD2(computeNextRefresh, nsecs_t(int, nsecs_t)); + MOCK_METHOD3(addHwVsyncTimestamp, bool(nsecs_t, std::optional<nsecs_t>, bool*)); + MOCK_METHOD1(startPeriodTransition, void(nsecs_t)); MOCK_METHOD1(setIgnorePresentFences, void(bool)); - MOCK_METHOD1(expectedPresentTime, nsecs_t(nsecs_t)); MOCK_CONST_METHOD1(dump, void(std::string&)); }; |