INCLUDE PERFETTO MODULE chrome.event_latency;
INCLUDE PERFETTO MODULE chrome.graphics_pipeline;
INCLUDE PERFETTO MODULE chrome.input;
INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_offsets;
INCLUDE PERFETTO MODULE chrome.android_input;
CREATE PERFETTO TABLE chrome_scroll_update_refs (
scroll_update_latency_id LONG,
touch_move_latency_id LONG,
presentation_latency_id LONG,
surface_frame_id LONG,
display_trace_id LONG
) AS
SELECT
scroll_update.latency_id AS scroll_update_latency_id,
chrome_touch_move_to_scroll_update.touch_move_latency_id,
coalesce(chrome_coalesced_inputs.presented_latency_id, scroll_update.latency_id) AS presentation_latency_id,
chrome_graphics_pipeline_inputs_to_surface_frames.surface_frame_trace_id AS surface_frame_id,
chrome_surface_frame_id_to_first_display_id.display_trace_id
FROM chrome_inputs AS scroll_update
LEFT JOIN chrome_graphics_pipeline_inputs_to_surface_frames
USING (latency_id)
LEFT JOIN chrome_surface_frame_id_to_first_display_id
ON chrome_surface_frame_id_to_first_display_id.surface_frame_trace_id = chrome_graphics_pipeline_inputs_to_surface_frames.surface_frame_trace_id
LEFT JOIN chrome_touch_move_to_scroll_update
ON chrome_touch_move_to_scroll_update.scroll_update_latency_id = scroll_update.latency_id
LEFT JOIN chrome_coalesced_inputs
ON chrome_coalesced_inputs.coalesced_latency_id = scroll_update.latency_id
WHERE
scroll_update.input_type = 'GESTURE_SCROLL_UPDATE_EVENT';
CREATE PERFETTO TABLE _scroll_update_input_timestamps_and_metadata AS
SELECT
refs.scroll_update_latency_id AS id,
refs.presentation_latency_id AS presented_in_frame_id,
chrome_event_latency.scroll_id,
chrome_event_latency.is_presented,
chrome_event_latency.is_janky,
chrome_event_latency.is_janky_v3,
chrome_event_latency.event_type = 'INERTIAL_GESTURE_SCROLL_UPDATE' AS is_inertial,
chrome_event_latency.event_type = 'FIRST_GESTURE_SCROLL_UPDATE' AS is_first_scroll_update_in_scroll,
chrome_event_latency.ts AS generation_ts,
chrome_android_input.input_reader_processing_end_ts,
chrome_android_input.input_dispatcher_processing_end_ts,
touch_move_received_step.slice_id AS touch_move_received_slice_id,
touch_move_received_step.ts AS touch_move_received_ts,
touch_move_processed_step.slice_id AS touch_move_processed_slice_id,
touch_move_processed_step.ts AS touch_move_processed_ts,
scroll_update_created_step.slice_id AS scroll_update_created_slice_id,
scroll_update_created_step.utid AS browser_utid,
scroll_update_created_step.ts AS scroll_update_created_ts,
scroll_update_created_step.ts + scroll_update_created_step.dur AS scroll_update_created_end_ts,
compositor_dispatch_step.slice_id AS compositor_dispatch_slice_id,
compositor_dispatch_step.task_start_time_ts AS compositor_dispatch_task_ts,
compositor_dispatch_step.ts AS compositor_dispatch_ts,
compositor_dispatch_step.ts + compositor_dispatch_step.dur AS compositor_dispatch_end_ts,
compositor_dispatch_step.utid AS compositor_utid,
compositor_coalesced_input_handled_step.slice_id AS compositor_coalesced_input_handled_slice_id,
compositor_coalesced_input_handled_step.ts AS compositor_coalesced_input_handled_ts,
compositor_coalesced_input_handled_step.ts + compositor_coalesced_input_handled_step.dur AS compositor_coalesced_input_handled_end_ts
FROM chrome_scroll_update_refs AS refs
LEFT JOIN chrome_gesture_scroll_updates AS chrome_event_latency
ON chrome_event_latency.scroll_update_id = refs.scroll_update_latency_id
LEFT JOIN chrome_dispatch_android_input_event_to_touch_move
ON refs.touch_move_latency_id = chrome_dispatch_android_input_event_to_touch_move.touch_move_latency_id
LEFT JOIN chrome_android_input
ON chrome_android_input.android_input_id = chrome_dispatch_android_input_event_to_touch_move.android_input_id
LEFT JOIN chrome_input_pipeline_steps AS touch_move_received_step
ON refs.touch_move_latency_id = touch_move_received_step.latency_id
AND touch_move_received_step.step = 'STEP_SEND_INPUT_EVENT_UI'
AND touch_move_received_step.input_type = 'TOUCH_MOVE_EVENT'
LEFT JOIN chrome_input_pipeline_steps AS touch_move_processed_step
ON touch_move_processed_step.latency_id = refs.touch_move_latency_id
AND touch_move_processed_step.step = 'STEP_TOUCH_EVENT_HANDLED'
AND touch_move_processed_step.input_type = 'TOUCH_MOVE_EVENT'
LEFT JOIN chrome_input_pipeline_steps AS scroll_update_created_step
ON scroll_update_created_step.latency_id = refs.scroll_update_latency_id
AND scroll_update_created_step.step = 'STEP_SEND_INPUT_EVENT_UI'
AND scroll_update_created_step.input_type = 'GESTURE_SCROLL_UPDATE_EVENT'
LEFT JOIN chrome_input_pipeline_steps AS compositor_dispatch_step
ON compositor_dispatch_step.latency_id = refs.scroll_update_latency_id
AND compositor_dispatch_step.step = 'STEP_HANDLE_INPUT_EVENT_IMPL'
AND compositor_dispatch_step.input_type = 'GESTURE_SCROLL_UPDATE_EVENT'
LEFT JOIN chrome_input_pipeline_steps AS compositor_coalesced_input_handled_step
ON compositor_coalesced_input_handled_step.latency_id = refs.scroll_update_latency_id
AND compositor_coalesced_input_handled_step.step = 'STEP_DID_HANDLE_INPUT_AND_OVERSCROLL'
AND compositor_coalesced_input_handled_step.input_type = 'GESTURE_SCROLL_UPDATE_EVENT';
CREATE PERFETTO TABLE chrome_scroll_update_input_pipeline (
id LONG,
scroll_id LONG,
presented_in_frame_id LONG,
is_presented BOOL,
is_janky BOOL,
is_janky_v3 BOOL,
is_inertial BOOL,
is_first_scroll_update_in_scroll BOOL,
is_first_scroll_update_in_frame BOOL,
generation_ts TIMESTAMP,
input_reader_processing_end_ts TIMESTAMP,
input_dispatcher_processing_end_ts TIMESTAMP,
generation_to_browser_main_dur DURATION,
browser_utid LONG,
touch_move_received_slice_id LONG,
touch_move_received_ts TIMESTAMP,
touch_move_processing_dur DURATION,
scroll_update_created_slice_id LONG,
scroll_update_created_ts TIMESTAMP,
scroll_update_processing_dur DURATION,
scroll_update_created_end_ts TIMESTAMP,
browser_to_compositor_delay_dur DURATION,
compositor_utid LONG,
compositor_dispatch_slice_id LONG,
compositor_dispatch_ts TIMESTAMP,
compositor_dispatch_dur DURATION,
compositor_dispatch_end_ts TIMESTAMP,
compositor_dispatch_to_coalesced_input_handled_dur DURATION,
compositor_coalesced_input_handled_slice_id LONG,
compositor_coalesced_input_handled_ts TIMESTAMP,
compositor_coalesced_input_handled_dur DURATION,
compositor_coalesced_input_handled_end_ts TIMESTAMP
) AS
WITH
processed_timestamps_and_metadata AS (
SELECT
id,
scroll_id,
presented_in_frame_id,
is_presented,
is_janky,
is_janky_v3,
is_inertial,
is_first_scroll_update_in_scroll,
row_number() OVER (PARTITION BY presented_in_frame_id ORDER BY generation_ts ASC) = 1 AS is_first_scroll_update_in_frame,
browser_utid,
touch_move_received_slice_id,
generation_ts,
input_reader_processing_end_ts,
input_dispatcher_processing_end_ts,
touch_move_received_ts,
max(
iif(
is_inertial AND touch_move_received_ts IS NULL,
scroll_update_created_ts,
touch_move_received_ts
),
generation_ts
) AS browser_main_received_ts,
scroll_update_created_slice_id,
scroll_update_created_ts,
scroll_update_created_end_ts,
compositor_utid,
compositor_dispatch_slice_id,
coalesce(compositor_dispatch_task_ts, compositor_dispatch_ts) AS compositor_dispatch_ts,
compositor_dispatch_end_ts,
compositor_coalesced_input_handled_slice_id,
compositor_coalesced_input_handled_ts,
compositor_coalesced_input_handled_end_ts
FROM _scroll_update_input_timestamps_and_metadata
)
SELECT
id,
scroll_id,
presented_in_frame_id,
is_presented,
is_janky,
is_janky_v3,
is_inertial,
is_first_scroll_update_in_scroll,
is_first_scroll_update_in_frame,
generation_ts,
input_reader_processing_end_ts,
input_dispatcher_processing_end_ts,
browser_main_received_ts - generation_ts AS generation_to_browser_main_dur,
browser_utid,
touch_move_received_slice_id,
touch_move_received_ts,
scroll_update_created_ts - max(touch_move_received_ts, generation_ts) AS touch_move_processing_dur,
scroll_update_created_slice_id,
scroll_update_created_ts,
scroll_update_created_end_ts - scroll_update_created_ts AS scroll_update_processing_dur,
scroll_update_created_end_ts,
max(compositor_dispatch_ts, scroll_update_created_end_ts) - scroll_update_created_end_ts AS browser_to_compositor_delay_dur,
compositor_utid,
compositor_dispatch_slice_id,
compositor_dispatch_ts,
compositor_dispatch_end_ts - compositor_dispatch_ts AS compositor_dispatch_dur,
compositor_dispatch_end_ts,
compositor_coalesced_input_handled_ts - compositor_dispatch_end_ts AS compositor_dispatch_to_coalesced_input_handled_dur,
compositor_coalesced_input_handled_slice_id,
compositor_coalesced_input_handled_ts,
compositor_coalesced_input_handled_end_ts - compositor_coalesced_input_handled_ts AS compositor_coalesced_input_handled_dur,
compositor_coalesced_input_handled_end_ts
FROM processed_timestamps_and_metadata;
CREATE PERFETTO TABLE _scroll_update_frame_timestamps_and_metadata AS
SELECT
refs.scroll_update_latency_id AS id,
refs.display_trace_id,
chrome_event_latency.vsync_interval_ms AS vsync_interval_ms,
compositor_resample_step.slice_id AS compositor_resample_slice_id,
compositor_resample_step.task_start_time_ts AS compositor_resample_task_ts,
compositor_resample_step.ts AS compositor_resample_ts,
compositor_receive_begin_frame_step.id AS compositor_receive_begin_frame_slice_id,
compositor_receive_begin_frame_step.task_start_time_ts AS compositor_receive_begin_frame_task_ts,
compositor_receive_begin_frame_step.ts AS compositor_receive_begin_frame_ts,
compositor_generate_compositor_frame_step.id AS compositor_generate_compositor_frame_slice_id,
compositor_generate_compositor_frame_step.task_start_time_ts AS compositor_generate_compositor_frame_task_ts,
compositor_generate_compositor_frame_step.ts AS compositor_generate_compositor_frame_ts,
compositor_submit_compositor_frame_step.id AS compositor_submit_compositor_frame_slice_id,
compositor_submit_compositor_frame_step.ts AS compositor_submit_compositor_frame_ts,
compositor_submit_compositor_frame_step.ts + compositor_submit_compositor_frame_step.dur AS compositor_submit_compositor_frame_end_ts,
viz_receive_compositor_frame_step.id AS viz_receive_compositor_frame_slice_id,
viz_receive_compositor_frame_step.task_start_time_ts AS viz_receive_compositor_frame_task_ts,
viz_receive_compositor_frame_step.ts AS viz_receive_compositor_frame_ts,
viz_receive_compositor_frame_step.ts + viz_receive_compositor_frame_step.dur AS viz_receive_compositor_frame_end_ts,
viz_receive_compositor_frame_step.utid AS viz_compositor_utid,
viz_draw_and_swap_step.id AS viz_draw_and_swap_slice_id,
viz_draw_and_swap_step.task_start_time_ts AS viz_draw_and_swap_task_ts,
viz_draw_and_swap_step.ts AS viz_draw_and_swap_ts,
viz_send_buffer_swap_step.id AS viz_send_buffer_swap_slice_id,
viz_send_buffer_swap_step.ts + viz_send_buffer_swap_step.dur AS viz_send_buffer_swap_end_ts,
viz_swap_buffers_step.id AS viz_swap_buffers_slice_id,
viz_swap_buffers_step.task_start_time_ts AS viz_swap_buffers_task_ts,
viz_swap_buffers_step.ts AS viz_swap_buffers_ts,
viz_swap_buffers_step.ts + viz_swap_buffers_step.dur AS viz_swap_buffers_end_ts,
viz_swap_buffers_step.utid AS viz_gpu_thread_utid,
chrome_event_latency.buffer_available_timestamp,
chrome_event_latency.buffer_ready_timestamp,
chrome_event_latency.latch_timestamp,
chrome_event_latency.presentation_timestamp
FROM chrome_scroll_update_refs AS refs
LEFT JOIN chrome_event_latencies AS chrome_event_latency
ON chrome_event_latency.scroll_update_id = refs.presentation_latency_id
LEFT JOIN chrome_input_pipeline_steps AS compositor_resample_step
ON compositor_resample_step.latency_id = refs.presentation_latency_id
AND compositor_resample_step.step = 'STEP_RESAMPLE_SCROLL_EVENTS'
AND compositor_resample_step.input_type = 'GESTURE_SCROLL_UPDATE_EVENT'
LEFT JOIN chrome_graphics_pipeline_surface_frame_steps AS compositor_receive_begin_frame_step
ON compositor_receive_begin_frame_step.surface_frame_trace_id = refs.surface_frame_id
AND compositor_receive_begin_frame_step.step = 'STEP_RECEIVE_BEGIN_FRAME'
LEFT JOIN chrome_graphics_pipeline_surface_frame_steps AS compositor_generate_compositor_frame_step
ON compositor_generate_compositor_frame_step.surface_frame_trace_id = refs.surface_frame_id
AND compositor_generate_compositor_frame_step.step = 'STEP_GENERATE_COMPOSITOR_FRAME'
LEFT JOIN chrome_graphics_pipeline_surface_frame_steps AS compositor_submit_compositor_frame_step
ON compositor_submit_compositor_frame_step.surface_frame_trace_id = refs.surface_frame_id
AND compositor_submit_compositor_frame_step.step = 'STEP_SUBMIT_COMPOSITOR_FRAME'
LEFT JOIN chrome_graphics_pipeline_surface_frame_steps AS viz_receive_compositor_frame_step
ON viz_receive_compositor_frame_step.surface_frame_trace_id = refs.surface_frame_id
AND viz_receive_compositor_frame_step.step = 'STEP_RECEIVE_COMPOSITOR_FRAME'
LEFT JOIN chrome_graphics_pipeline_display_frame_steps AS viz_draw_and_swap_step
ON viz_draw_and_swap_step.display_trace_id = refs.display_trace_id
AND viz_draw_and_swap_step.step = 'STEP_DRAW_AND_SWAP'
LEFT JOIN chrome_graphics_pipeline_display_frame_steps AS viz_send_buffer_swap_step
ON viz_send_buffer_swap_step.display_trace_id = refs.display_trace_id
AND viz_send_buffer_swap_step.step = 'STEP_SEND_BUFFER_SWAP'
LEFT JOIN chrome_graphics_pipeline_display_frame_steps AS viz_swap_buffers_step
ON viz_swap_buffers_step.display_trace_id = refs.display_trace_id
AND viz_swap_buffers_step.step = 'STEP_BUFFER_SWAP_POST_SUBMIT'
WHERE
refs.scroll_update_latency_id = refs.presentation_latency_id;
CREATE PERFETTO TABLE chrome_scroll_update_frame_pipeline (
id LONG,
display_trace_id LONG,
vsync_interval_ms DOUBLE,
compositor_resample_slice_id LONG,
compositor_resample_ts TIMESTAMP,
compositor_receive_begin_frame_ts TIMESTAMP,
compositor_generate_compositor_frame_slice_id LONG,
compositor_generate_compositor_frame_ts TIMESTAMP,
compositor_generate_frame_to_submit_frame_dur DURATION,
compositor_submit_compositor_frame_slice_id LONG,
compositor_submit_compositor_frame_ts TIMESTAMP,
compositor_submit_frame_dur DURATION,
compositor_submit_compositor_frame_end_ts TIMESTAMP,
compositor_to_viz_delay_dur DURATION,
viz_compositor_utid LONG,
viz_receive_compositor_frame_slice_id LONG,
viz_receive_compositor_frame_ts TIMESTAMP,
viz_receive_compositor_frame_dur DURATION,
viz_receive_compositor_frame_end_ts TIMESTAMP,
viz_wait_for_draw_dur DURATION,
viz_draw_and_swap_slice_id LONG,
viz_draw_and_swap_ts TIMESTAMP,
viz_draw_and_swap_dur DURATION,
viz_send_buffer_swap_slice_id LONG,
viz_send_buffer_swap_end_ts TIMESTAMP,
viz_to_gpu_delay_dur DURATION,
viz_gpu_thread_utid LONG,
viz_swap_buffers_slice_id LONG,
viz_swap_buffers_ts TIMESTAMP,
viz_swap_buffers_dur DURATION,
viz_swap_buffers_end_ts TIMESTAMP,
viz_swap_buffers_to_latch_dur DURATION,
latch_timestamp TIMESTAMP,
viz_latch_to_presentation_dur DURATION,
presentation_timestamp TIMESTAMP
) AS
WITH
processed_timestamps_and_metadata AS (
SELECT
id,
display_trace_id,
vsync_interval_ms,
compositor_resample_slice_id,
coalesce(compositor_resample_task_ts, compositor_resample_ts) AS compositor_resample_ts,
compositor_receive_begin_frame_slice_id,
coalesce(compositor_receive_begin_frame_task_ts, compositor_receive_begin_frame_ts) AS compositor_receive_begin_frame_ts,
compositor_generate_compositor_frame_slice_id,
coalesce(
compositor_generate_compositor_frame_task_ts,
compositor_generate_compositor_frame_ts
) AS compositor_generate_compositor_frame_ts,
compositor_submit_compositor_frame_slice_id,
compositor_submit_compositor_frame_ts,
compositor_submit_compositor_frame_end_ts,
viz_compositor_utid,
viz_receive_compositor_frame_slice_id,
coalesce(viz_receive_compositor_frame_task_ts, viz_receive_compositor_frame_ts) AS viz_receive_compositor_frame_ts,
viz_receive_compositor_frame_end_ts,
viz_draw_and_swap_slice_id,
coalesce(viz_draw_and_swap_task_ts, viz_draw_and_swap_ts) AS viz_draw_and_swap_ts,
viz_send_buffer_swap_slice_id,
viz_send_buffer_swap_end_ts,
viz_gpu_thread_utid,
viz_swap_buffers_slice_id,
coalesce(viz_swap_buffers_task_ts, viz_swap_buffers_ts) AS viz_swap_buffers_ts,
viz_swap_buffers_end_ts,
latch_timestamp,
presentation_timestamp
FROM _scroll_update_frame_timestamps_and_metadata
)
SELECT
id,
display_trace_id,
vsync_interval_ms,
compositor_resample_slice_id,
compositor_resample_ts,
compositor_receive_begin_frame_ts,
compositor_generate_compositor_frame_slice_id,
compositor_generate_compositor_frame_ts,
compositor_submit_compositor_frame_ts - compositor_generate_compositor_frame_ts AS compositor_generate_frame_to_submit_frame_dur,
compositor_submit_compositor_frame_slice_id,
compositor_submit_compositor_frame_ts,
compositor_submit_compositor_frame_end_ts - compositor_submit_compositor_frame_ts AS compositor_submit_frame_dur,
compositor_submit_compositor_frame_end_ts,
viz_receive_compositor_frame_ts - compositor_submit_compositor_frame_end_ts AS compositor_to_viz_delay_dur,
viz_compositor_utid,
viz_receive_compositor_frame_slice_id,
viz_receive_compositor_frame_ts,
viz_receive_compositor_frame_end_ts - viz_receive_compositor_frame_ts AS viz_receive_compositor_frame_dur,
viz_receive_compositor_frame_end_ts,
viz_draw_and_swap_ts - viz_receive_compositor_frame_end_ts AS viz_wait_for_draw_dur,
viz_draw_and_swap_slice_id,
viz_draw_and_swap_ts,
viz_send_buffer_swap_end_ts - viz_draw_and_swap_ts AS viz_draw_and_swap_dur,
viz_send_buffer_swap_slice_id,
viz_send_buffer_swap_end_ts,
viz_swap_buffers_ts - viz_send_buffer_swap_end_ts AS viz_to_gpu_delay_dur,
viz_gpu_thread_utid,
viz_swap_buffers_slice_id,
viz_swap_buffers_ts,
viz_swap_buffers_end_ts - viz_swap_buffers_ts AS viz_swap_buffers_dur,
viz_swap_buffers_end_ts,
latch_timestamp - viz_swap_buffers_end_ts AS viz_swap_buffers_to_latch_dur,
latch_timestamp,
presentation_timestamp - latch_timestamp AS viz_latch_to_presentation_dur,
presentation_timestamp
FROM processed_timestamps_and_metadata;
CREATE PERFETTO TABLE chrome_scrolls (
id LONG,
ts TIMESTAMP,
dur DURATION,
gesture_scroll_begin_ts TIMESTAMP,
gesture_scroll_end_ts TIMESTAMP
) AS
SELECT
scroll_id AS id,
min(ts) AS ts,
cast_int!(MAX(ts + dur) - MIN(ts)) AS dur,
NULL AS gesture_scroll_begin_ts,
NULL AS gesture_scroll_end_ts
FROM chrome_gesture_scroll_updates
GROUP BY
scroll_id;
CREATE PERFETTO TABLE chrome_scroll_update_info (
id LONG,
scroll_id LONG,
previous_input_id LONG,
frame_display_id LONG,
vsync_interval_ms DOUBLE,
is_presented BOOL,
is_janky BOOL,
is_janky_v3 BOOL,
is_inertial BOOL,
is_first_scroll_update_in_scroll BOOL,
is_first_scroll_update_in_frame BOOL,
browser_uptime_dur DURATION,
generation_ts TIMESTAMP,
input_reader_dur DURATION,
input_dispatcher_dur DURATION,
since_previous_generation_dur DURATION,
generation_to_browser_main_dur DURATION,
browser_utid LONG,
touch_move_received_slice_id LONG,
touch_move_received_ts TIMESTAMP,
touch_move_processing_dur DURATION,
scroll_update_created_slice_id LONG,
scroll_update_created_ts TIMESTAMP,
scroll_update_processing_dur DURATION,
scroll_update_created_end_ts TIMESTAMP,
browser_to_compositor_delay_dur DURATION,
compositor_utid LONG,
compositor_dispatch_slice_id LONG,
compositor_dispatch_ts TIMESTAMP,
compositor_dispatch_dur DURATION,
compositor_dispatch_end_ts TIMESTAMP,
compositor_dispatch_to_on_begin_frame_delay_dur DURATION,
compositor_resample_slice_id LONG,
compositor_coalesced_input_handled_slice_id LONG,
compositor_on_begin_frame_ts TIMESTAMP,
compositor_on_begin_frame_dur DURATION,
compositor_on_begin_frame_end_ts TIMESTAMP,
compositor_on_begin_frame_to_generation_delay_dur DURATION,
compositor_generate_compositor_frame_slice_id LONG,
compositor_generate_compositor_frame_ts TIMESTAMP,
compositor_generate_frame_to_submit_frame_dur DURATION,
compositor_submit_compositor_frame_slice_id LONG,
compositor_submit_compositor_frame_ts TIMESTAMP,
compositor_submit_frame_dur DURATION,
compositor_submit_compositor_frame_end_ts TIMESTAMP,
compositor_to_viz_delay_dur DURATION,
viz_compositor_utid LONG,
viz_receive_compositor_frame_slice_id LONG,
viz_receive_compositor_frame_ts TIMESTAMP,
viz_receive_compositor_frame_dur DURATION,
viz_receive_compositor_frame_end_ts TIMESTAMP,
viz_wait_for_draw_dur DURATION,
viz_draw_and_swap_slice_id LONG,
viz_draw_and_swap_ts TIMESTAMP,
viz_draw_and_swap_dur DURATION,
viz_send_buffer_swap_slice_id LONG,
viz_send_buffer_swap_end_ts TIMESTAMP,
viz_to_gpu_delay_dur DURATION,
viz_gpu_thread_utid LONG,
viz_swap_buffers_slice_id LONG,
viz_swap_buffers_ts TIMESTAMP,
viz_swap_buffers_dur DURATION,
viz_swap_buffers_end_ts TIMESTAMP,
viz_swap_buffers_to_latch_dur DURATION,
latch_timestamp TIMESTAMP,
viz_latch_to_presentation_dur DURATION,
presentation_timestamp TIMESTAMP
) AS
SELECT
input.id,
input.scroll_id,
lag(input.id) OVER (PARTITION BY input.scroll_id ORDER BY input.generation_ts) AS previous_input_id,
frame.display_trace_id AS frame_display_id,
frame.vsync_interval_ms,
input.is_presented,
input.is_janky,
input.is_janky_v3,
input.is_inertial,
input.is_first_scroll_update_in_scroll,
input.is_first_scroll_update_in_frame,
generation_ts - browser_process.start_ts AS browser_uptime_dur,
input.generation_ts,
input.input_reader_processing_end_ts - generation_ts AS input_reader_dur,
input.input_dispatcher_processing_end_ts - input.input_reader_processing_end_ts AS input_dispatcher_dur,
input.generation_ts - lag(input.generation_ts) OVER (PARTITION BY input.scroll_id ORDER BY input.generation_ts) AS since_previous_generation_dur,
input.generation_to_browser_main_dur,
input.browser_utid,
input.touch_move_received_slice_id,
input.touch_move_received_ts,
input.touch_move_processing_dur,
input.scroll_update_created_slice_id,
input.scroll_update_created_ts,
input.scroll_update_processing_dur,
input.scroll_update_created_end_ts,
input.browser_to_compositor_delay_dur,
input.compositor_utid,
input.compositor_dispatch_slice_id,
input.compositor_dispatch_ts,
input.compositor_dispatch_dur,
input.compositor_dispatch_end_ts,
coalesce(frame.compositor_resample_ts, input.compositor_coalesced_input_handled_ts) - input.compositor_dispatch_end_ts AS compositor_dispatch_to_on_begin_frame_delay_dur,
frame.compositor_resample_slice_id,
input.compositor_coalesced_input_handled_slice_id,
coalesce(frame.compositor_resample_ts, input.compositor_coalesced_input_handled_ts) AS compositor_on_begin_frame_ts,
input.compositor_coalesced_input_handled_end_ts - coalesce(frame.compositor_resample_ts, input.compositor_coalesced_input_handled_ts) AS compositor_on_begin_frame_dur,
input.compositor_coalesced_input_handled_end_ts AS compositor_on_begin_frame_end_ts,
frame.compositor_generate_compositor_frame_ts - input.compositor_coalesced_input_handled_end_ts AS compositor_on_begin_frame_to_generation_delay_dur,
frame.compositor_generate_compositor_frame_slice_id,
frame.compositor_generate_compositor_frame_ts,
frame.compositor_generate_frame_to_submit_frame_dur,
frame.compositor_submit_compositor_frame_slice_id,
frame.compositor_submit_compositor_frame_ts,
frame.compositor_submit_frame_dur,
frame.compositor_submit_compositor_frame_end_ts,
frame.compositor_to_viz_delay_dur,
frame.viz_compositor_utid,
frame.viz_receive_compositor_frame_slice_id,
frame.viz_receive_compositor_frame_ts,
frame.viz_receive_compositor_frame_dur,
frame.viz_receive_compositor_frame_end_ts,
frame.viz_wait_for_draw_dur,
frame.viz_draw_and_swap_slice_id,
frame.viz_draw_and_swap_ts,
frame.viz_draw_and_swap_dur,
frame.viz_send_buffer_swap_slice_id,
frame.viz_send_buffer_swap_end_ts,
frame.viz_to_gpu_delay_dur,
frame.viz_gpu_thread_utid,
frame.viz_swap_buffers_slice_id,
frame.viz_swap_buffers_ts,
frame.viz_swap_buffers_dur,
frame.viz_swap_buffers_end_ts,
frame.viz_swap_buffers_to_latch_dur,
frame.latch_timestamp,
frame.viz_latch_to_presentation_dur,
frame.presentation_timestamp
FROM chrome_scroll_update_input_pipeline AS input
LEFT JOIN chrome_scroll_update_frame_pipeline AS frame
ON input.presented_in_frame_id = frame.id
LEFT JOIN thread AS browser_main_thread
ON browser_utid = browser_main_thread.utid
LEFT JOIN process AS browser_process
ON browser_process.upid = browser_main_thread.upid;
CREATE PERFETTO MACRO _chrome_scroll_frame_stage_delta(
name ColumnName
)
RETURNS Expr AS
iif(
info.is_first_scroll_update_in_scroll,
NULL,
$name - lag($name) OVER (ORDER BY generation_ts)
);
CREATE PERFETTO TABLE chrome_scroll_frame_info (
id LONG,
scroll_id LONG,
last_input_before_this_frame_id LONG,
vsync_interval_ms DOUBLE,
vsync_interval_dur DURATION,
is_janky BOOL,
is_janky_v3 BOOL,
is_inertial BOOL,
total_input_delta_y DOUBLE,
presented_scrolled_delta_y DOUBLE,
browser_uptime_dur DURATION,
first_input_generation_ts TIMESTAMP,
input_reader_dur DURATION,
input_dispatcher_dur DURATION,
previous_last_input_to_first_input_generation_dur DURATION,
presentation_ts TIMESTAMP,
browser_utid JOINID(thread.id),
first_input_generation_to_browser_main_dur DURATION,
first_input_generation_to_browser_main_delta_dur DURATION,
first_input_touch_move_processing_dur DURATION,
first_input_touch_move_processing_delta_dur DURATION,
compositor_utid JOINID(thread.id),
first_input_browser_to_compositor_delay_dur DURATION,
first_input_browser_to_compositor_delay_delta_dur DURATION,
first_input_compositor_dispatch_dur DURATION,
first_input_compositor_dispatch_delta_dur DURATION,
first_input_compositor_dispatch_to_on_begin_frame_delay_dur DURATION,
first_input_compositor_dispatch_to_on_begin_frame_delay_delta_dur DURATION,
compositor_on_begin_frame_dur DURATION,
compositor_on_begin_frame_delta_dur DURATION,
compositor_on_begin_frame_to_generation_delay_dur DURATION,
compositor_on_begin_frame_to_generation_delay_delta_dur DURATION,
compositor_generate_frame_to_submit_frame_dur DURATION,
compositor_generate_frame_to_submit_frame_delta_dur DURATION,
compositor_submit_frame_dur DURATION,
compositor_submit_frame_delta_dur DURATION,
viz_compositor_utid JOINID(thread.id),
compositor_to_viz_delay_dur DURATION,
compositor_to_viz_delay_delta_dur DURATION,
viz_receive_compositor_frame_dur DURATION,
viz_receive_compositor_frame_delta_dur DURATION,
viz_wait_for_draw_dur DURATION,
viz_wait_for_draw_delta_dur DURATION,
viz_draw_and_swap_dur DURATION,
viz_draw_and_swap_delta_dur DURATION,
viz_gpu_thread_utid JOINID(thread.id),
viz_to_gpu_delay_dur DURATION,
viz_to_gpu_delay_delta_dur DURATION,
viz_swap_buffers_dur DURATION,
viz_swap_buffers_delta_dur DURATION,
viz_swap_buffers_to_latch_dur DURATION,
viz_swap_buffers_to_latch_delta_dur DURATION,
viz_latch_to_presentation_dur DURATION,
viz_latch_to_presentation_delta_dur DURATION
) AS
SELECT
frame_display_id AS id,
info.scroll_id,
previous_input_id AS last_input_before_this_frame_id,
vsync_interval_ms,
cast_int!(vsync_interval_ms * 1e6) AS vsync_interval_dur,
is_janky,
is_janky_v3,
is_inertial,
(
SELECT
sum(delta_y)
FROM chrome_scroll_input_offsets AS input
JOIN chrome_scroll_update_info AS update_info
ON input.scroll_update_id = update_info.id
WHERE
update_info.frame_display_id = info.frame_display_id
) AS total_input_delta_y,
delta.delta_y AS presented_scrolled_delta_y,
browser_uptime_dur,
info.generation_ts AS first_input_generation_ts,
input_reader_dur,
input_dispatcher_dur,
info.since_previous_generation_dur AS previous_last_input_to_first_input_generation_dur,
info.browser_utid,
info.generation_to_browser_main_dur AS first_input_generation_to_browser_main_dur,
presentation_timestamp AS presentation_ts,
_chrome_scroll_frame_stage_delta!(generation_to_browser_main_dur) AS first_input_generation_to_browser_main_delta_dur,
info.touch_move_processing_dur AS first_input_touch_move_processing_dur,
_chrome_scroll_frame_stage_delta!(touch_move_processing_dur) AS first_input_touch_move_processing_delta_dur,
info.compositor_utid,
info.browser_to_compositor_delay_dur AS first_input_browser_to_compositor_delay_dur,
_chrome_scroll_frame_stage_delta!(browser_to_compositor_delay_dur) AS first_input_browser_to_compositor_delay_delta_dur,
info.compositor_dispatch_dur AS first_input_compositor_dispatch_dur,
_chrome_scroll_frame_stage_delta!(compositor_dispatch_dur) AS first_input_compositor_dispatch_delta_dur,
info.compositor_dispatch_to_on_begin_frame_delay_dur AS first_input_compositor_dispatch_to_on_begin_frame_delay_dur,
_chrome_scroll_frame_stage_delta!(compositor_dispatch_to_on_begin_frame_delay_dur) AS first_input_compositor_dispatch_to_on_begin_frame_delay_delta_dur,
info.compositor_on_begin_frame_dur,
_chrome_scroll_frame_stage_delta!(compositor_on_begin_frame_dur) AS compositor_on_begin_frame_delta_dur,
info.compositor_on_begin_frame_to_generation_delay_dur,
_chrome_scroll_frame_stage_delta!(compositor_on_begin_frame_to_generation_delay_dur) AS compositor_on_begin_frame_to_generation_delay_delta_dur,
info.compositor_generate_frame_to_submit_frame_dur,
_chrome_scroll_frame_stage_delta!(compositor_generate_frame_to_submit_frame_dur) AS compositor_generate_frame_to_submit_frame_delta_dur,
info.compositor_submit_frame_dur,
_chrome_scroll_frame_stage_delta!(compositor_submit_frame_dur) AS compositor_submit_frame_delta_dur,
viz_compositor_utid,
info.compositor_to_viz_delay_dur,
_chrome_scroll_frame_stage_delta!(compositor_to_viz_delay_dur) AS compositor_to_viz_delay_delta_dur,
info.viz_receive_compositor_frame_dur,
_chrome_scroll_frame_stage_delta!(viz_receive_compositor_frame_dur) AS viz_receive_compositor_frame_delta_dur,
info.viz_wait_for_draw_dur,
_chrome_scroll_frame_stage_delta!(viz_wait_for_draw_dur) AS viz_wait_for_draw_delta_dur,
info.viz_draw_and_swap_dur,
_chrome_scroll_frame_stage_delta!(viz_draw_and_swap_dur) AS viz_draw_and_swap_delta_dur,
viz_gpu_thread_utid,
info.viz_to_gpu_delay_dur,
_chrome_scroll_frame_stage_delta!(viz_to_gpu_delay_dur) AS viz_to_gpu_delay_delta_dur,
info.viz_swap_buffers_dur,
_chrome_scroll_frame_stage_delta!(viz_swap_buffers_dur) AS viz_swap_buffers_delta_dur,
info.viz_swap_buffers_to_latch_dur,
_chrome_scroll_frame_stage_delta!(viz_swap_buffers_to_latch_dur) AS viz_swap_buffers_to_latch_delta_dur,
info.viz_latch_to_presentation_dur,
_chrome_scroll_frame_stage_delta!(viz_latch_to_presentation_dur) AS viz_latch_to_presentation_delta_dur
FROM chrome_scroll_update_info AS info
LEFT JOIN chrome_presented_scroll_offsets AS delta
ON info.id = delta.scroll_update_id
WHERE
is_first_scroll_update_in_frame AND info.frame_display_id IS NOT NULL;
CREATE PERFETTO TABLE chrome_scroll_update_info_step_templates (
step_name STRING,
ts_column_name STRING,
dur_column_name STRING
) AS
WITH
steps(step_name, ts_column_name, dur_column_name) AS (
SELECT
*
FROM (VALUES
('GenerationToBrowserMain', 'generation_ts', 'generation_to_browser_main_dur'),
('TouchMoveProcessing', 'touch_move_received_ts', 'touch_move_processing_dur'),
(
'ScrollUpdateProcessing',
'scroll_update_created_ts',
'scroll_update_processing_dur'
),
(
'BrowserMainToRendererCompositor',
'scroll_update_created_end_ts',
'browser_to_compositor_delay_dur'
),
(
'RendererCompositorDispatch',
'compositor_dispatch_ts',
'compositor_dispatch_dur'
),
(
'RendererCompositorDispatchToOnBeginFrame',
'compositor_dispatch_end_ts',
'compositor_dispatch_to_on_begin_frame_delay_dur'
),
(
'RendererCompositorBeginFrame',
'compositor_on_begin_frame_ts',
'compositor_on_begin_frame_dur'
),
(
'RendererCompositorBeginToGenerateFrame',
'compositor_on_begin_frame_end_ts',
'compositor_on_begin_frame_to_generation_delay_dur'
),
(
'RendererCompositorGenerateToSubmitFrame',
'compositor_generate_compositor_frame_ts',
'compositor_generate_frame_to_submit_frame_dur'
),
(
'RendererCompositorSubmitFrame',
'compositor_submit_compositor_frame_ts',
'compositor_submit_frame_dur'
),
(
'RendererCompositorToViz',
'compositor_submit_compositor_frame_end_ts',
'compositor_to_viz_delay_dur'
),
(
'VizReceiveFrame',
'viz_receive_compositor_frame_ts',
'viz_receive_compositor_frame_dur'
),
(
'VizReceiveToDrawFrame',
'viz_receive_compositor_frame_end_ts',
'viz_wait_for_draw_dur'
),
('VizDrawToSwapFrame', 'viz_draw_and_swap_ts', 'viz_draw_and_swap_dur'),
('VizToGpu', 'viz_send_buffer_swap_end_ts', 'viz_to_gpu_delay_dur'),
('VizSwapBuffers', 'viz_swap_buffers_ts', 'viz_swap_buffers_dur'),
(
'VizSwapBuffersToLatch',
'viz_swap_buffers_end_ts',
'viz_swap_buffers_to_latch_dur'
),
('VizLatchToPresentation', 'latch_timestamp', 'viz_latch_to_presentation_dur'),
('Presentation', 'presentation_timestamp', NULL)) AS _values
)
SELECT
step_name,
ts_column_name,
dur_column_name
FROM steps;