aboutsummaryrefslogtreecommitdiff
path: root/src/trace_processor/metrics/sql/chrome/scroll_jank_cause_blocking_touch_move.sql
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace_processor/metrics/sql/chrome/scroll_jank_cause_blocking_touch_move.sql')
-rw-r--r--src/trace_processor/metrics/sql/chrome/scroll_jank_cause_blocking_touch_move.sql162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/trace_processor/metrics/sql/chrome/scroll_jank_cause_blocking_touch_move.sql b/src/trace_processor/metrics/sql/chrome/scroll_jank_cause_blocking_touch_move.sql
new file mode 100644
index 000000000..e07bb327e
--- /dev/null
+++ b/src/trace_processor/metrics/sql/chrome/scroll_jank_cause_blocking_touch_move.sql
@@ -0,0 +1,162 @@
+--
+-- Copyright 2020 The Android Open Source Project
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+SELECT RUN_METRIC('chrome/scroll_jank.sql');
+
+-- Below we want to collect TouchMoves and figure out if they blocked any
+-- GestureScrollUpdates. This table gets the TouchMove slice and joins it with
+-- the data from the first flow event for that TouchMove.
+DROP TABLE IF EXISTS touch_move_and_begin_flow;
+CREATE TABLE touch_move_and_begin_flow AS
+ SELECT
+ flow.begin_flow_id,
+ flow.begin_flow_ts,
+ flow.begin_flow_track_id,
+ move.*
+ FROM (
+ SELECT
+ EXTRACT_ARG(arg_set_id, "chrome_latency_info.trace_id") AS trace_id,
+ *
+ FROM slice move
+ WHERE name = "InputLatency::TouchMove"
+ ) move JOIN (
+ SELECT
+ MIN(id) AS begin_flow_id,
+ track_id AS begin_flow_track_id,
+ ts AS begin_flow_ts,
+ EXTRACT_ARG(arg_set_id, "chrome_latency_info.trace_id")
+ AS begin_flow_trace_id
+ FROM slice
+ WHERE
+ name = "LatencyInfo.Flow" AND
+ EXTRACT_ARG(arg_set_id, "chrome_latency_info.step") IS NULL
+ GROUP BY begin_flow_trace_id
+ ) flow ON flow.begin_flow_trace_id = move.trace_id;
+
+-- Now we take the TouchMove and beginning flow event and figure out if there
+-- is an end flow event on the same browser track_id. This will allow us to see
+-- if it was blocking because if they share the same parent stack then they
+-- weren't blocking.
+DROP TABLE IF EXISTS touch_move_begin_and_end_flow;
+CREATE TABLE touch_move_begin_and_end_flow AS
+ SELECT
+ flow.end_flow_id,
+ flow.end_flow_ts,
+ flow.end_flow_track_id,
+ move.*
+ FROM touch_move_and_begin_flow move LEFT JOIN (
+ SELECT
+ MAX(id) AS end_flow_id,
+ ts AS end_flow_ts,
+ track_id AS end_flow_track_id,
+ EXTRACT_ARG(arg_set_id, "chrome_latency_info.trace_id")
+ AS end_flow_trace_id
+ FROM slice
+ WHERE
+ name = "LatencyInfo.Flow" AND
+ EXTRACT_ARG(arg_set_id, "chrome_latency_info.step") IS NULL
+ GROUP BY end_flow_trace_id
+ ) flow ON
+ flow.end_flow_trace_id = move.trace_id AND
+ move.begin_flow_track_id = flow.end_flow_track_id AND
+ flow.end_flow_id != move.begin_flow_id
+ WHERE flow.end_flow_id IS NOT NULL;
+
+-- Now that we have the begin and the end we need to find the parent stack of
+-- both. If the end didn't happen on the browser (end is NULL), then we can
+-- ignore it because it couldn't have generated a GestureScrollUpdate.
+DROP TABLE IF EXISTS touch_move_with_ancestor;
+CREATE TABLE touch_move_with_ancestor AS
+ SELECT
+ begin.id AS begin_ancestor_id,
+ end.id AS end_ancestor_id,
+ end.ts AS end_ancestor_ts,
+ end.dur AS end_ancestor_dur,
+ end.track_id AS end_ancestor_track_id,
+ move.*
+ FROM
+ touch_move_begin_and_end_flow move JOIN
+ ancestor_slice(begin_flow_id) begin ON begin.depth = 0 LEFT JOIN
+ ancestor_slice(end_flow_id) end ON end.depth = 0;
+
+-- Now take the parent stack for the end and find if a GestureScrollUpdate was
+-- launched that share the same parent as the end flow event for the TouchMove.
+-- This is the GestureScrollUpdate that the TouchMove blocked (or didn't block)
+-- depending on if the begin flow event is in the same stack.
+DROP TABLE IF EXISTS blocking_touch_move_with_scroll_update;
+CREATE TABLE blocking_touch_move_with_scroll_update AS
+ SELECT
+ move.begin_ancestor_id != move.end_ancestor_id AS blocking_touch_move,
+ scroll.scroll_begin_flow_id,
+ scroll.scroll_begin_flow_trace_id,
+ scroll.scroll_id,
+ move.*
+ FROM touch_move_with_ancestor move LEFT JOIN (
+ SELECT in_flow.*, in_scroll.scroll_id FROM (
+ SELECT
+ MIN(slice.id) AS scroll_begin_flow_id,
+ slice.ts AS scroll_begin_flow_ts,
+ slice.track_id AS scroll_begin_flow_track_id,
+ EXTRACT_ARG(slice.arg_set_id, "chrome_latency_info.trace_id")
+ AS scroll_begin_flow_trace_id,
+ ancestor.id AS scroll_begin_flow_ancestor_id
+ FROM
+ slice LEFT JOIN
+ ancestor_slice(slice.id) AS ancestor ON ancestor.depth = 0
+ WHERE
+ slice.name = "LatencyInfo.Flow" AND
+ EXTRACT_ARG(slice.arg_set_id, "chrome_latency_info.step") IS NULL
+ GROUP BY scroll_begin_flow_trace_id
+ ) in_flow JOIN (
+ SELECT
+ id AS scroll_id,
+ EXTRACT_ARG(arg_set_id, "chrome_latency_info.trace_id")
+ AS scroll_trace_id
+ FROM slice in_scroll
+ WHERE
+ name = "InputLatency::GestureScrollUpdate" AND
+ dur != -1 AND
+ NOT EXTRACT_ARG(arg_set_id, "chrome_latency_info.is_coalesced")
+ ) in_scroll ON
+ in_scroll.scroll_trace_id = in_flow.scroll_begin_flow_trace_id
+ ) scroll ON
+ scroll.scroll_begin_flow_track_id = move.end_ancestor_track_id AND
+ scroll.scroll_begin_flow_ancestor_id = move.end_ancestor_id AND
+ scroll.scroll_begin_flow_ts > move.end_ancestor_ts AND
+ scroll.scroll_begin_flow_ts < move.end_ancestor_ts + move.end_ancestor_dur AND
+ scroll.scroll_begin_flow_id > move.end_ancestor_id
+ WHERE scroll.scroll_id IS NOT NULL;
+
+-- Now filter out any TouchMoves that weren't during a complete scroll. Most of
+-- the other ones will be null anyway since they won't have
+-- GestureScrollUpdates.
+DROP VIEW IF EXISTS scroll_jank_cause_blocking_touch_move;
+CREATE VIEW scroll_jank_cause_blocking_touch_move AS
+ SELECT
+ id,
+ ts,
+ dur,
+ track_id,
+ blocking_touch_move,
+ scroll_id
+ FROM joined_scroll_begin_and_end begin_and_end JOIN (
+ SELECT
+ *
+ FROM blocking_touch_move_with_scroll_update
+ ) touch ON
+ touch.ts <= begin_and_end.end_ts AND
+ touch.ts > begin_and_end.begin_ts + begin_and_end.begin_dur AND
+ touch.trace_id > begin_and_end.begin_trace_id AND
+ touch.trace_id < begin_and_end.end_trace_id;