From 22d59cc507f4883496406916e4de22a70866cfee Mon Sep 17 00:00:00 2001 From: Ying Wei Date: Sat, 11 May 2024 02:41:08 +0000 Subject: Rename RefreshRateOverlay vsyncRate to RefreshRate With MRR devices, vsyncRate and refreshRate are the same thing, but this is not true for dVRR devices. Test: manually test refresh rate indicator Change-Id: I0946ad4164257b1919035a0db1080ec06ba1ed53 --- services/surfaceflinger/RefreshRateOverlay.cpp | 27 +++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'services/surfaceflinger/RefreshRateOverlay.cpp') diff --git a/services/surfaceflinger/RefreshRateOverlay.cpp b/services/surfaceflinger/RefreshRateOverlay.cpp index b960e33682..b40f3323bc 100644 --- a/services/surfaceflinger/RefreshRateOverlay.cpp +++ b/services/surfaceflinger/RefreshRateOverlay.cpp @@ -28,7 +28,7 @@ namespace android { -auto RefreshRateOverlay::draw(int vsyncRate, int renderFps, SkColor color, +auto RefreshRateOverlay::draw(int refreshRate, int renderFps, SkColor color, ui::Transform::RotationFlags rotation, ftl::Flags features) -> Buffers { const size_t loopCount = features.test(Features::Spinner) ? 6 : 1; @@ -71,7 +71,7 @@ auto RefreshRateOverlay::draw(int vsyncRate, int renderFps, SkColor color, canvas->setMatrix(canvasTransform); int left = 0; - drawNumber(vsyncRate, left, color, *canvas); + drawNumber(refreshRate, left, color, *canvas); left += 3 * (kDigitWidth + kDigitSpace); if (features.test(Features::Spinner)) { switch (i) { @@ -171,7 +171,7 @@ bool RefreshRateOverlay::initCheck() const { return mSurfaceControl != nullptr; } -auto RefreshRateOverlay::getOrCreateBuffers(Fps vsyncRate, Fps renderFps) -> const Buffers& { +auto RefreshRateOverlay::getOrCreateBuffers(Fps refreshRate, Fps renderFps) -> const Buffers& { static const Buffers kNoBuffers; if (!mSurfaceControl) return kNoBuffers; @@ -198,16 +198,16 @@ auto RefreshRateOverlay::getOrCreateBuffers(Fps vsyncRate, Fps renderFps) -> con createTransaction().setTransform(mSurfaceControl->get(), transform).apply(); BufferCache::const_iterator it = - mBufferCache.find({vsyncRate.getIntValue(), renderFps.getIntValue(), transformHint}); + mBufferCache.find({refreshRate.getIntValue(), renderFps.getIntValue(), transformHint}); if (it == mBufferCache.end()) { // HWC minFps is not known by the framework in order // to consider lower rates we set minFps to 0. const int minFps = isSetByHwc() ? 0 : mFpsRange.min.getIntValue(); const int maxFps = mFpsRange.max.getIntValue(); - // Clamp to the range. The current vsyncRate may be outside of this range if the display + // Clamp to the range. The current refreshRate may be outside of this range if the display // has changed its set of supported refresh rates. - const int displayIntFps = std::clamp(vsyncRate.getIntValue(), minFps, maxFps); + const int displayIntFps = std::clamp(refreshRate.getIntValue(), minFps, maxFps); const int renderIntFps = renderFps.getIntValue(); // Ensure non-zero range to avoid division by zero. @@ -260,25 +260,26 @@ void RefreshRateOverlay::setLayerStack(ui::LayerStack stack) { createTransaction().setLayerStack(mSurfaceControl->get(), stack).apply(); } -void RefreshRateOverlay::changeRefreshRate(Fps vsyncRate, Fps renderFps) { - mVsyncRate = vsyncRate; +void RefreshRateOverlay::changeRefreshRate(Fps refreshRate, Fps renderFps) { + mRefreshRate = refreshRate; mRenderFps = renderFps; - const auto buffer = getOrCreateBuffers(vsyncRate, renderFps)[mFrame]; + const auto buffer = getOrCreateBuffers(refreshRate, renderFps)[mFrame]; createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); } void RefreshRateOverlay::changeRenderRate(Fps renderFps) { - if (mFeatures.test(Features::RenderRate) && mVsyncRate && FlagManager::getInstance().misc1()) { + if (mFeatures.test(Features::RenderRate) && mRefreshRate && + FlagManager::getInstance().misc1()) { mRenderFps = renderFps; - const auto buffer = getOrCreateBuffers(*mVsyncRate, renderFps)[mFrame]; + const auto buffer = getOrCreateBuffers(*mRefreshRate, renderFps)[mFrame]; createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); } } void RefreshRateOverlay::animate() { - if (!mFeatures.test(Features::Spinner) || !mVsyncRate) return; + if (!mFeatures.test(Features::Spinner) || !mRefreshRate) return; - const auto& buffers = getOrCreateBuffers(*mVsyncRate, *mRenderFps); + const auto& buffers = getOrCreateBuffers(*mRefreshRate, *mRenderFps); mFrame = (mFrame + 1) % buffers.size(); const auto buffer = buffers[mFrame]; createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); -- cgit v1.2.3-59-g8ed1b From c6e522e2af6734ac2f9f7d5d469583c5b0fff9f6 Mon Sep 17 00:00:00 2001 From: ramindani Date: Tue, 7 May 2024 16:42:51 -0700 Subject: [SF] Use Render rate for Refresh rate When VRR device does not support refresh rate debug indicator callback Use the render rate as the refresh rate on the indicator. Test: Manually tested refresh rate indicator on device that supports the callback and device that doesn't BUG: 326137213 Change-Id: Ifd0d34909b831991d4525f2b5138e71e4a76c4d6 --- services/surfaceflinger/DisplayDevice.cpp | 4 +++- services/surfaceflinger/RefreshRateOverlay.cpp | 18 ++++++------------ services/surfaceflinger/RefreshRateOverlay.h | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) (limited to 'services/surfaceflinger/RefreshRateOverlay.cpp') diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 38cf05327f..a57e626224 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -474,7 +474,6 @@ void DisplayDevice::enableRefreshRateOverlay(bool enable, bool setByHwc, bool sh features |= RefreshRateOverlay::Features::SetByHwc; } - // TODO(b/296636258) Update to use the render rate range in VRR mode. const auto fpsRange = mRefreshRateSelector->getSupportedRefreshRateRange(); mRefreshRateOverlay = RefreshRateOverlay::create(fpsRange, features); if (mRefreshRateOverlay) { @@ -489,6 +488,9 @@ void DisplayDevice::updateRefreshRateOverlayRate(Fps refreshRate, Fps renderFps, ATRACE_CALL(); if (mRefreshRateOverlay) { if (!mRefreshRateOverlay->isSetByHwc() || setByHwc) { + if (mRefreshRateSelector->isVrrDevice() && !mRefreshRateOverlay->isSetByHwc()) { + refreshRate = renderFps; + } mRefreshRateOverlay->changeRefreshRate(refreshRate, renderFps); } else { mRefreshRateOverlay->changeRenderRate(renderFps); diff --git a/services/surfaceflinger/RefreshRateOverlay.cpp b/services/surfaceflinger/RefreshRateOverlay.cpp index b40f3323bc..9527a997df 100644 --- a/services/surfaceflinger/RefreshRateOverlay.cpp +++ b/services/surfaceflinger/RefreshRateOverlay.cpp @@ -200,19 +200,13 @@ auto RefreshRateOverlay::getOrCreateBuffers(Fps refreshRate, Fps renderFps) -> c BufferCache::const_iterator it = mBufferCache.find({refreshRate.getIntValue(), renderFps.getIntValue(), transformHint}); if (it == mBufferCache.end()) { - // HWC minFps is not known by the framework in order - // to consider lower rates we set minFps to 0. - const int minFps = isSetByHwc() ? 0 : mFpsRange.min.getIntValue(); const int maxFps = mFpsRange.max.getIntValue(); - // Clamp to the range. The current refreshRate may be outside of this range if the display - // has changed its set of supported refresh rates. - const int displayIntFps = std::clamp(refreshRate.getIntValue(), minFps, maxFps); + // Clamp to supported refresh rate range: the current refresh rate may be outside of this + // range if the display has changed its set of supported refresh rates. + const int refreshIntFps = std::clamp(refreshRate.getIntValue(), 0, maxFps); const int renderIntFps = renderFps.getIntValue(); - - // Ensure non-zero range to avoid division by zero. - const float fpsScale = - static_cast(displayIntFps - minFps) / std::max(1, maxFps - minFps); + const float fpsScale = static_cast(refreshIntFps) / maxFps; constexpr SkColor kMinFpsColor = SK_ColorRED; constexpr SkColor kMaxFpsColor = SK_ColorGREEN; @@ -228,9 +222,9 @@ auto RefreshRateOverlay::getOrCreateBuffers(Fps refreshRate, Fps renderFps) -> c const SkColor color = colorBase.toSkColor(); - auto buffers = draw(displayIntFps, renderIntFps, color, transformHint, mFeatures); + auto buffers = draw(refreshIntFps, renderIntFps, color, transformHint, mFeatures); it = mBufferCache - .try_emplace({displayIntFps, renderIntFps, transformHint}, std::move(buffers)) + .try_emplace({refreshIntFps, renderIntFps, transformHint}, std::move(buffers)) .first; } diff --git a/services/surfaceflinger/RefreshRateOverlay.h b/services/surfaceflinger/RefreshRateOverlay.h index 93ec36e7f8..b2896f07dd 100644 --- a/services/surfaceflinger/RefreshRateOverlay.h +++ b/services/surfaceflinger/RefreshRateOverlay.h @@ -65,7 +65,7 @@ private: using Buffers = std::vector>; - static Buffers draw(int vsyncRate, int renderFps, SkColor, ui::Transform::RotationFlags, + static Buffers draw(int refreshRate, int renderFps, SkColor, ui::Transform::RotationFlags, ftl::Flags); static void drawNumber(int number, int left, SkColor, SkCanvas&); -- cgit v1.2.3-59-g8ed1b