Loading services/surfaceflinger/RefreshRateOverlay.cpp +22 −23 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wconversion" #include <algorithm> #include "RefreshRateOverlay.h" #include "Client.h" #include "Layer.h" Loading Loading @@ -172,7 +174,7 @@ std::vector<sp<GraphicBuffer>> RefreshRateOverlay::SevenSegmentDrawer::drawNumbe RefreshRateOverlay::RefreshRateOverlay(SurfaceFlinger& flinger, bool showSpinner) : mFlinger(flinger), mClient(new Client(&mFlinger)), mShowSpinner(showSpinner) { createLayer(); primeCache(); reset(); } bool RefreshRateOverlay::createLayer() { Loading Loading @@ -202,26 +204,15 @@ bool RefreshRateOverlay::createLayer() { return true; } void RefreshRateOverlay::primeCache() { auto& allRefreshRates = mFlinger.mRefreshRateConfigs->getAllRefreshRates(); if (allRefreshRates.size() == 1) { int fps = allRefreshRates.begin()->second->getFps().getIntValue(); half4 color = {LOW_FPS_COLOR, ALPHA}; mBufferCache.emplace(fps, SevenSegmentDrawer::drawNumber(fps, color, mShowSpinner)); return; } std::vector<uint32_t> supportedFps; supportedFps.reserve(allRefreshRates.size()); for (auto& [ignored, refreshRate] : allRefreshRates) { supportedFps.push_back(refreshRate->getFps().getIntValue()); } std::sort(supportedFps.begin(), supportedFps.end()); const auto mLowFps = supportedFps[0]; const auto mHighFps = supportedFps[supportedFps.size() - 1]; for (auto fps : supportedFps) { const auto fpsScale = float(fps - mLowFps) / (mHighFps - mLowFps); const std::vector<sp<GraphicBuffer>>& RefreshRateOverlay::getOrCreateBuffers(uint32_t fps) { if (mBufferCache.find(fps) == mBufferCache.end()) { // Ensure the range is > 0, so we don't divide by 0. const auto rangeLength = std::max(1u, mHighFps - mLowFps); // Clip values outside the range [mLowFps, mHighFps]. The current fps may be outside // of this range if the display has changed its set of supported refresh rates. fps = std::max(fps, mLowFps); fps = std::min(fps, mHighFps); const auto fpsScale = static_cast<float>(fps - mLowFps) / rangeLength; half4 color; color.r = HIGH_FPS_COLOR.r * fpsScale + LOW_FPS_COLOR.r * (1 - fpsScale); color.g = HIGH_FPS_COLOR.g * fpsScale + LOW_FPS_COLOR.g * (1 - fpsScale); Loading @@ -229,6 +220,8 @@ void RefreshRateOverlay::primeCache() { color.a = ALPHA; mBufferCache.emplace(fps, SevenSegmentDrawer::drawNumber(fps, color, mShowSpinner)); } return mBufferCache[fps]; } void RefreshRateOverlay::setViewport(ui::Size viewport) { Loading @@ -241,7 +234,7 @@ void RefreshRateOverlay::setViewport(ui::Size viewport) { void RefreshRateOverlay::changeRefreshRate(const RefreshRate& refreshRate) { mCurrentFps = refreshRate.getFps().getIntValue(); auto buffer = mBufferCache[*mCurrentFps][mFrame]; auto buffer = getOrCreateBuffers(*mCurrentFps)[mFrame]; mLayer->setBuffer(buffer, Fence::NO_FENCE, 0, 0, {}, mLayer->getHeadFrameNumber(-1 /* expectedPresentTime */)); Loading @@ -251,7 +244,7 @@ void RefreshRateOverlay::changeRefreshRate(const RefreshRate& refreshRate) { void RefreshRateOverlay::onInvalidate() { if (!mCurrentFps.has_value()) return; const auto& buffers = mBufferCache[*mCurrentFps]; const auto& buffers = getOrCreateBuffers(*mCurrentFps); mFrame = (mFrame + 1) % buffers.size(); auto buffer = buffers[mFrame]; mLayer->setBuffer(buffer, Fence::NO_FENCE, 0, 0, {}, Loading @@ -260,6 +253,12 @@ void RefreshRateOverlay::onInvalidate() { mFlinger.mTransactionFlags.fetch_or(eTransactionMask); } void RefreshRateOverlay::reset() { mBufferCache.clear(); mLowFps = mFlinger.mRefreshRateConfigs->getMinRefreshRate().getFps().getIntValue(); mHighFps = mFlinger.mRefreshRateConfigs->getMaxRefreshRate().getFps().getIntValue(); } } // namespace android // TODO(b/129481165): remove the #pragma below and fix conversion issues Loading services/surfaceflinger/RefreshRateOverlay.h +6 −1 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ public: void setViewport(ui::Size); void changeRefreshRate(const RefreshRate&); void onInvalidate(); void reset(); private: class SevenSegmentDrawer { Loading Loading @@ -71,7 +72,7 @@ private: }; bool createLayer(); void primeCache(); const std::vector<sp<GraphicBuffer>>& getOrCreateBuffers(uint32_t fps); SurfaceFlinger& mFlinger; const sp<Client> mClient; Loading @@ -87,6 +88,10 @@ private: const half3 HIGH_FPS_COLOR = half3(0.0f, 1.0f, 0.0f); const bool mShowSpinner; // Interpolate the colors between these values. uint32_t mLowFps; uint32_t mHighFps; }; } // namespace android services/surfaceflinger/SurfaceFlinger.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -2619,6 +2619,11 @@ void SurfaceFlinger::processDisplayChanged(const wp<IBinder>& displayToken, if (currentState.physical) { const auto display = getDisplayDeviceLocked(displayToken); setPowerModeInternal(display, hal::PowerMode::ON); // TODO(b/175678251) Call a listener instead. if (mRefreshRateOverlay) { mRefreshRateOverlay->reset(); } } return; } Loading Loading
services/surfaceflinger/RefreshRateOverlay.cpp +22 −23 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wconversion" #include <algorithm> #include "RefreshRateOverlay.h" #include "Client.h" #include "Layer.h" Loading Loading @@ -172,7 +174,7 @@ std::vector<sp<GraphicBuffer>> RefreshRateOverlay::SevenSegmentDrawer::drawNumbe RefreshRateOverlay::RefreshRateOverlay(SurfaceFlinger& flinger, bool showSpinner) : mFlinger(flinger), mClient(new Client(&mFlinger)), mShowSpinner(showSpinner) { createLayer(); primeCache(); reset(); } bool RefreshRateOverlay::createLayer() { Loading Loading @@ -202,26 +204,15 @@ bool RefreshRateOverlay::createLayer() { return true; } void RefreshRateOverlay::primeCache() { auto& allRefreshRates = mFlinger.mRefreshRateConfigs->getAllRefreshRates(); if (allRefreshRates.size() == 1) { int fps = allRefreshRates.begin()->second->getFps().getIntValue(); half4 color = {LOW_FPS_COLOR, ALPHA}; mBufferCache.emplace(fps, SevenSegmentDrawer::drawNumber(fps, color, mShowSpinner)); return; } std::vector<uint32_t> supportedFps; supportedFps.reserve(allRefreshRates.size()); for (auto& [ignored, refreshRate] : allRefreshRates) { supportedFps.push_back(refreshRate->getFps().getIntValue()); } std::sort(supportedFps.begin(), supportedFps.end()); const auto mLowFps = supportedFps[0]; const auto mHighFps = supportedFps[supportedFps.size() - 1]; for (auto fps : supportedFps) { const auto fpsScale = float(fps - mLowFps) / (mHighFps - mLowFps); const std::vector<sp<GraphicBuffer>>& RefreshRateOverlay::getOrCreateBuffers(uint32_t fps) { if (mBufferCache.find(fps) == mBufferCache.end()) { // Ensure the range is > 0, so we don't divide by 0. const auto rangeLength = std::max(1u, mHighFps - mLowFps); // Clip values outside the range [mLowFps, mHighFps]. The current fps may be outside // of this range if the display has changed its set of supported refresh rates. fps = std::max(fps, mLowFps); fps = std::min(fps, mHighFps); const auto fpsScale = static_cast<float>(fps - mLowFps) / rangeLength; half4 color; color.r = HIGH_FPS_COLOR.r * fpsScale + LOW_FPS_COLOR.r * (1 - fpsScale); color.g = HIGH_FPS_COLOR.g * fpsScale + LOW_FPS_COLOR.g * (1 - fpsScale); Loading @@ -229,6 +220,8 @@ void RefreshRateOverlay::primeCache() { color.a = ALPHA; mBufferCache.emplace(fps, SevenSegmentDrawer::drawNumber(fps, color, mShowSpinner)); } return mBufferCache[fps]; } void RefreshRateOverlay::setViewport(ui::Size viewport) { Loading @@ -241,7 +234,7 @@ void RefreshRateOverlay::setViewport(ui::Size viewport) { void RefreshRateOverlay::changeRefreshRate(const RefreshRate& refreshRate) { mCurrentFps = refreshRate.getFps().getIntValue(); auto buffer = mBufferCache[*mCurrentFps][mFrame]; auto buffer = getOrCreateBuffers(*mCurrentFps)[mFrame]; mLayer->setBuffer(buffer, Fence::NO_FENCE, 0, 0, {}, mLayer->getHeadFrameNumber(-1 /* expectedPresentTime */)); Loading @@ -251,7 +244,7 @@ void RefreshRateOverlay::changeRefreshRate(const RefreshRate& refreshRate) { void RefreshRateOverlay::onInvalidate() { if (!mCurrentFps.has_value()) return; const auto& buffers = mBufferCache[*mCurrentFps]; const auto& buffers = getOrCreateBuffers(*mCurrentFps); mFrame = (mFrame + 1) % buffers.size(); auto buffer = buffers[mFrame]; mLayer->setBuffer(buffer, Fence::NO_FENCE, 0, 0, {}, Loading @@ -260,6 +253,12 @@ void RefreshRateOverlay::onInvalidate() { mFlinger.mTransactionFlags.fetch_or(eTransactionMask); } void RefreshRateOverlay::reset() { mBufferCache.clear(); mLowFps = mFlinger.mRefreshRateConfigs->getMinRefreshRate().getFps().getIntValue(); mHighFps = mFlinger.mRefreshRateConfigs->getMaxRefreshRate().getFps().getIntValue(); } } // namespace android // TODO(b/129481165): remove the #pragma below and fix conversion issues Loading
services/surfaceflinger/RefreshRateOverlay.h +6 −1 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ public: void setViewport(ui::Size); void changeRefreshRate(const RefreshRate&); void onInvalidate(); void reset(); private: class SevenSegmentDrawer { Loading Loading @@ -71,7 +72,7 @@ private: }; bool createLayer(); void primeCache(); const std::vector<sp<GraphicBuffer>>& getOrCreateBuffers(uint32_t fps); SurfaceFlinger& mFlinger; const sp<Client> mClient; Loading @@ -87,6 +88,10 @@ private: const half3 HIGH_FPS_COLOR = half3(0.0f, 1.0f, 0.0f); const bool mShowSpinner; // Interpolate the colors between these values. uint32_t mLowFps; uint32_t mHighFps; }; } // namespace android
services/surfaceflinger/SurfaceFlinger.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -2619,6 +2619,11 @@ void SurfaceFlinger::processDisplayChanged(const wp<IBinder>& displayToken, if (currentState.physical) { const auto display = getDisplayDeviceLocked(displayToken); setPowerModeInternal(display, hal::PowerMode::ON); // TODO(b/175678251) Call a listener instead. if (mRefreshRateOverlay) { mRefreshRateOverlay->reset(); } } return; } Loading