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

Commit cb665c04 authored by Ady Abraham's avatar Ady Abraham Committed by Automerger Merge Worker
Browse files

Merge "SF: introduce debug.sf.hwc.min.duration" into sc-dev am: a785b9a9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/15005988

Change-Id: Iaf3aa9d1baa2fc41b40181985a40cd1aef74ee0f
parents 19e047fb a785b9a9
Loading
Loading
Loading
Loading
+20 −9
Original line number Original line Diff line number Diff line
@@ -59,7 +59,7 @@ PhaseOffsets::VsyncConfigSet VsyncConfiguration::getConfigsForRefreshRateLocked(
}
}


void VsyncConfiguration::dump(std::string& result) const {
void VsyncConfiguration::dump(std::string& result) const {
    const auto [early, earlyGpu, late] = getCurrentConfigs();
    const auto [early, earlyGpu, late, hwcMinWorkDuration] = getCurrentConfigs();
    using base::StringAppendF;
    using base::StringAppendF;
    StringAppendF(&result,
    StringAppendF(&result,
                  "           app phase:    %9" PRId64 " ns\t         SF phase:    %9" PRId64
                  "           app phase:    %9" PRId64 " ns\t         SF phase:    %9" PRId64
@@ -70,7 +70,8 @@ void VsyncConfiguration::dump(std::string& result) const {
                  "     early app duration: %9lld ns\t   early SF duration: %9lld ns\n"
                  "     early app duration: %9lld ns\t   early SF duration: %9lld ns\n"
                  "  GL early app phase:    %9" PRId64 " ns\tGL early SF phase:    %9" PRId64
                  "  GL early app phase:    %9" PRId64 " ns\tGL early SF phase:    %9" PRId64
                  " ns\n"
                  " ns\n"
                  "  GL early app duration: %9lld ns\tGL early SF duration: %9lld ns\n",
                  "  GL early app duration: %9lld ns\tGL early SF duration: %9lld ns\n"
                  "       HWC min duration: %9lld ns\n",
                  late.appOffset, late.sfOffset,
                  late.appOffset, late.sfOffset,


                  late.appWorkDuration.count(), late.sfWorkDuration.count(),
                  late.appWorkDuration.count(), late.sfWorkDuration.count(),
@@ -81,7 +82,9 @@ void VsyncConfiguration::dump(std::string& result) const {


                  earlyGpu.appOffset, earlyGpu.sfOffset,
                  earlyGpu.appOffset, earlyGpu.sfOffset,


                  earlyGpu.appWorkDuration.count(), earlyGpu.sfWorkDuration.count());
                  earlyGpu.appWorkDuration.count(), earlyGpu.sfWorkDuration.count(),

                  hwcMinWorkDuration.count());
}
}


PhaseOffsets::PhaseOffsets(Fps currentRefreshRate)
PhaseOffsets::PhaseOffsets(Fps currentRefreshRate)
@@ -103,7 +106,8 @@ PhaseOffsets::PhaseOffsets(Fps currentRefreshRate)
                     // offset >= threshold, SF wake up (2 * vsync_duration - offset) before HW
                     // offset >= threshold, SF wake up (2 * vsync_duration - offset) before HW
                     // vsync.
                     // vsync.
                     getProperty("debug.sf.phase_offset_threshold_for_next_vsync_ns")
                     getProperty("debug.sf.phase_offset_threshold_for_next_vsync_ns")
                             .value_or(std::numeric_limits<nsecs_t>::max())) {}
                             .value_or(std::numeric_limits<nsecs_t>::max()),
                     getProperty("debug.sf.hwc.min.duration").value_or(0)) {}


