diff options
| author | Siarhei Vishniakou <svv@google.com> | 2021-02-26 00:15:04 +0000 |
|---|---|---|
| committer | Siarhei Vishniakou <svv@google.com> | 2021-03-05 21:42:32 +0000 |
| commit | f0cf18d3ed1c993cfd70bafc6867782d80cc24cc (patch) | |
| tree | 99d87e66cfad4485f9eea001d4f87e5c5590e239 /core/java/android/view/ViewRootImpl.java | |
| parent | 7102d06f9e912a89960459a58d82bd4821a65a4c (diff) | |
Pass actual present time to ViewRootImpl
To measure end-to-end touch latency, we need to report the actual
present time to ViewRootImpl. ViewRootImpl, in turn, will report this
information to InputDispatcher. Finally, InputDispatcher will combine
all known information for a specific input event, and will report this
data to westworld.
In another patch, we will add a new call, 'reportLatencyInfo', to
InputPublisher. This call will allow the app to send this latency data
to InputDispatcher.
Bug: 169866723
Test: printed the input event present times inside ViewRootImpl
Change-Id: Ibd3a2cfeb1a340eb15cd2165071df1f8589634af
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 390e3ae78143..9fc415d6401f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -16,6 +16,7 @@ package android.view; +import static android.os.IInputConstants.INVALID_INPUT_EVENT_ID; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import static android.view.InputDevice.SOURCE_CLASS_NONE; @@ -105,6 +106,7 @@ import android.graphics.Color; import android.graphics.FrameInfo; import android.graphics.HardwareRenderer; import android.graphics.HardwareRenderer.FrameDrawingCallback; +import android.graphics.HardwareRendererObserver; import android.graphics.Insets; import android.graphics.Matrix; import android.graphics.PixelFormat; @@ -1191,6 +1193,14 @@ public final class ViewRootImpl implements ViewParent, } mInputEventReceiver = new WindowInputEventReceiver(inputChannel, Looper.myLooper()); + + if (mAttachInfo.mThreadedRenderer != null) { + InputMetricsListener listener = + new InputMetricsListener(mInputEventReceiver); + mHardwareRendererObserver = new HardwareRendererObserver( + listener, listener.data, mHandler, true /*waitForPresentTime*/); + mAttachInfo.mThreadedRenderer.addObserver(mHardwareRendererObserver); + } } view.assignParent(this); @@ -8569,6 +8579,34 @@ public final class ViewRootImpl implements ViewParent, } WindowInputEventReceiver mInputEventReceiver; + final class InputMetricsListener + implements HardwareRendererObserver.OnFrameMetricsAvailableListener { + public long[] data = new long[FrameMetrics.Index.FRAME_STATS_COUNT]; + + private InputEventReceiver mReceiver; + + InputMetricsListener(InputEventReceiver receiver) { + mReceiver = receiver; + } + + @Override + public void onFrameMetricsAvailable(int dropCountSinceLastInvocation) { + final int inputEventId = (int) data[FrameMetrics.Index.INPUT_EVENT_ID]; + if (inputEventId == INVALID_INPUT_EVENT_ID) { + return; + } + final long presentTime = data[FrameMetrics.Index.DISPLAY_PRESENT_TIME]; + if (presentTime <= 0) { + // Present time is not available for this frame. If the present time is not + // available, we cannot compute end-to-end input latency metrics. + return; + } + final long gpuCompletedTime = data[FrameMetrics.Index.GPU_COMPLETED]; + mReceiver.reportLatencyInfo(inputEventId, gpuCompletedTime, presentTime); + } + } + HardwareRendererObserver mHardwareRendererObserver; + final class ConsumeBatchedInputRunnable implements Runnable { @Override public void run() { |
