Loading core/java/android/view/FrameMetricsObserver.java +2 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,8 @@ public class FrameMetricsObserver mWindow = new WeakReference<>(window); mListener = listener; mFrameMetrics = new FrameMetrics(); mObserver = new HardwareRendererObserver(this, mFrameMetrics.mTimingData, handler); mObserver = new HardwareRendererObserver(this, mFrameMetrics.mTimingData, handler, false /*waitForPresentTime*/); } /** Loading core/java/android/view/InputEventReceiver.java +10 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.os.Build; import android.os.IBinder; import android.os.Looper; import android.os.MessageQueue; import android.os.Trace; import android.util.Log; import android.util.SparseIntArray; Loading Loading @@ -197,6 +198,15 @@ public abstract class InputEventReceiver { event.recycleIfNeededAfterDispatch(); } /** * Report the latency information for a specific input event. */ public final void reportLatencyInfo(int inputEventId, long gpuCompletedTime, long presentTime) { Trace.traceBegin(Trace.TRACE_TAG_INPUT, "reportLatencyInfo"); // TODO(b/169866723) : send this data to InputDispatcher via InputChannel Trace.traceEnd(Trace.TRACE_TAG_INPUT); } /** * Consumes all pending batched input events. * Must be called on the same Looper thread to which the receiver is attached. Loading core/java/android/view/ViewRootImpl.java +38 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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() { Loading core/java/com/android/internal/jank/FrameTracker.java +2 −1 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener mChoreographer = choreographer; mSurfaceControlWrapper = surfaceControlWrapper; mHandler = handler; mObserver = new HardwareRendererObserver(this, mMetricsWrapper.getTiming(), handler); mObserver = new HardwareRendererObserver( this, mMetricsWrapper.getTiming(), handler, false /*waitForPresentTime*/); mTraceThresholdMissedFrames = traceThresholdMissedFrames; mTraceThresholdFrameTimeMillis = traceThresholdFrameTimeMillis; mListener = listener; Loading graphics/java/android/graphics/HardwareRendererObserver.java +3 −3 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ public class HardwareRendererObserver { * @param handler the Handler to use when invoking callbacks */ public HardwareRendererObserver(@NonNull OnFrameMetricsAvailableListener listener, @NonNull long[] frameMetrics, @NonNull Handler handler) { @NonNull long[] frameMetrics, @NonNull Handler handler, boolean waitForPresentTime) { if (handler == null || handler.getLooper() == null) { throw new NullPointerException("handler and its looper cannot be null"); } Loading @@ -74,7 +74,7 @@ public class HardwareRendererObserver { mFrameMetrics = frameMetrics; mHandler = handler; mListener = listener; mNativePtr = new VirtualRefBasePtr(nCreateObserver()); mNativePtr = new VirtualRefBasePtr(nCreateObserver(waitForPresentTime)); } /*package*/ long getNativeInstance() { Loading @@ -98,6 +98,6 @@ public class HardwareRendererObserver { }); } private native long nCreateObserver(); private native long nCreateObserver(boolean waitForPresentTime); private static native int nGetNextBuffer(long nativePtr, long[] data); } Loading
core/java/android/view/FrameMetricsObserver.java +2 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,8 @@ public class FrameMetricsObserver mWindow = new WeakReference<>(window); mListener = listener; mFrameMetrics = new FrameMetrics(); mObserver = new HardwareRendererObserver(this, mFrameMetrics.mTimingData, handler); mObserver = new HardwareRendererObserver(this, mFrameMetrics.mTimingData, handler, false /*waitForPresentTime*/); } /** Loading
core/java/android/view/InputEventReceiver.java +10 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.os.Build; import android.os.IBinder; import android.os.Looper; import android.os.MessageQueue; import android.os.Trace; import android.util.Log; import android.util.SparseIntArray; Loading Loading @@ -197,6 +198,15 @@ public abstract class InputEventReceiver { event.recycleIfNeededAfterDispatch(); } /** * Report the latency information for a specific input event. */ public final void reportLatencyInfo(int inputEventId, long gpuCompletedTime, long presentTime) { Trace.traceBegin(Trace.TRACE_TAG_INPUT, "reportLatencyInfo"); // TODO(b/169866723) : send this data to InputDispatcher via InputChannel Trace.traceEnd(Trace.TRACE_TAG_INPUT); } /** * Consumes all pending batched input events. * Must be called on the same Looper thread to which the receiver is attached. Loading
core/java/android/view/ViewRootImpl.java +38 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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() { Loading
core/java/com/android/internal/jank/FrameTracker.java +2 −1 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener mChoreographer = choreographer; mSurfaceControlWrapper = surfaceControlWrapper; mHandler = handler; mObserver = new HardwareRendererObserver(this, mMetricsWrapper.getTiming(), handler); mObserver = new HardwareRendererObserver( this, mMetricsWrapper.getTiming(), handler, false /*waitForPresentTime*/); mTraceThresholdMissedFrames = traceThresholdMissedFrames; mTraceThresholdFrameTimeMillis = traceThresholdFrameTimeMillis; mListener = listener; Loading
graphics/java/android/graphics/HardwareRendererObserver.java +3 −3 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ public class HardwareRendererObserver { * @param handler the Handler to use when invoking callbacks */ public HardwareRendererObserver(@NonNull OnFrameMetricsAvailableListener listener, @NonNull long[] frameMetrics, @NonNull Handler handler) { @NonNull long[] frameMetrics, @NonNull Handler handler, boolean waitForPresentTime) { if (handler == null || handler.getLooper() == null) { throw new NullPointerException("handler and its looper cannot be null"); } Loading @@ -74,7 +74,7 @@ public class HardwareRendererObserver { mFrameMetrics = frameMetrics; mHandler = handler; mListener = listener; mNativePtr = new VirtualRefBasePtr(nCreateObserver()); mNativePtr = new VirtualRefBasePtr(nCreateObserver(waitForPresentTime)); } /*package*/ long getNativeInstance() { Loading @@ -98,6 +98,6 @@ public class HardwareRendererObserver { }); } private native long nCreateObserver(); private native long nCreateObserver(boolean waitForPresentTime); private static native int nGetNextBuffer(long nativePtr, long[] data); }