diff options
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(); |