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

Commit b656aed0 authored by Alec Mouri's avatar Alec Mouri
Browse files

[SurfaceFlinger] Store current offsets in VSyncModulator.

This way updated offsets are properly persisted to DispSyncSource.

Bug: 135770834
Test: systrace shows correct offsets
Change-Id: I34ed81ebecfa8a4f9826d4a7713da0ec0a8b23de
parent 769ab6f9
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -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;