diff options
author | 2024-07-10 17:45:29 -0700 | |
---|---|---|
committer | 2024-07-11 23:23:10 +0000 | |
commit | eba039c2d28646c5064a9a952faaba0cff6350cb (patch) | |
tree | 24e0b927151018af0dc822a7e1069052ee0ec416 /services/surfaceflinger/RefreshRateOverlay.cpp | |
parent | 180d800811e70e8fad94451090b74439d6279bca (diff) |
SF: add a new behaviour for idle timer on VRR
When idle timer times out on VRR, change the refresh rate
indicator to show "- -". The render rate doesn't cange as a result
of idleness.
Bug: 333443503
Test: manual
Flag: EXEMPT bugfix
Change-Id: Ie4f51a2a9da1a5e229b3504881117b12f1fd1b6a
Diffstat (limited to 'services/surfaceflinger/RefreshRateOverlay.cpp')
-rw-r--r-- | services/surfaceflinger/RefreshRateOverlay.cpp | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/services/surfaceflinger/RefreshRateOverlay.cpp b/services/surfaceflinger/RefreshRateOverlay.cpp index 9527a997df..35f12a0484 100644 --- a/services/surfaceflinger/RefreshRateOverlay.cpp +++ b/services/surfaceflinger/RefreshRateOverlay.cpp @@ -28,10 +28,11 @@ namespace android { -auto RefreshRateOverlay::draw(int refreshRate, int renderFps, SkColor color, +auto RefreshRateOverlay::draw(int refreshRate, int renderFps, bool idle, SkColor color, ui::Transform::RotationFlags rotation, ftl::Flags<Features> features) -> Buffers { const size_t loopCount = features.test(Features::Spinner) ? 6 : 1; + const bool isSetByHwc = features.test(Features::SetByHwc); Buffers buffers; buffers.reserve(loopCount); @@ -71,7 +72,11 @@ auto RefreshRateOverlay::draw(int refreshRate, int renderFps, SkColor color, canvas->setMatrix(canvasTransform); int left = 0; - drawNumber(refreshRate, left, color, *canvas); + if (idle && !isSetByHwc) { + drawDash(left, *canvas); + } else { + drawNumber(refreshRate, left, color, *canvas); + } left += 3 * (kDigitWidth + kDigitSpace); if (features.test(Features::Spinner)) { switch (i) { @@ -104,7 +109,11 @@ auto RefreshRateOverlay::draw(int refreshRate, int renderFps, SkColor color, left += kDigitWidth + kDigitSpace; if (features.test(Features::RenderRate)) { - drawNumber(renderFps, left, color, *canvas); + if (idle) { + drawDash(left, *canvas); + } else { + drawNumber(renderFps, left, color, *canvas); + } } left += 3 * (kDigitWidth + kDigitSpace); @@ -138,6 +147,14 @@ void RefreshRateOverlay::drawNumber(int number, int left, SkColor color, SkCanva SegmentDrawer::drawDigit(number % 10, left, color, canvas); } +void RefreshRateOverlay::drawDash(int left, SkCanvas& canvas) { + left += kDigitWidth + kDigitSpace; + SegmentDrawer::drawSegment(SegmentDrawer::Segment::Middle, left, SK_ColorRED, canvas); + + left += kDigitWidth + kDigitSpace; + SegmentDrawer::drawSegment(SegmentDrawer::Segment::Middle, left, SK_ColorRED, canvas); +} + std::unique_ptr<RefreshRateOverlay> RefreshRateOverlay::create(FpsRange range, ftl::Flags<Features> features) { std::unique_ptr<RefreshRateOverlay> overlay = @@ -171,7 +188,8 @@ bool RefreshRateOverlay::initCheck() const { return mSurfaceControl != nullptr; } -auto RefreshRateOverlay::getOrCreateBuffers(Fps refreshRate, Fps renderFps) -> const Buffers& { +auto RefreshRateOverlay::getOrCreateBuffers(Fps refreshRate, Fps renderFps, bool idle) + -> const Buffers& { static const Buffers kNoBuffers; if (!mSurfaceControl) return kNoBuffers; @@ -197,8 +215,8 @@ auto RefreshRateOverlay::getOrCreateBuffers(Fps refreshRate, Fps renderFps) -> c createTransaction().setTransform(mSurfaceControl->get(), transform).apply(); - BufferCache::const_iterator it = - mBufferCache.find({refreshRate.getIntValue(), renderFps.getIntValue(), transformHint}); + BufferCache::const_iterator it = mBufferCache.find( + {refreshRate.getIntValue(), renderFps.getIntValue(), transformHint, idle}); if (it == mBufferCache.end()) { const int maxFps = mFpsRange.max.getIntValue(); @@ -222,10 +240,10 @@ auto RefreshRateOverlay::getOrCreateBuffers(Fps refreshRate, Fps renderFps) -> c const SkColor color = colorBase.toSkColor(); - auto buffers = draw(refreshIntFps, renderIntFps, color, transformHint, mFeatures); + auto buffers = draw(refreshIntFps, renderIntFps, idle, color, transformHint, mFeatures); it = mBufferCache - .try_emplace({refreshIntFps, renderIntFps, transformHint}, std::move(buffers)) - .first; + .try_emplace({refreshIntFps, renderIntFps, transformHint, idle}, + std::move(buffers)).first; } return it->second; @@ -257,7 +275,15 @@ void RefreshRateOverlay::setLayerStack(ui::LayerStack stack) { void RefreshRateOverlay::changeRefreshRate(Fps refreshRate, Fps renderFps) { mRefreshRate = refreshRate; mRenderFps = renderFps; - const auto buffer = getOrCreateBuffers(refreshRate, renderFps)[mFrame]; + const auto buffer = getOrCreateBuffers(refreshRate, renderFps, mIsVrrIdle)[mFrame]; + createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); +} + +void RefreshRateOverlay::onVrrIdle(bool idle) { + mIsVrrIdle = idle; + if (!mRefreshRate || !mRenderFps) return; + + const auto buffer = getOrCreateBuffers(*mRefreshRate, *mRenderFps, mIsVrrIdle)[mFrame]; createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); } @@ -265,7 +291,7 @@ void RefreshRateOverlay::changeRenderRate(Fps renderFps) { if (mFeatures.test(Features::RenderRate) && mRefreshRate && FlagManager::getInstance().misc1()) { mRenderFps = renderFps; - const auto buffer = getOrCreateBuffers(*mRefreshRate, renderFps)[mFrame]; + const auto buffer = getOrCreateBuffers(*mRefreshRate, renderFps, mIsVrrIdle)[mFrame]; createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); } } @@ -273,7 +299,7 @@ void RefreshRateOverlay::changeRenderRate(Fps renderFps) { void RefreshRateOverlay::animate() { if (!mFeatures.test(Features::Spinner) || !mRefreshRate) return; - const auto& buffers = getOrCreateBuffers(*mRefreshRate, *mRenderFps); + const auto& buffers = getOrCreateBuffers(*mRefreshRate, *mRenderFps, mIsVrrIdle); mFrame = (mFrame + 1) % buffers.size(); const auto buffer = buffers[mFrame]; createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); |