SF: enable high refresh rate virtual mode
Add support for SF backdoor to set a multiplier
and divisor on the period for VSYNC-sf and
VSYNC-app from the primary DispSync object.
Bug: 111549030
Test: enable high refresh rate in devOptions and
view with systrace
Change-Id: I4226d5791d8d7ddeae1ad96577713c9c2141ed58
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 31e4444..1c12bd5 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4855,6 +4855,33 @@
reply->writeBool(getBE().mHwc->isUsingVrComposer());
return NO_ERROR;
}
+ case 1029: {
+ // Code 1029 is an experimental feature that allows applications to
+ // simulate a high frequency panel by setting a multiplier and divisor
+ // on the VSYNC-sf clock. If either the multiplier or divisor are
+ // 0, then the code will set both to 1 to return the VSYNC-sf clock
+ // to it's normal frequency.
+ int multiplier = data.readInt32();
+ int divisor = data.readInt32();
+
+ if ((multiplier == 0) || (divisor == 0)) {
+ multiplier = 1;
+ divisor = 1;
+ }
+
+ if ((multiplier == 1) && (divisor == 1)) {
+ enableHardwareVsync();
+ } else {
+ disableHardwareVsync(true);
+ }
+ getBE().mHwc->getActiveConfig(DisplayDevice::DISPLAY_PRIMARY)
+ ->scalePanelFrequency(multiplier, divisor);
+ mPrimaryDispSync->scalePeriod(multiplier, divisor);
+
+ ATRACE_INT("PeriodMultiplier", multiplier);
+ ATRACE_INT("PeriodDivisor", divisor);
+ return NO_ERROR;
+ }
}
}
return err;