Loading services/surfaceflinger/Scheduler/VSyncModulator.h +13 −4 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,11 @@ private: // sending new transactions. // sending new transactions. const int MIN_EARLY_FRAME_COUNT_TRANSACTION = 2; const int MIN_EARLY_FRAME_COUNT_TRANSACTION = 2; // Number of frames we'll keep the early gl phase offsets once they are activated. // This acts as a low-pass filter to avoid scenarios where we rapidly // switch in and out of gl composition. const int MIN_EARLY_GL_FRAME_COUNT_TRANSACTION = 2; public: public: struct Offsets { struct Offsets { nsecs_t sf; nsecs_t sf; Loading Loading @@ -130,10 +135,14 @@ public: mRemainingEarlyFrameCount--; mRemainingEarlyFrameCount--; updateOffsetsNeeded = true; updateOffsetsNeeded = true; } } if (usedRenderEngine != mLastFrameUsedRenderEngine) { if (usedRenderEngine) { mLastFrameUsedRenderEngine = usedRenderEngine; mRemainingRenderEngineUsageCount = MIN_EARLY_GL_FRAME_COUNT_TRANSACTION; updateOffsetsNeeded = true; } else if (mRemainingRenderEngineUsageCount > 0) { mRemainingRenderEngineUsageCount--; updateOffsetsNeeded = true; updateOffsetsNeeded = true; } } if (updateOffsetsNeeded) { if (updateOffsetsNeeded) { updateOffsets(); updateOffsets(); } } Loading @@ -145,7 +154,7 @@ public: if (mTransactionStart == Scheduler::TransactionStart::EARLY || if (mTransactionStart == Scheduler::TransactionStart::EARLY || mRemainingEarlyFrameCount > 0 || mRefreshRateChangePending) { mRemainingEarlyFrameCount > 0 || mRefreshRateChangePending) { return mEarlyOffsets; return mEarlyOffsets; } else if (mLastFrameUsedRenderEngine) { } else if (mRemainingRenderEngineUsageCount > 0) { return mEarlyGlOffsets; return mEarlyGlOffsets; } else { } else { return mLateOffsets; return mLateOffsets; Loading Loading @@ -195,9 +204,9 @@ private: std::atomic<Scheduler::TransactionStart> mTransactionStart = std::atomic<Scheduler::TransactionStart> mTransactionStart = Scheduler::TransactionStart::NORMAL; Scheduler::TransactionStart::NORMAL; std::atomic<bool> mLastFrameUsedRenderEngine = false; std::atomic<bool> mRefreshRateChangePending = false; std::atomic<bool> mRefreshRateChangePending = false; std::atomic<int> mRemainingEarlyFrameCount = 0; std::atomic<int> mRemainingEarlyFrameCount = 0; std::atomic<int> mRemainingRenderEngineUsageCount = 0; }; }; } // namespace android } // namespace android Loading
services/surfaceflinger/Scheduler/VSyncModulator.h +13 −4 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,11 @@ private: // sending new transactions. // sending new transactions. const int MIN_EARLY_FRAME_COUNT_TRANSACTION = 2; const int MIN_EARLY_FRAME_COUNT_TRANSACTION = 2; // Number of frames we'll keep the early gl phase offsets once they are activated. // This acts as a low-pass filter to avoid scenarios where we rapidly // switch in and out of gl composition. const int MIN_EARLY_GL_FRAME_COUNT_TRANSACTION = 2; public: public: struct Offsets { struct Offsets { nsecs_t sf; nsecs_t sf; Loading Loading @@ -130,10 +135,14 @@ public: mRemainingEarlyFrameCount--; mRemainingEarlyFrameCount--; updateOffsetsNeeded = true; updateOffsetsNeeded = true; } } if (usedRenderEngine != mLastFrameUsedRenderEngine) { if (usedRenderEngine) { mLastFrameUsedRenderEngine = usedRenderEngine; mRemainingRenderEngineUsageCount = MIN_EARLY_GL_FRAME_COUNT_TRANSACTION; updateOffsetsNeeded = true; } else if (mRemainingRenderEngineUsageCount > 0) { mRemainingRenderEngineUsageCount--; updateOffsetsNeeded = true; updateOffsetsNeeded = true; } } if (updateOffsetsNeeded) { if (updateOffsetsNeeded) { updateOffsets(); updateOffsets(); } } Loading @@ -145,7 +154,7 @@ public: if (mTransactionStart == Scheduler::TransactionStart::EARLY || if (mTransactionStart == Scheduler::TransactionStart::EARLY || mRemainingEarlyFrameCount > 0 || mRefreshRateChangePending) { mRemainingEarlyFrameCount > 0 || mRefreshRateChangePending) { return mEarlyOffsets; return mEarlyOffsets; } else if (mLastFrameUsedRenderEngine) { } else if (mRemainingRenderEngineUsageCount > 0) { return mEarlyGlOffsets; return mEarlyGlOffsets; } else { } else { return mLateOffsets; return mLateOffsets; Loading Loading @@ -195,9 +204,9 @@ private: std::atomic<Scheduler::TransactionStart> mTransactionStart = std::atomic<Scheduler::TransactionStart> mTransactionStart = Scheduler::TransactionStart::NORMAL; Scheduler::TransactionStart::NORMAL; std::atomic<bool> mLastFrameUsedRenderEngine = false; std::atomic<bool> mRefreshRateChangePending = false; std::atomic<bool> mRefreshRateChangePending = false; std::atomic<int> mRemainingEarlyFrameCount = 0; std::atomic<int> mRemainingEarlyFrameCount = 0; std::atomic<int> mRemainingRenderEngineUsageCount = 0; }; }; } // namespace android } // namespace android