Loading services/surfaceflinger/SurfaceFlinger.cpp +35 −17 Original line number Original line Diff line number Diff line Loading @@ -814,16 +814,37 @@ void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) { enableHalVirtualDisplays(true); enableHalVirtualDisplays(true); } } // Process any initial hotplug and resulting display changes. // Process hotplug for displays connected at boot. LOG_ALWAYS_FATAL_IF(!configureLocked(), LOG_ALWAYS_FATAL_IF(!configureLocked(), "Initial display configuration failed: HWC did not hotplug"); "Initial display configuration failed: HWC did not hotplug"); processDisplayChangesLocked(); const auto display = getDefaultDisplayDeviceLocked(); // Commit primary display. sp<const DisplayDevice> display; if (const auto indexOpt = mCurrentState.getDisplayIndex(getPrimaryDisplayIdLocked())) { const auto& displays = mCurrentState.displays; const auto& token = displays.keyAt(*indexOpt); const auto& state = displays.valueAt(*indexOpt); processDisplayAdded(token, state); mDrawingState.displays.add(token, state); display = getDefaultDisplayDeviceLocked(); } LOG_ALWAYS_FATAL_IF(!display, "Failed to configure the primary display"); LOG_ALWAYS_FATAL_IF(!display, "Failed to configure the primary display"); LOG_ALWAYS_FATAL_IF(!getHwComposer().isConnected(display->getPhysicalId()), LOG_ALWAYS_FATAL_IF(!getHwComposer().isConnected(display->getPhysicalId()), "Primary display is disconnected"); "Primary display is disconnected"); // TODO(b/241285876): The Scheduler needlessly depends on creating the CompositionEngine part of // the DisplayDevice, hence the above commit of the primary display. Remove that special case by // initializing the Scheduler after configureLocked, once decoupled from DisplayDevice. initScheduler(display); dispatchDisplayHotplugEvent(display->getPhysicalId(), true); // Commit secondary display(s). processDisplayChangesLocked(); // initialize our drawing state // initialize our drawing state mDrawingState = mCurrentState; mDrawingState = mCurrentState; Loading Loading @@ -2953,10 +2974,13 @@ void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken, LOG_FATAL_IF(!displaySurface); LOG_FATAL_IF(!displaySurface); auto display = setupNewDisplayDeviceInternal(displayToken, std::move(compositionDisplay), state, auto display = setupNewDisplayDeviceInternal(displayToken, std::move(compositionDisplay), state, displaySurface, producer); displaySurface, producer); if (mScheduler && !display->isVirtual()) { // Display modes are reloaded on hotplug reconnect. if (display->isPrimary()) { if (display->isPrimary()) { initScheduler(display); mScheduler->setRefreshRateConfigs(display->holdRefreshRateConfigs()); } } if (!state.isVirtual()) { dispatchDisplayHotplugEvent(display->getPhysicalId(), true); dispatchDisplayHotplugEvent(display->getPhysicalId(), true); } } Loading Loading @@ -3368,15 +3392,9 @@ void SurfaceFlinger::triggerOnFrameRateOverridesChanged() { mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId); mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId); } } void SurfaceFlinger::initScheduler(const sp<DisplayDevice>& display) { void SurfaceFlinger::initScheduler(const sp<const DisplayDevice>& display) { if (mScheduler) { LOG_ALWAYS_FATAL_IF(mScheduler); // If the scheduler is already initialized, this means that we received // a hotplug(connected) on the primary display. In that case we should // update the scheduler with the most recent display information. ALOGW("Scheduler already initialized, updating instead"); mScheduler->setRefreshRateConfigs(display->holdRefreshRateConfigs()); return; } const auto currRefreshRate = display->getActiveMode()->getFps(); const auto currRefreshRate = display->getActiveMode()->getFps(); mRefreshRateStats = std::make_unique<scheduler::RefreshRateStats>(*mTimeStats, currRefreshRate, mRefreshRateStats = std::make_unique<scheduler::RefreshRateStats>(*mTimeStats, currRefreshRate, hal::PowerMode::OFF); hal::PowerMode::OFF); Loading Loading @@ -7077,7 +7095,7 @@ void SurfaceFlinger::sample() { mRegionSamplingThread->onCompositionComplete(mScheduler->getScheduledFrameTime()); mRegionSamplingThread->onCompositionComplete(mScheduler->getScheduledFrameTime()); } } void SurfaceFlinger::onActiveDisplaySizeChanged(const sp<DisplayDevice>& activeDisplay) { void SurfaceFlinger::onActiveDisplaySizeChanged(const sp<const DisplayDevice>& activeDisplay) { mScheduler->onActiveDisplayAreaChanged(activeDisplay->getWidth() * activeDisplay->getHeight()); mScheduler->onActiveDisplayAreaChanged(activeDisplay->getWidth() * activeDisplay->getHeight()); getRenderEngine().onActiveDisplaySizeChanged(activeDisplay->getSize()); getRenderEngine().onActiveDisplaySizeChanged(activeDisplay->getSize()); } } Loading services/surfaceflinger/SurfaceFlinger.h +16 −3 Original line number Original line Diff line number Diff line Loading @@ -374,8 +374,21 @@ private: const LayerVector::StateSet stateSet = LayerVector::StateSet::Invalid; const LayerVector::StateSet stateSet = LayerVector::StateSet::Invalid; LayerVector layersSortedByZ; LayerVector layersSortedByZ; // TODO(b/241285876): Replace deprecated DefaultKeyedVector with ftl::SmallMap. DefaultKeyedVector<wp<IBinder>, DisplayDeviceState> displays; DefaultKeyedVector<wp<IBinder>, DisplayDeviceState> displays; std::optional<size_t> getDisplayIndex(PhysicalDisplayId displayId) const { for (size_t i = 0; i < displays.size(); i++) { const auto& state = displays.valueAt(i); if (state.physical && state.physical->id == displayId) { return i; } } return {}; } bool colorMatrixChanged = true; bool colorMatrixChanged = true; mat4 colorMatrix; mat4 colorMatrix; Loading Loading @@ -695,7 +708,7 @@ private: void commitInputWindowCommands() REQUIRES(mStateLock); void commitInputWindowCommands() REQUIRES(mStateLock); void updateCursorAsync(); void updateCursorAsync(); void initScheduler(const sp<DisplayDevice>& display) REQUIRES(mStateLock); void initScheduler(const sp<const DisplayDevice>&) REQUIRES(mStateLock); void updatePhaseConfiguration(const Fps&) REQUIRES(mStateLock); void updatePhaseConfiguration(const Fps&) REQUIRES(mStateLock); void setVsyncConfig(const VsyncModulator::VsyncConfig&, nsecs_t vsyncPeriod); void setVsyncConfig(const VsyncModulator::VsyncConfig&, nsecs_t vsyncPeriod); Loading Loading @@ -1027,7 +1040,7 @@ private: void onActiveDisplayChangedLocked(const sp<DisplayDevice>& activeDisplay) void onActiveDisplayChangedLocked(const sp<DisplayDevice>& activeDisplay) REQUIRES(mStateLock, kMainThreadContext); REQUIRES(mStateLock, kMainThreadContext); void onActiveDisplaySizeChanged(const sp<DisplayDevice>& activeDisplay); void onActiveDisplaySizeChanged(const sp<const DisplayDevice>&); /* /* * Debugging & dumpsys * Debugging & dumpsys Loading Loading
services/surfaceflinger/SurfaceFlinger.cpp +35 −17 Original line number Original line Diff line number Diff line Loading @@ -814,16 +814,37 @@ void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) { enableHalVirtualDisplays(true); enableHalVirtualDisplays(true); } } // Process any initial hotplug and resulting display changes. // Process hotplug for displays connected at boot. LOG_ALWAYS_FATAL_IF(!configureLocked(), LOG_ALWAYS_FATAL_IF(!configureLocked(), "Initial display configuration failed: HWC did not hotplug"); "Initial display configuration failed: HWC did not hotplug"); processDisplayChangesLocked(); const auto display = getDefaultDisplayDeviceLocked(); // Commit primary display. sp<const DisplayDevice> display; if (const auto indexOpt = mCurrentState.getDisplayIndex(getPrimaryDisplayIdLocked())) { const auto& displays = mCurrentState.displays; const auto& token = displays.keyAt(*indexOpt); const auto& state = displays.valueAt(*indexOpt); processDisplayAdded(token, state); mDrawingState.displays.add(token, state); display = getDefaultDisplayDeviceLocked(); } LOG_ALWAYS_FATAL_IF(!display, "Failed to configure the primary display"); LOG_ALWAYS_FATAL_IF(!display, "Failed to configure the primary display"); LOG_ALWAYS_FATAL_IF(!getHwComposer().isConnected(display->getPhysicalId()), LOG_ALWAYS_FATAL_IF(!getHwComposer().isConnected(display->getPhysicalId()), "Primary display is disconnected"); "Primary display is disconnected"); // TODO(b/241285876): The Scheduler needlessly depends on creating the CompositionEngine part of // the DisplayDevice, hence the above commit of the primary display. Remove that special case by // initializing the Scheduler after configureLocked, once decoupled from DisplayDevice. initScheduler(display); dispatchDisplayHotplugEvent(display->getPhysicalId(), true); // Commit secondary display(s). processDisplayChangesLocked(); // initialize our drawing state // initialize our drawing state mDrawingState = mCurrentState; mDrawingState = mCurrentState; Loading Loading @@ -2953,10 +2974,13 @@ void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken, LOG_FATAL_IF(!displaySurface); LOG_FATAL_IF(!displaySurface); auto display = setupNewDisplayDeviceInternal(displayToken, std::move(compositionDisplay), state, auto display = setupNewDisplayDeviceInternal(displayToken, std::move(compositionDisplay), state, displaySurface, producer); displaySurface, producer); if (mScheduler && !display->isVirtual()) { // Display modes are reloaded on hotplug reconnect. if (display->isPrimary()) { if (display->isPrimary()) { initScheduler(display); mScheduler->setRefreshRateConfigs(display->holdRefreshRateConfigs()); } } if (!state.isVirtual()) { dispatchDisplayHotplugEvent(display->getPhysicalId(), true); dispatchDisplayHotplugEvent(display->getPhysicalId(), true); } } Loading Loading @@ -3368,15 +3392,9 @@ void SurfaceFlinger::triggerOnFrameRateOverridesChanged() { mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId); mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId); } } void SurfaceFlinger::initScheduler(const sp<DisplayDevice>& display) { void SurfaceFlinger::initScheduler(const sp<const DisplayDevice>& display) { if (mScheduler) { LOG_ALWAYS_FATAL_IF(mScheduler); // If the scheduler is already initialized, this means that we received // a hotplug(connected) on the primary display. In that case we should // update the scheduler with the most recent display information. ALOGW("Scheduler already initialized, updating instead"); mScheduler->setRefreshRateConfigs(display->holdRefreshRateConfigs()); return; } const auto currRefreshRate = display->getActiveMode()->getFps(); const auto currRefreshRate = display->getActiveMode()->getFps(); mRefreshRateStats = std::make_unique<scheduler::RefreshRateStats>(*mTimeStats, currRefreshRate, mRefreshRateStats = std::make_unique<scheduler::RefreshRateStats>(*mTimeStats, currRefreshRate, hal::PowerMode::OFF); hal::PowerMode::OFF); Loading Loading @@ -7077,7 +7095,7 @@ void SurfaceFlinger::sample() { mRegionSamplingThread->onCompositionComplete(mScheduler->getScheduledFrameTime()); mRegionSamplingThread->onCompositionComplete(mScheduler->getScheduledFrameTime()); } } void SurfaceFlinger::onActiveDisplaySizeChanged(const sp<DisplayDevice>& activeDisplay) { void SurfaceFlinger::onActiveDisplaySizeChanged(const sp<const DisplayDevice>& activeDisplay) { mScheduler->onActiveDisplayAreaChanged(activeDisplay->getWidth() * activeDisplay->getHeight()); mScheduler->onActiveDisplayAreaChanged(activeDisplay->getWidth() * activeDisplay->getHeight()); getRenderEngine().onActiveDisplaySizeChanged(activeDisplay->getSize()); getRenderEngine().onActiveDisplaySizeChanged(activeDisplay->getSize()); } } Loading
services/surfaceflinger/SurfaceFlinger.h +16 −3 Original line number Original line Diff line number Diff line Loading @@ -374,8 +374,21 @@ private: const LayerVector::StateSet stateSet = LayerVector::StateSet::Invalid; const LayerVector::StateSet stateSet = LayerVector::StateSet::Invalid; LayerVector layersSortedByZ; LayerVector layersSortedByZ; // TODO(b/241285876): Replace deprecated DefaultKeyedVector with ftl::SmallMap. DefaultKeyedVector<wp<IBinder>, DisplayDeviceState> displays; DefaultKeyedVector<wp<IBinder>, DisplayDeviceState> displays; std::optional<size_t> getDisplayIndex(PhysicalDisplayId displayId) const { for (size_t i = 0; i < displays.size(); i++) { const auto& state = displays.valueAt(i); if (state.physical && state.physical->id == displayId) { return i; } } return {}; } bool colorMatrixChanged = true; bool colorMatrixChanged = true; mat4 colorMatrix; mat4 colorMatrix; Loading Loading @@ -695,7 +708,7 @@ private: void commitInputWindowCommands() REQUIRES(mStateLock); void commitInputWindowCommands() REQUIRES(mStateLock); void updateCursorAsync(); void updateCursorAsync(); void initScheduler(const sp<DisplayDevice>& display) REQUIRES(mStateLock); void initScheduler(const sp<const DisplayDevice>&) REQUIRES(mStateLock); void updatePhaseConfiguration(const Fps&) REQUIRES(mStateLock); void updatePhaseConfiguration(const Fps&) REQUIRES(mStateLock); void setVsyncConfig(const VsyncModulator::VsyncConfig&, nsecs_t vsyncPeriod); void setVsyncConfig(const VsyncModulator::VsyncConfig&, nsecs_t vsyncPeriod); Loading Loading @@ -1027,7 +1040,7 @@ private: void onActiveDisplayChangedLocked(const sp<DisplayDevice>& activeDisplay) void onActiveDisplayChangedLocked(const sp<DisplayDevice>& activeDisplay) REQUIRES(mStateLock, kMainThreadContext); REQUIRES(mStateLock, kMainThreadContext); void onActiveDisplaySizeChanged(const sp<DisplayDevice>& activeDisplay); void onActiveDisplaySizeChanged(const sp<const DisplayDevice>&); /* /* * Debugging & dumpsys * Debugging & dumpsys Loading