Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1781d85 authored by Dominik Laskowski's avatar Dominik Laskowski Committed by Android (Google) Code Review
Browse files

Merge "SF: Fix a sporadic crash during multi-display boot"

parents 1196e96c 6839927f
Loading
Loading
Loading
Loading
+35 −17
Original line number Original line Diff line number Diff line
@@ -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;


@@ -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);
    }
    }


@@ -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);
@@ -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());
}
}
+16 −3
Original line number Original line Diff line number Diff line
@@ -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;


@@ -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);


@@ -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