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

Commit 676e4390 authored by Matt Buckley's avatar Matt Buckley
Browse files

Reduce number of binders from SurfaceFlinger for ADPF

Currently, SF is using the wrong vsync value when calculating the
target for ADPF, causing it to send a binder every frame instead of
every vsync change. This patch fixes that to reduce the binder
frequency from SF, and also adds a debug option to disable reportActual
to reduce the amount of binders even more in certain cases.

Bug: 284357218
Test: manual
Change-Id: I8435b170016c5af8219d8ed8cc9ed65a0a2cb0e7
parent bb319326
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -223,7 +223,7 @@ void PowerAdvisor::updateTargetWorkDuration(Duration targetDuration) {
}

void PowerAdvisor::reportActualWorkDuration() {
    if (!mBootFinished || !usePowerHintSession()) {
    if (!mBootFinished || !sUseReportActualDuration || !usePowerHintSession()) {
        ALOGV("Actual work duration power hint cannot be sent, skipping");
        return;
    }
@@ -564,6 +564,9 @@ const Duration PowerAdvisor::sTargetSafetyMargin = std::chrono::microseconds(
        base::GetIntProperty<int64_t>("debug.sf.hint_margin_us",
                                      ticks<std::micro>(PowerAdvisor::kDefaultTargetSafetyMargin)));

const bool PowerAdvisor::sUseReportActualDuration =
        base::GetBoolProperty(std::string("debug.adpf.use_report_actual_duration"), true);

power::PowerHalController& PowerAdvisor::getPowerHal() {
    static std::once_flag halFlag;
    std::call_once(halFlag, [this] { mPowerHal->init(); });
+3 −0
Original line number Diff line number Diff line
@@ -269,6 +269,9 @@ private:
    static const Duration sTargetSafetyMargin;
    static constexpr const Duration kDefaultTargetSafetyMargin{1ms};

    // Whether we should send reportActualWorkDuration calls
    static const bool sUseReportActualDuration;

    // How long we expect hwc to run after the present call until it waits for the fence
    static constexpr const Duration kFenceWaitStartDelayValidated{150us};
    static constexpr const Duration kFenceWaitStartDelaySkippedValidate{250us};
+4 −1
Original line number Diff line number Diff line
@@ -2485,7 +2485,10 @@ bool SurfaceFlinger::commit(TimePoint frameTime, VsyncId vsyncId, TimePoint expe

        mPowerAdvisor->setFrameDelay(frameDelay);
        mPowerAdvisor->setTotalFrameTargetWorkDuration(idealSfWorkDuration);
        mPowerAdvisor->updateTargetWorkDuration(vsyncPeriod);

        const auto& display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked()).get();
        const Period idealVsyncPeriod = display->getActiveMode().fps.getPeriod();
        mPowerAdvisor->updateTargetWorkDuration(idealVsyncPeriod);
    }

    if (mRefreshRateOverlaySpinner) {