PhaseOffsets::PhaseOffsets(Fps currentFps, nsecs_t vsyncPhaseOffsetNs, nsecs_t sfVSyncPhaseOffsetNs,
PhaseOffsets::PhaseOffsets(Fps currentFps, nsecs_t vsyncPhaseOffsetNs, nsecs_t sfVSyncPhaseOffsetNs,
                           std::optional<nsecs_t> earlySfOffsetNs,
                           std::optional<nsecs_t> earlySfOffsetNs,
@@ -115,7 +119,7 @@ PhaseOffsets::PhaseOffsets(Fps currentFps, nsecs_t vsyncPhaseOffsetNs, nsecs_t s
                           std::optional<nsecs_t> highFpsEarlyGpuSfOffsetNs,
                           std::optional<nsecs_t> highFpsEarlyGpuSfOffsetNs,
                           std::optional<nsecs_t> highFpsEarlyAppOffsetNs,
                           std::optional<nsecs_t> highFpsEarlyAppOffsetNs,
                           std::optional<nsecs_t> highFpsEarlyGpuAppOffsetNs,
                           std::optional<nsecs_t> highFpsEarlyGpuAppOffsetNs,
                           nsecs_t thresholdForNextVsync)
                           nsecs_t thresholdForNextVsync, nsecs_t hwcMinWorkDuration)
      : VsyncConfiguration(currentFps),
      : VsyncConfiguration(currentFps),
        mVSyncPhaseOffsetNs(vsyncPhaseOffsetNs),
        mVSyncPhaseOffsetNs(vsyncPhaseOffsetNs),
        mSfVSyncPhaseOffsetNs(sfVSyncPhaseOffsetNs),
        mSfVSyncPhaseOffsetNs(sfVSyncPhaseOffsetNs),
@@ -129,7 +133,8 @@ PhaseOffsets::PhaseOffsets(Fps currentFps, nsecs_t vsyncPhaseOffsetNs, nsecs_t s
        mHighFpsEarlyGpuSfOffsetNs(highFpsEarlyGpuSfOffsetNs),
        mHighFpsEarlyGpuSfOffsetNs(highFpsEarlyGpuSfOffsetNs),
        mHighFpsEarlyAppOffsetNs(highFpsEarlyAppOffsetNs),
        mHighFpsEarlyAppOffsetNs(highFpsEarlyAppOffsetNs),
        mHighFpsEarlyGpuAppOffsetNs(highFpsEarlyGpuAppOffsetNs),
        mHighFpsEarlyGpuAppOffsetNs(highFpsEarlyGpuAppOffsetNs),
        mThresholdForNextVsync(thresholdForNextVsync) {}
        mThresholdForNextVsync(thresholdForNextVsync),
        mHwcMinWorkDuration(hwcMinWorkDuration) {}


PhaseOffsets::VsyncConfigSet PhaseOffsets::constructOffsets(nsecs_t vsyncDuration) const {
PhaseOffsets::VsyncConfigSet PhaseOffsets::constructOffsets(nsecs_t vsyncDuration) const {
    if (vsyncDuration < std::chrono::nanoseconds(15ms).count()) {
    if (vsyncDuration < std::chrono::nanoseconds(15ms).count()) {
@@ -189,6 +194,7 @@ PhaseOffsets::VsyncConfigSet PhaseOffsets::getDefaultOffsets(nsecs_t vsyncDurati
                     .sfWorkDuration = sfOffsetToDuration(lateSfOffset, vsyncDuration),
                     .sfWorkDuration = sfOffsetToDuration(lateSfOffset, vsyncDuration),
                     .appWorkDuration =
                     .appWorkDuration =
                             appOffsetToDuration(lateAppOffset, lateSfOffset, vsyncDuration)},
                             appOffsetToDuration(lateAppOffset, lateSfOffset, vsyncDuration)},
            .hwcMinWorkDuration = std::chrono::nanoseconds(mHwcMinWorkDuration),
    };
    };
}
}


@@ -234,6 +240,7 @@ PhaseOffsets::VsyncConfigSet PhaseOffsets::getHighFpsOffsets(nsecs_t vsyncDurati
                            .appWorkDuration =
                            .appWorkDuration =
                                    appOffsetToDuration(lateAppOffset, lateSfOffset, vsyncDuration),
                                    appOffsetToDuration(lateAppOffset, lateSfOffset, vsyncDuration),
                    },
                    },
            .hwcMinWorkDuration = std::chrono::nanoseconds(mHwcMinWorkDuration),
    };
    };
}
}


@@ -342,6 +349,7 @@ WorkDuration::VsyncConfigSet WorkDuration::constructOffsets(nsecs_t vsyncDuratio
                            .sfWorkDuration = sfDuration,
                            .sfWorkDuration = sfDuration,
                            .appWorkDuration = appDuration,
                            .appWorkDuration = appDuration,
                    },
                    },
            .hwcMinWorkDuration = std::chrono::nanoseconds(mHwcMinWorkDuration),
    };
    };
}
}


