Loading libs/gui/SurfaceComposerClient.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -1363,7 +1363,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) || (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) || (mask & layer_state_t::eEnableBackpressure) || (mask & layer_state_t::eEnableBackpressure) || (mask & layer_state_t::eIgnoreDestinationFrame) || (mask & layer_state_t::eIgnoreDestinationFrame) || (mask & layer_state_t::eLayerIsDisplayDecoration)) { (mask & layer_state_t::eLayerIsDisplayDecoration) || (mask & layer_state_t::eLayerIsRefreshRateIndicator)) { s->what |= layer_state_t::eFlagsChanged; s->what |= layer_state_t::eFlagsChanged; } } s->flags &= ~mask; s->flags &= ~mask; Loading libs/gui/include/gui/LayerState.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -160,6 +160,7 @@ struct layer_state_t { // This is needed to maintain compatibility for SurfaceView scaling behavior. // This is needed to maintain compatibility for SurfaceView scaling behavior. // See SurfaceView scaling behavior for more details. // See SurfaceView scaling behavior for more details. eIgnoreDestinationFrame = 0x400, eIgnoreDestinationFrame = 0x400, eLayerIsRefreshRateIndicator = 0x800, // REFRESH_RATE_INDICATOR }; }; enum { enum { Loading services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -147,6 +147,7 @@ public: MOCK_METHOD(bool, getValidateSkipped, (HalDisplayId), (const, override)); MOCK_METHOD(bool, getValidateSkipped, (HalDisplayId), (const, override)); MOCK_METHOD(const aidl::android::hardware::graphics::composer3::OverlayProperties&, MOCK_METHOD(const aidl::android::hardware::graphics::composer3::OverlayProperties&, getOverlaySupport, (), (const, override)); getOverlaySupport, (), (const, override)); MOCK_METHOD(status_t, setRefreshRateChangedCallbackDebugEnabled, (PhysicalDisplayId, bool)); }; }; } // namespace mock } // namespace mock Loading services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp +12 −0 Original line number Original line Diff line number Diff line Loading @@ -1312,6 +1312,18 @@ TEST_F(OutputLayerWriteStateToHWCTest, setBlockingRegion) { false); false); } } TEST_F(OutputLayerWriteStateToHWCTest, setCompositionTypeRefreshRateIndicator) { mLayerFEState.compositionType = Composition::REFRESH_RATE_INDICATOR; expectGeometryCommonCalls(); expectPerFrameCommonCalls(); expectSetHdrMetadataAndBufferCalls(); expectSetCompositionTypeCall(Composition::REFRESH_RATE_INDICATOR); mOutputLayer.writeStateToHWC(/*includeGeometry*/ true, /*skipLayer*/ false, 0, /*zIsOverridden*/ false, /*isPeekingThrough*/ false); } /* /* * OutputLayer::uncacheBuffers * OutputLayer::uncacheBuffers */ */ Loading services/surfaceflinger/DisplayDevice.cpp +15 −4 Original line number Original line Diff line number Diff line Loading @@ -408,8 +408,8 @@ HdrCapabilities DisplayDevice::getHdrCapabilities() const { capabilities.getDesiredMinLuminance()); capabilities.getDesiredMinLuminance()); } } void DisplayDevice::enableRefreshRateOverlay(bool enable, bool showSpinner, bool showRenderRate, void DisplayDevice::enableRefreshRateOverlay(bool enable, bool setByHwc, bool showSpinner, bool showInMiddle) { bool showRenderRate, bool showInMiddle) { if (!enable) { if (!enable) { mRefreshRateOverlay.reset(); mRefreshRateOverlay.reset(); return; return; Loading @@ -428,11 +428,22 @@ void DisplayDevice::enableRefreshRateOverlay(bool enable, bool showSpinner, bool features |= RefreshRateOverlay::Features::ShowInMiddle; features |= RefreshRateOverlay::Features::ShowInMiddle; } } if (setByHwc) { features |= RefreshRateOverlay::Features::SetByHwc; } const auto fpsRange = mRefreshRateSelector->getSupportedRefreshRateRange(); const auto fpsRange = mRefreshRateSelector->getSupportedRefreshRateRange(); mRefreshRateOverlay = std::make_unique<RefreshRateOverlay>(fpsRange, features); mRefreshRateOverlay = std::make_unique<RefreshRateOverlay>(fpsRange, features); mRefreshRateOverlay->setLayerStack(getLayerStack()); mRefreshRateOverlay->setLayerStack(getLayerStack()); mRefreshRateOverlay->setViewport(getSize()); mRefreshRateOverlay->setViewport(getSize()); mRefreshRateOverlay->changeRefreshRate(getActiveMode().modePtr->getFps(), getActiveMode().fps); updateRefreshRateOverlayRate(getActiveMode().modePtr->getFps(), getActiveMode().fps); } void DisplayDevice::updateRefreshRateOverlayRate(Fps displayFps, Fps renderFps, bool setByHwc) { ATRACE_CALL(); if (mRefreshRateOverlay && (!mRefreshRateOverlay->isSetByHwc() || setByHwc)) { mRefreshRateOverlay->changeRefreshRate(displayFps, renderFps); } } } bool DisplayDevice::onKernelTimerChanged(std::optional<DisplayModeId> desiredModeId, bool DisplayDevice::onKernelTimerChanged(std::optional<DisplayModeId> desiredModeId, Loading @@ -441,7 +452,7 @@ bool DisplayDevice::onKernelTimerChanged(std::optional<DisplayModeId> desiredMod const auto newMode = const auto newMode = mRefreshRateSelector->onKernelTimerChanged(desiredModeId, timerExpired); mRefreshRateSelector->onKernelTimerChanged(desiredModeId, timerExpired); if (newMode) { if (newMode) { mRefreshRateOverlay->changeRefreshRate(newMode->modePtr->getFps(), newMode->fps); updateRefreshRateOverlayRate(newMode->modePtr->getFps(), newMode->fps); return true; return true; } } } } Loading Loading
libs/gui/SurfaceComposerClient.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -1363,7 +1363,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) || (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) || (mask & layer_state_t::eEnableBackpressure) || (mask & layer_state_t::eEnableBackpressure) || (mask & layer_state_t::eIgnoreDestinationFrame) || (mask & layer_state_t::eIgnoreDestinationFrame) || (mask & layer_state_t::eLayerIsDisplayDecoration)) { (mask & layer_state_t::eLayerIsDisplayDecoration) || (mask & layer_state_t::eLayerIsRefreshRateIndicator)) { s->what |= layer_state_t::eFlagsChanged; s->what |= layer_state_t::eFlagsChanged; } } s->flags &= ~mask; s->flags &= ~mask; Loading
libs/gui/include/gui/LayerState.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -160,6 +160,7 @@ struct layer_state_t { // This is needed to maintain compatibility for SurfaceView scaling behavior. // This is needed to maintain compatibility for SurfaceView scaling behavior. // See SurfaceView scaling behavior for more details. // See SurfaceView scaling behavior for more details. eIgnoreDestinationFrame = 0x400, eIgnoreDestinationFrame = 0x400, eLayerIsRefreshRateIndicator = 0x800, // REFRESH_RATE_INDICATOR }; }; enum { enum { Loading
services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -147,6 +147,7 @@ public: MOCK_METHOD(bool, getValidateSkipped, (HalDisplayId), (const, override)); MOCK_METHOD(bool, getValidateSkipped, (HalDisplayId), (const, override)); MOCK_METHOD(const aidl::android::hardware::graphics::composer3::OverlayProperties&, MOCK_METHOD(const aidl::android::hardware::graphics::composer3::OverlayProperties&, getOverlaySupport, (), (const, override)); getOverlaySupport, (), (const, override)); MOCK_METHOD(status_t, setRefreshRateChangedCallbackDebugEnabled, (PhysicalDisplayId, bool)); }; }; } // namespace mock } // namespace mock Loading
services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp +12 −0 Original line number Original line Diff line number Diff line Loading @@ -1312,6 +1312,18 @@ TEST_F(OutputLayerWriteStateToHWCTest, setBlockingRegion) { false); false); } } TEST_F(OutputLayerWriteStateToHWCTest, setCompositionTypeRefreshRateIndicator) { mLayerFEState.compositionType = Composition::REFRESH_RATE_INDICATOR; expectGeometryCommonCalls(); expectPerFrameCommonCalls(); expectSetHdrMetadataAndBufferCalls(); expectSetCompositionTypeCall(Composition::REFRESH_RATE_INDICATOR); mOutputLayer.writeStateToHWC(/*includeGeometry*/ true, /*skipLayer*/ false, 0, /*zIsOverridden*/ false, /*isPeekingThrough*/ false); } /* /* * OutputLayer::uncacheBuffers * OutputLayer::uncacheBuffers */ */ Loading
services/surfaceflinger/DisplayDevice.cpp +15 −4 Original line number Original line Diff line number Diff line Loading @@ -408,8 +408,8 @@ HdrCapabilities DisplayDevice::getHdrCapabilities() const { capabilities.getDesiredMinLuminance()); capabilities.getDesiredMinLuminance()); } } void DisplayDevice::enableRefreshRateOverlay(bool enable, bool showSpinner, bool showRenderRate, void DisplayDevice::enableRefreshRateOverlay(bool enable, bool setByHwc, bool showSpinner, bool showInMiddle) { bool showRenderRate, bool showInMiddle) { if (!enable) { if (!enable) { mRefreshRateOverlay.reset(); mRefreshRateOverlay.reset(); return; return; Loading @@ -428,11 +428,22 @@ void DisplayDevice::enableRefreshRateOverlay(bool enable, bool showSpinner, bool features |= RefreshRateOverlay::Features::ShowInMiddle; features |= RefreshRateOverlay::Features::ShowInMiddle; } } if (setByHwc) { features |= RefreshRateOverlay::Features::SetByHwc; } const auto fpsRange = mRefreshRateSelector->getSupportedRefreshRateRange(); const auto fpsRange = mRefreshRateSelector->getSupportedRefreshRateRange(); mRefreshRateOverlay = std::make_unique<RefreshRateOverlay>(fpsRange, features); mRefreshRateOverlay = std::make_unique<RefreshRateOverlay>(fpsRange, features); mRefreshRateOverlay->setLayerStack(getLayerStack()); mRefreshRateOverlay->setLayerStack(getLayerStack()); mRefreshRateOverlay->setViewport(getSize()); mRefreshRateOverlay->setViewport(getSize()); mRefreshRateOverlay->changeRefreshRate(getActiveMode().modePtr->getFps(), getActiveMode().fps); updateRefreshRateOverlayRate(getActiveMode().modePtr->getFps(), getActiveMode().fps); } void DisplayDevice::updateRefreshRateOverlayRate(Fps displayFps, Fps renderFps, bool setByHwc) { ATRACE_CALL(); if (mRefreshRateOverlay && (!mRefreshRateOverlay->isSetByHwc() || setByHwc)) { mRefreshRateOverlay->changeRefreshRate(displayFps, renderFps); } } } bool DisplayDevice::onKernelTimerChanged(std::optional<DisplayModeId> desiredModeId, bool DisplayDevice::onKernelTimerChanged(std::optional<DisplayModeId> desiredModeId, Loading @@ -441,7 +452,7 @@ bool DisplayDevice::onKernelTimerChanged(std::optional<DisplayModeId> desiredMod const auto newMode = const auto newMode = mRefreshRateSelector->onKernelTimerChanged(desiredModeId, timerExpired); mRefreshRateSelector->onKernelTimerChanged(desiredModeId, timerExpired); if (newMode) { if (newMode) { mRefreshRateOverlay->changeRefreshRate(newMode->modePtr->getFps(), newMode->fps); updateRefreshRateOverlayRate(newMode->modePtr->getFps(), newMode->fps); return true; return true; } } } } Loading