Do not send bogus vsync refresh information.
During foregrounding, the android choreographer seems to be sometimes
called twice with a very short interval in its parameters (24ns).
This CL prevents the sync provider to report any vsync refresh superior
to 1000Hz.
R=etiennej@chromium.org, etiennej
BUG=https://github.com/domokit/mojo/issues/758
Review URL: https://codereview.chromium.org/1910803002 .
diff --git a/ui/gl/android/java/src/org/chromium/ui/gl/VSyncProvider.java b/ui/gl/android/java/src/org/chromium/ui/gl/VSyncProvider.java
index 6f83d87..31cc62a 100644
--- a/ui/gl/android/java/src/org/chromium/ui/gl/VSyncProvider.java
+++ b/ui/gl/android/java/src/org/chromium/ui/gl/VSyncProvider.java
@@ -19,6 +19,8 @@
private static final long MAX_DRIFT_PERCENT = 5;
// A refresh period of more than 1s is considered bogus.
private static final long MAX_VSYNC_REFRESH_NANO = 1000000000L;
+ // A refresh period bigger than 1000Hz is considered bogus.
+ private static final long MIN_VSYNC_REFRESH_NANO = 1000000L;
private final Choreographer mChoreographer;
private boolean mMonitoring;
private long mNativeAndroidVSyncProvider;
@@ -53,7 +55,7 @@
}
@Override
- public void doFrame(long timeNano) {
+ public void doFrame(final long timeNano) {
if (mNativeAndroidVSyncProvider == 0) {
mMonitoring = false;
return;
@@ -65,25 +67,25 @@
}
mChoreographer.postFrameCallback(this);
- long currentTimeNano = timeNano;
if (mLastTimeNano != 0) {
- long currentRefreshNano = currentTimeNano - mLastTimeNano;
- if (currentRefreshNano < MAX_VSYNC_REFRESH_NANO) {
+ long currentRefreshNano = timeNano - mLastTimeNano;
+ if (currentRefreshNano > MIN_VSYNC_REFRESH_NANO
+ && currentRefreshNano < MAX_VSYNC_REFRESH_NANO) {
mVSyncRefreshNanoComputer.add(currentRefreshNano);
if (mLastSentTimeSynchronizationNano == 0
- || computeSynchronizationDriftPercent(currentTimeNano,
+ || computeSynchronizationDriftPercent(timeNano,
mLastSentTimeSynchronizationNano, mLastSentVSyncRefreshNano)
> MAX_DRIFT_PERCENT
|| computeRefreshDriftPercent(currentRefreshNano, mLastSentVSyncRefreshNano)
> MAX_DRIFT_PERCENT) {
- mLastSentTimeSynchronizationNano = currentTimeNano;
+ mLastSentTimeSynchronizationNano = timeNano;
mLastSentVSyncRefreshNano = mVSyncRefreshNanoComputer.getMedian();
- nativeOnSyncChanged(mNativeAndroidVSyncProvider, currentTimeNano / 1000,
+ nativeOnSyncChanged(mNativeAndroidVSyncProvider, timeNano / 1000,
mLastSentVSyncRefreshNano / 1000);
}
}
}
- mLastTimeNano = currentTimeNano;
+ mLastTimeNano = timeNano;
}
@CalledByNative