@@ -351,19 +359,22 @@ WorkDuration::WorkDuration(Fps currentRefreshRate)
                     getProperty("debug.sf.early.sf.duration").value_or(mSfDuration),
                     getProperty("debug.sf.early.sf.duration").value_or(mSfDuration),
                     getProperty("debug.sf.early.app.duration").value_or(mAppDuration),
                     getProperty("debug.sf.early.app.duration").value_or(mAppDuration),
                     getProperty("debug.sf.earlyGl.sf.duration").value_or(mSfDuration),
                     getProperty("debug.sf.earlyGl.sf.duration").value_or(mSfDuration),
                     getProperty("debug.sf.earlyGl.app.duration").value_or(mAppDuration)) {
                     getProperty("debug.sf.earlyGl.app.duration").value_or(mAppDuration),
                     getProperty("debug.sf.hwc.min.duration").value_or(0)) {
    validateSysprops();
    validateSysprops();
}
}


WorkDuration::WorkDuration(Fps currentRefreshRate, nsecs_t sfDuration, nsecs_t appDuration,
WorkDuration::WorkDuration(Fps currentRefreshRate, nsecs_t sfDuration, nsecs_t appDuration,
                           nsecs_t sfEarlyDuration, nsecs_t appEarlyDuration,
                           nsecs_t sfEarlyDuration, nsecs_t appEarlyDuration,
                           nsecs_t sfEarlyGpuDuration, nsecs_t appEarlyGpuDuration)
                           nsecs_t sfEarlyGpuDuration, nsecs_t appEarlyGpuDuration,
                           nsecs_t hwcMinWorkDuration)
      : VsyncConfiguration(currentRefreshRate),
      : VsyncConfiguration(currentRefreshRate),
        mSfDuration(sfDuration),
        mSfDuration(sfDuration),
        mAppDuration(appDuration),
        mAppDuration(appDuration),
        mSfEarlyDuration(sfEarlyDuration),
        mSfEarlyDuration(sfEarlyDuration),
        mAppEarlyDuration(appEarlyDuration),
        mAppEarlyDuration(appEarlyDuration),
        mSfEarlyGpuDuration(sfEarlyGpuDuration),
        mSfEarlyGpuDuration(sfEarlyGpuDuration),
        mAppEarlyGpuDuration(appEarlyGpuDuration) {}
        mAppEarlyGpuDuration(appEarlyGpuDuration),
        mHwcMinWorkDuration(hwcMinWorkDuration) {}


} // namespace android::scheduler::impl
} // namespace android::scheduler::impl
+7 −2
Original line number Original line Diff line number Diff line
@@ -111,7 +111,8 @@ protected:
                 nsecs_t highFpsSfVSyncPhaseOffsetNs, std::optional<nsecs_t> highFpsEarlySfOffsetNs,
                 nsecs_t highFpsSfVSyncPhaseOffsetNs, std::optional<nsecs_t> highFpsEarlySfOffsetNs,
                 std::optional<nsecs_t> highFpsEarlyGpuSfOffsetNs,
                 std::optional<nsecs_t> highFpsEarlyGpuSfOffsetNs,
                 std::optional<nsecs_t> highFpsEarlyAppOffsetNs,
                 std::optional<nsecs_t> highFpsEarlyAppOffsetNs,
                 std::optional<nsecs_t> highFpsEarlyGpuAppOffsetNs, nsecs_t thresholdForNextVsync);
                 std::optional<nsecs_t> highFpsEarlyGpuAppOffsetNs, nsecs_t thresholdForNextVsync,
                 nsecs_t hwcMinWorkDuration);


private:
private:
    VsyncConfiguration::VsyncConfigSet constructOffsets(nsecs_t vsyncDuration) const override;
    VsyncConfiguration::VsyncConfigSet constructOffsets(nsecs_t vsyncDuration) const override;
@@ -134,6 +135,7 @@ private:
    const std::optional<nsecs_t> mHighFpsEarlyGpuAppOffsetNs;
    const std::optional<nsecs_t> mHighFpsEarlyGpuAppOffsetNs;


    const nsecs_t mThresholdForNextVsync;
    const nsecs_t mThresholdForNextVsync;
    const nsecs_t mHwcMinWorkDuration;
};
};


