SF: send the renderFrameRate with mode changed event

Bug: 259740021
Test: atest FrameRateOverrideHostTest
Test: atest libsurfaceflinger_unittest
Change-Id: I3ef1b5c945826b37b9da739177c0b2fcd9444e08
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index bd3c0f1..cc4e082 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1083,8 +1083,9 @@
 
     const PhysicalDisplayId displayId = snapshot.displayId();
 
-    info->activeDisplayModeId =
-            display->refreshRateSelector().getActiveMode().modePtr->getId().value();
+    const auto mode = display->refreshRateSelector().getActiveMode();
+    info->activeDisplayModeId = mode.modePtr->getId().value();
+    info->renderFrameRate = mode.fps.getValue();
     info->activeColorMode = display->getCompositionDisplay()->getState().colorMode;
     info->hdrCapabilities = filterOut4k30(display->getHdrCapabilities());
 
@@ -1127,8 +1128,8 @@
         return;
     }
 
-    const Fps renderFps = request.mode.fps;
-    const Fps displayFps = request.mode.modePtr->getFps();
+    const auto mode = request.mode;
+    const bool emitEvent = request.emitEvent;
 
     switch (display->setDesiredActiveMode(DisplayDevice::ActiveModeInfo(std::move(request)))) {
         case DisplayDevice::DesiredActiveModeAction::InitiateDisplayModeSwitch:
@@ -1136,21 +1137,22 @@
 
             // Start receiving vsync samples now, so that we can detect a period
             // switch.
-            mScheduler->resyncToHardwareVsync(true, displayFps);
+            mScheduler->resyncToHardwareVsync(true, mode.modePtr->getFps());
             // As we called to set period, we will call to onRefreshRateChangeCompleted once
             // VsyncController model is locked.
             modulateVsync(&VsyncModulator::onRefreshRateChangeInitiated);
 
-            updatePhaseConfiguration(renderFps);
+            updatePhaseConfiguration(mode.fps);
             mScheduler->setModeChangePending(true);
             break;
         case DisplayDevice::DesiredActiveModeAction::InitiateRenderRateSwitch:
-            mScheduler->setRenderRate(renderFps);
-            updatePhaseConfiguration(renderFps);
-            mRefreshRateStats->setRefreshRate(renderFps);
+            mScheduler->setRenderRate(mode.fps);
+            updatePhaseConfiguration(mode.fps);
+            mRefreshRateStats->setRefreshRate(mode.fps);
+            if (display->getPhysicalId() == mActiveDisplayId && emitEvent) {
+                mScheduler->onPrimaryDisplayModeChanged(mAppConnectionHandle, mode);
+            }
 
-            // TODO(b/259740021): send event to display manager about
-            //  the render rate change
             break;
         case DisplayDevice::DesiredActiveModeAction::None:
             break;
@@ -7405,6 +7407,7 @@
         }
 
         outInfo->activeDisplayModeId = info.activeDisplayModeId;
+        outInfo->renderFrameRate = info.renderFrameRate;
 
         outInfo->supportedColorModes.clear();
         outInfo->supportedColorModes.reserve(info.supportedColorModes.size());