summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Buckley <mattbuckley@google.com>2023-05-25 22:09:26 +0000
committerMatt Buckley <mattbuckley@google.com>2023-05-31 20:11:44 +0000
commit676e4390c3dc26910edfb6c6a3c52ffe4b898bf3 (patch)
treeb15bbaba8751019570ca8111f8f83fa9c71c3706
parentbb319326a6a8235e0227d404e428f9fcd23cfaec (diff)
downloadnative-676e4390c3dc26910edfb6c6a3c52ffe4b898bf3.tar.gz
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
-rw-r--r--services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp5
-rw-r--r--services/surfaceflinger/DisplayHardware/PowerAdvisor.h3
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp5
3 files changed, 11 insertions, 2 deletions
diff --git a/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp b/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp
index 37b68c865e..f8b466c93c 100644
--- a/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp
+++ b/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp
@@ -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(); });
diff --git a/services/surfaceflinger/DisplayHardware/PowerAdvisor.h b/services/surfaceflinger/DisplayHardware/PowerAdvisor.h
index 7a0d4267fe..f0d3fd8518 100644
--- a/services/surfaceflinger/DisplayHardware/PowerAdvisor.h
+++ b/services/surfaceflinger/DisplayHardware/PowerAdvisor.h
@@ -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};
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 5d96fc45be..bbfed8a823 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -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) {