/*
/*
@@ -148,7 +150,8 @@ public:
protected:
protected:
    // Used for unit tests
    // Used for unit tests
    WorkDuration(Fps currentFps, nsecs_t sfDuration, nsecs_t appDuration, nsecs_t sfEarlyDuration,
    WorkDuration(Fps currentFps, nsecs_t sfDuration, nsecs_t appDuration, nsecs_t sfEarlyDuration,
                 nsecs_t appEarlyDuration, nsecs_t sfEarlyGpuDuration, nsecs_t appEarlyGpuDuration);
                 nsecs_t appEarlyDuration, nsecs_t sfEarlyGpuDuration, nsecs_t appEarlyGpuDuration,
                 nsecs_t hwcMinWorkDuration);


private:
private:
    VsyncConfiguration::VsyncConfigSet constructOffsets(nsecs_t vsyncDuration) const override;
    VsyncConfiguration::VsyncConfigSet constructOffsets(nsecs_t vsyncDuration) const override;
@@ -161,6 +164,8 @@ private:


    const nsecs_t mSfEarlyGpuDuration;
    const nsecs_t mSfEarlyGpuDuration;
    const nsecs_t mAppEarlyGpuDuration;
    const nsecs_t mAppEarlyGpuDuration;

    const nsecs_t mHwcMinWorkDuration;
};
};


} // namespace impl
} // namespace impl
+4 −1
Original line number Original line Diff line number Diff line
@@ -69,9 +69,12 @@ public:
        VsyncConfig early;    // Used for early transactions, and during refresh rate change.
        VsyncConfig early;    // Used for early transactions, and during refresh rate change.
        VsyncConfig earlyGpu; // Used during GPU composition.
        VsyncConfig earlyGpu; // Used during GPU composition.
        VsyncConfig late;     // Default.
        VsyncConfig late;     // Default.
        std::chrono::nanoseconds hwcMinWorkDuration; // Used for calculating the
                                                     // earliest present time


        bool operator==(const VsyncConfigSet& other) const {
        bool operator==(const VsyncConfigSet& other) const {
            return early == other.early && earlyGpu == other.earlyGpu && late == other.late;
            return early == other.early && earlyGpu == other.earlyGpu && late == other.late &&
                    hwcMinWorkDuration == other.hwcMinWorkDuration;
        }
        }


        bool operator!=(const VsyncConfigSet& other) const { return !(*this == other); }
        bool operator!=(const VsyncConfigSet& other) const { return !(*this == other); }
+3 −1
Original line number Original line Diff line number Diff line
@@ -2066,7 +2066,9 @@ void SurfaceFlinger::onMessageRefresh() {
                std::chrono::milliseconds(mDebugRegion > 1 ? mDebugRegion : 0);
                std::chrono::milliseconds(mDebugRegion > 1 ? mDebugRegion : 0);
    }
    }


    refreshArgs.earliestPresentTime = mScheduler->getPreviousVsyncFrom(mExpectedPresentTime);
    const auto prevVsyncTime = mScheduler->getPreviousVsyncFrom(mExpectedPresentTime);
    const auto hwcMinWorkDuration = mVsyncConfiguration->getCurrentConfigs().hwcMinWorkDuration;
    refreshArgs.earliestPresentTime = prevVsyncTime - hwcMinWorkDuration;
    refreshArgs.nextInvalidateTime = mEventQueue->nextExpectedInvalidate();
    refreshArgs.nextInvalidateTime = mEventQueue->nextExpectedInvalidate();


    mGeometryInvalid = false;
    mGeometryInvalid = false;
+2 −1
Original line number Original line Diff line number Diff line
@@ -34,7 +34,8 @@ struct FakePhaseOffsets : VsyncConfiguration {
                {FAKE_PHASE_OFFSET_NS, FAKE_PHASE_OFFSET_NS, FAKE_DURATION_OFFSET_NS,
                {FAKE_PHASE_OFFSET_NS, FAKE_PHASE_OFFSET_NS, FAKE_DURATION_OFFSET_NS,
                 FAKE_DURATION_OFFSET_NS},
                 FAKE_DURATION_OFFSET_NS},
                {FAKE_PHASE_OFFSET_NS, FAKE_PHASE_OFFSET_NS, FAKE_DURATION_OFFSET_NS,
                {FAKE_PHASE_OFFSET_NS, FAKE_PHASE_OFFSET_NS, FAKE_DURATION_OFFSET_NS,
                 FAKE_DURATION_OFFSET_NS}};
                 FAKE_DURATION_OFFSET_NS},
                FAKE_DURATION_OFFSET_NS};
    }
    }


    void reset() override {}
    void reset() override {}
Loading