diff options
| -rw-r--r-- | services/surfaceflinger/Scheduler/DispSync.cpp | 8 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/VSyncModulator.cpp | 29 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/VSyncModulator.h | 6 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 5 |
4 files changed, 28 insertions, 20 deletions
diff --git a/services/surfaceflinger/Scheduler/DispSync.cpp b/services/surfaceflinger/Scheduler/DispSync.cpp index 81be372091..83fd42b43f 100644 --- a/services/surfaceflinger/Scheduler/DispSync.cpp +++ b/services/surfaceflinger/Scheduler/DispSync.cpp @@ -92,8 +92,12 @@ public: mPeriod = period; if (!mModelLocked && referenceTimeChanged) { for (auto& eventListener : mEventListeners) { - eventListener.mLastEventTime = - mReferenceTime - mPeriod + mPhase + eventListener.mPhase; + eventListener.mLastEventTime = mReferenceTime + mPhase + eventListener.mPhase; + // If mLastEventTime is after mReferenceTime (can happen when positive phase offsets + // are used) we treat it as like it happened in previous period. + if (eventListener.mLastEventTime > mReferenceTime) { + eventListener.mLastEventTime -= mPeriod; + } } } if (mTraceDetailedInfo) { diff --git a/services/surfaceflinger/Scheduler/VSyncModulator.cpp b/services/surfaceflinger/Scheduler/VSyncModulator.cpp index 381308ab34..d452c19b68 100644 --- a/services/surfaceflinger/Scheduler/VSyncModulator.cpp +++ b/services/surfaceflinger/Scheduler/VSyncModulator.cpp @@ -102,7 +102,7 @@ void VSyncModulator::onRefreshed(bool usedRenderEngine) { VSyncModulator::Offsets VSyncModulator::getOffsets() { std::lock_guard<std::mutex> lock(mMutex); - return mOffsetMap.at(mOffsetType); + return mOffsets; } VSyncModulator::Offsets VSyncModulator::getNextOffsets() { @@ -129,13 +129,13 @@ void VSyncModulator::updateOffsets() { void VSyncModulator::updateOffsetsLocked() { const Offsets desired = getNextOffsets(); - const Offsets current = mOffsetMap.at(mOffsetType); + const Offsets current = mOffsets; bool changed = false; if (desired.sf != current.sf) { if (mSfConnectionHandle != nullptr) { mScheduler->setPhaseOffset(mSfConnectionHandle, desired.sf); - } else { + } else if (mSfEventThread != nullptr) { mSfEventThread->setPhaseOffset(desired.sf); } changed = true; @@ -143,36 +143,35 @@ void VSyncModulator::updateOffsetsLocked() { if (desired.app != current.app) { if (mAppConnectionHandle != nullptr) { mScheduler->setPhaseOffset(mAppConnectionHandle, desired.app); - } else { + } else if (mAppEventThread != nullptr) { mAppEventThread->setPhaseOffset(desired.app); } changed = true; } if (changed) { - updateOffsetType(); + flushOffsets(); } } -void VSyncModulator::updateOffsetType() { - mOffsetType = getNextOffsetType(); +void VSyncModulator::flushOffsets() { + OffsetType type = getNextOffsetType(); + mOffsets = mOffsetMap.at(type); if (!mTraceDetailedInfo) { return; } - OffsetType type = mOffsetType; - Offsets offsets = mOffsetMap.at(type); ATRACE_INT("Vsync-EarlyOffsetsOn", - offsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Early); + mOffsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Early); ATRACE_INT("Vsync-EarlyGLOffsetsOn", - offsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::EarlyGl); + mOffsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::EarlyGl); ATRACE_INT("Vsync-LateOffsetsOn", - offsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Late); + mOffsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Late); ATRACE_INT("Vsync-HighFpsEarlyOffsetsOn", - offsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Early); + mOffsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Early); ATRACE_INT("Vsync-HighFpsEarlyGLOffsetsOn", - offsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::EarlyGl); + mOffsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::EarlyGl); ATRACE_INT("Vsync-HighFpsLateOffsetsOn", - offsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Late); + mOffsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Late); } } // namespace android diff --git a/services/surfaceflinger/Scheduler/VSyncModulator.h b/services/surfaceflinger/Scheduler/VSyncModulator.h index c6374be83a..10cf8e6cc9 100644 --- a/services/surfaceflinger/Scheduler/VSyncModulator.h +++ b/services/surfaceflinger/Scheduler/VSyncModulator.h @@ -114,8 +114,8 @@ private: // Updates offsets and persists them into the scheduler framework. void updateOffsets() EXCLUDES(mMutex); void updateOffsetsLocked() REQUIRES(mMutex); - // Updates the internal offset type. - void updateOffsetType() REQUIRES(mMutex); + // Updates the internal offsets and offset type. + void flushOffsets() REQUIRES(mMutex); mutable std::mutex mMutex; std::unordered_map<OffsetType, Offsets> mOffsetMap GUARDED_BY(mMutex); @@ -128,7 +128,7 @@ private: Scheduler::ConnectionHandle* mAppConnectionHandle = nullptr; Scheduler::ConnectionHandle* mSfConnectionHandle = nullptr; - OffsetType mOffsetType GUARDED_BY(mMutex) = OffsetType::Late; + Offsets mOffsets GUARDED_BY(mMutex) = {Scheduler::RefreshRateType::DEFAULT, 0, 0}; std::atomic<Scheduler::TransactionStart> mTransactionStart = Scheduler::TransactionStart::NORMAL; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 60c6e4ecee..459cd0af89 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -5665,6 +5665,11 @@ status_t SurfaceFlinger::captureScreen(uint64_t displayOrLayerStack, Dataspace* captureOrientation = fromSurfaceComposerRotation( static_cast<ISurfaceComposer::Rotation>(display->getOrientation())); + if (captureOrientation == ui::Transform::orientation_flags::ROT_90) { + captureOrientation = ui::Transform::orientation_flags::ROT_270; + } else if (captureOrientation == ui::Transform::orientation_flags::ROT_270) { + captureOrientation = ui::Transform::orientation_flags::ROT_90; + } *outDataspace = pickDataspaceFromColorMode(display->getCompositionDisplay()->getState().colorMode); } |