|  | -- Copyright 2024 The Chromium Authors | 
|  | -- Use of this source code is governed by a BSD-style license that can be | 
|  | -- found in the LICENSE file. | 
|  |  | 
|  | INCLUDE PERFETTO MODULE slices.with_context; | 
|  |  | 
|  | -- This module defines tables with information about Android input pipeline | 
|  | -- steps. The trace needs to be recorded with the 'view' atrace category. | 
|  |  | 
|  | -- On Android, input goes through the following path before getting to Chrome: | 
|  | --  * InputReader thread (part of Android system_server) | 
|  | --  * InputDispatcher thread (part of Android system_server) | 
|  | --  * Browser Main thread (Chromium/Chrome) | 
|  |  | 
|  | -- In traces, each of these three steps have slices which are implicitly linked | 
|  | -- together by an input id (part of slice name) assigned by the Android system. | 
|  |  | 
|  | -- The following queries correlate the three steps mentioned above | 
|  | -- with the rest of the `LatencyInfo.Flow` pipeline. | 
|  |  | 
|  | -- InputReader is the first step in the input pipeline. | 
|  | -- It is responsible for reading the input events from the system_server | 
|  | -- process and sending them to the InputDispatcher (which then sends them | 
|  | -- to the browser process). | 
|  |  | 
|  | CREATE PERFETTO TABLE _chrome_android_motion_input_reader_step ( | 
|  | -- Input reader step timestamp. | 
|  | ts TIMESTAMP, | 
|  | -- Input reader step duration. | 
|  | dur DURATION, | 
|  | -- Input reader step slice id. | 
|  | id LONG, | 
|  | -- Input id. | 
|  | android_input_id STRING, | 
|  | -- Input reader step utid. | 
|  | utid LONG | 
|  | ) AS | 
|  | SELECT | 
|  | ts, | 
|  | dur, | 
|  | id, | 
|  | -- Get the substring that starts with 'id=', remove the 'id=' and remove the trailing ')'. | 
|  | -- 'id=0x344bb0f9)' ->  '0x344bb0f9' | 
|  | trim(substr(substr(name, instr(name, 'id=')), 4), ')') AS android_input_id, | 
|  | utid | 
|  | FROM thread_slice AS slice | 
|  | WHERE | 
|  | name GLOB 'UnwantedInteractionBlocker::notifyMotion*'; | 
|  |  | 
|  | -- InputDispatcher is the second step in the input pipeline. | 
|  | -- It is responsible for dispatching the input events to the browser process. | 
|  | CREATE PERFETTO TABLE _chrome_android_motion_input_dispatcher_step ( | 
|  | -- Input dispatcher step timestamp. | 
|  | ts TIMESTAMP, | 
|  | -- Input dispatcher step duration. | 
|  | dur DURATION, | 
|  | -- Input dispatcher step slice id. | 
|  | id LONG, | 
|  | -- Input id. | 
|  | android_input_id STRING, | 
|  | -- Input dispatcher step utid. | 
|  | utid LONG | 
|  | ) AS | 
|  | SELECT | 
|  | ts, | 
|  | dur, | 
|  | id, | 
|  | trim(substr(substr(name, instr(name, 'id=')), 4), ')') AS android_input_id, | 
|  | utid | 
|  | FROM thread_slice AS slice | 
|  | WHERE | 
|  | name GLOB 'prepareDispatchCycleLocked*chrome*'; | 
|  |  | 
|  | -- DeliverInputEvent is the third step in the input pipeline. | 
|  | -- It is responsible for routing the input events within browser process. | 
|  | CREATE PERFETTO TABLE chrome_deliver_android_input_event ( | 
|  | -- Timestamp. | 
|  | ts TIMESTAMP, | 
|  | -- Touch move processing duration. | 
|  | dur DURATION, | 
|  | -- Utid. | 
|  | utid LONG, | 
|  | -- Input id (assigned by the system, used by InputReader and InputDispatcher) | 
|  | android_input_id STRING | 
|  | ) AS | 
|  | SELECT | 
|  | slice.ts, | 
|  | slice.dur, | 
|  | slice.utid, | 
|  | substr(substr(name, instr(name, 'id=')), 4) AS android_input_id | 
|  | FROM thread_slice AS slice | 
|  | WHERE | 
|  | slice.name GLOB 'deliverInputEvent*'; | 
|  |  | 
|  | -- Collects information about input reader, input dispatcher and | 
|  | -- DeliverInputEvent steps for the given Android input id. | 
|  | CREATE PERFETTO TABLE chrome_android_input ( | 
|  | -- Input id. | 
|  | android_input_id STRING, | 
|  | -- Input reader step start timestamp. | 
|  | input_reader_processing_start_ts TIMESTAMP, | 
|  | -- Input reader step end timestamp. | 
|  | input_reader_processing_end_ts TIMESTAMP, | 
|  | -- Input reader step utid. | 
|  | input_reader_utid LONG, | 
|  | -- Input dispatcher step start timestamp. | 
|  | input_dispatcher_processing_start_ts TIMESTAMP, | 
|  | -- Input dispatcher step end timestamp. | 
|  | input_dispatcher_processing_end_ts TIMESTAMP, | 
|  | -- Input dispatcher step utid. | 
|  | input_dispatcher_utid LONG, | 
|  | -- DeliverInputEvent step start timestamp. | 
|  | deliver_input_event_start_ts TIMESTAMP, | 
|  | -- DeliverInputEvent step end timestamp. | 
|  | deliver_input_event_end_ts TIMESTAMP, | 
|  | -- DeliverInputEvent step utid. | 
|  | deliver_input_event_utid LONG | 
|  | ) AS | 
|  | SELECT | 
|  | _chrome_android_motion_input_reader_step.android_input_id, | 
|  | _chrome_android_motion_input_reader_step.ts AS input_reader_processing_start_ts, | 
|  | _chrome_android_motion_input_reader_step.ts + _chrome_android_motion_input_reader_step.dur AS input_reader_processing_end_ts, | 
|  | _chrome_android_motion_input_reader_step.utid AS input_reader_utid, | 
|  | _chrome_android_motion_input_dispatcher_step.ts AS input_dispatcher_processing_start_ts, | 
|  | _chrome_android_motion_input_dispatcher_step.ts + _chrome_android_motion_input_dispatcher_step.dur AS input_dispatcher_processing_end_ts, | 
|  | _chrome_android_motion_input_dispatcher_step.utid AS input_dispatcher_utid, | 
|  | chrome_deliver_android_input_event.ts AS deliver_input_event_start_ts, | 
|  | chrome_deliver_android_input_event.ts + chrome_deliver_android_input_event.dur AS deliver_input_event_end_ts, | 
|  | chrome_deliver_android_input_event.utid AS deliver_input_event_utid | 
|  | FROM _chrome_android_motion_input_reader_step | 
|  | LEFT JOIN _chrome_android_motion_input_dispatcher_step | 
|  | USING (android_input_id) | 
|  | LEFT JOIN chrome_deliver_android_input_event | 
|  | USING (android_input_id); |