diff options
| author | 2019-05-29 21:26:31 +0000 | |
|---|---|---|
| committer | 2019-05-29 21:26:31 +0000 | |
| commit | df68bf4fa33a578ead4f4fa8eb7f4b2adb685d1c (patch) | |
| tree | 64de90e7cce58ae3fa7b4f139109c87d60fc6f84 /services/surfaceflinger/SurfaceFlinger.cpp | |
| parent | f865f9a08c3604e229466ea8f64b091cfe52127b (diff) | |
| parent | 53852a5c891ea82b85391eec145c2ac9c2aaed23 (diff) | |
Merge "SurfaceFlinger: set refresh rate type when after an attempt to switch" into qt-r1-dev
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 41 | 
1 files changed, 17 insertions, 24 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index e735e10cc4..50fabe3c43 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -935,12 +935,9 @@ void SurfaceFlinger::setDesiredActiveConfig(const ActiveConfigInfo& info) {          // Start receiving vsync samples now, so that we can detect a period          // switch.          mScheduler->resyncToHardwareVsync(true, getVsyncPeriod()); -        // We should only move to early offsets when we know that the refresh -        // rate will change. Otherwise, we may be stuck in early offsets -        // forever, as onRefreshRateChangeDetected will not be called. -        if (mDesiredActiveConfig.event == Scheduler::ConfigEvent::Changed) { -            mVsyncModulator.onRefreshRateChangeInitiated(); -        } +        // As we called to set period, we will call to onRefreshRateChangeCompleted once +        // DispSync model is locked. +        mVsyncModulator.onRefreshRateChangeInitiated();          mPhaseOffsets->setRefreshRateType(info.type);          const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets();          mVsyncModulator.setPhaseOffsets(early, gl, late); @@ -975,7 +972,6 @@ void SurfaceFlinger::setActiveConfigInternal() {      display->setActiveConfig(mUpcomingActiveConfig.configId); -    mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());      mPhaseOffsets->setRefreshRateType(mUpcomingActiveConfig.type);      const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets();      mVsyncModulator.setPhaseOffsets(early, gl, late); @@ -987,6 +983,18 @@ void SurfaceFlinger::setActiveConfigInternal() {      }  } +void SurfaceFlinger::desiredActiveConfigChangeDone() { +    std::lock_guard<std::mutex> lock(mActiveConfigLock); +    mDesiredActiveConfig.event = Scheduler::ConfigEvent::None; +    mDesiredActiveConfigChanged = false; +    ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged); + +    mScheduler->resyncToHardwareVsync(true, getVsyncPeriod()); +    mPhaseOffsets->setRefreshRateType(mUpcomingActiveConfig.type); +    const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets(); +    mVsyncModulator.setPhaseOffsets(early, gl, late); +} +  bool SurfaceFlinger::performSetActiveConfig() {      ATRACE_CALL();      if (mCheckPendingFence) { @@ -1016,14 +1024,7 @@ bool SurfaceFlinger::performSetActiveConfig() {      if (!display || display->getActiveConfig() == desiredActiveConfig.configId) {          // display is not valid or we are already in the requested mode          // on both cases there is nothing left to do -        std::lock_guard<std::mutex> lock(mActiveConfigLock); -        mDesiredActiveConfig.event = Scheduler::ConfigEvent::None; -        mDesiredActiveConfigChanged = false; -        // Update scheduler with the correct vsync period as a no-op. -        // Otherwise, there exists a race condition where we get stuck in the -        // incorrect vsync period. -        mScheduler->resyncToHardwareVsync(false, getVsyncPeriod()); -        ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged); +        desiredActiveConfigChangeDone();          return false;      } @@ -1031,15 +1032,7 @@ bool SurfaceFlinger::performSetActiveConfig() {      // allowed configs might have change by the time we process the refresh.      // Make sure the desired config is still allowed      if (!isDisplayConfigAllowed(desiredActiveConfig.configId)) { -        std::lock_guard<std::mutex> lock(mActiveConfigLock); -        mDesiredActiveConfig.event = Scheduler::ConfigEvent::None; -        mDesiredActiveConfig.configId = display->getActiveConfig(); -        mDesiredActiveConfigChanged = false; -        // Update scheduler with the current vsync period as a no-op. -        // Otherwise, there exists a race condition where we get stuck in the -        // incorrect vsync period. -        mScheduler->resyncToHardwareVsync(false, getVsyncPeriod()); -        ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged); +        desiredActiveConfigChangeDone();          return false;      }      mUpcomingActiveConfig = desiredActiveConfig;  |