Merge "Document Debug Tracks on docs.perfetto.dev." into main
diff --git a/Android.bp b/Android.bp
index e239297..f66c143 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4639,7 +4639,6 @@
"protos/perfetto/metrics/chrome/performance_mark_hashes.proto",
"protos/perfetto/metrics/chrome/reported_by_page.proto",
"protos/perfetto/metrics/chrome/scroll_jank.proto",
- "protos/perfetto/metrics/chrome/scroll_jank_v2.proto",
"protos/perfetto/metrics/chrome/scroll_jank_v3.proto",
"protos/perfetto/metrics/chrome/slice_names.proto",
"protos/perfetto/metrics/chrome/test_chrome_metric.proto",
@@ -10524,7 +10523,6 @@
"src/trace_processor/metrics/sql/chrome/chrome_reliable_range.sql",
"src/trace_processor/metrics/sql/chrome/chrome_scroll_inputs_per_frame.sql",
"src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_caused_by_scheduling.sql",
- "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql",
"src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql",
"src/trace_processor/metrics/sql/chrome/chrome_slice_names.sql",
"src/trace_processor/metrics/sql/chrome/chrome_stack_samples_for_task.sql",
@@ -10772,11 +10770,9 @@
"src/trace_processor/perfetto_sql/stdlib/chrome/cpu_powerups.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/histograms.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/metadata.sql",
- "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql",
- "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql",
- "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql",
+ "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/utils.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/speedometer.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql",
diff --git a/BUILD b/BUILD
index a219ceb..a6e2834 100644
--- a/BUILD
+++ b/BUILD
@@ -1963,7 +1963,6 @@
"src/trace_processor/metrics/sql/chrome/chrome_reliable_range.sql",
"src/trace_processor/metrics/sql/chrome/chrome_scroll_inputs_per_frame.sql",
"src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_caused_by_scheduling.sql",
- "src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql",
"src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql",
"src/trace_processor/metrics/sql/chrome/chrome_slice_names.sql",
"src/trace_processor/metrics/sql/chrome/chrome_stack_samples_for_task.sql",
@@ -2267,11 +2266,9 @@
perfetto_filegroup(
name = "src_trace_processor_perfetto_sql_stdlib_chrome_scroll_jank_scroll_jank",
srcs = [
- "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql",
- "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql",
- "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql",
+ "src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql",
"src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/utils.sql",
],
)
@@ -4146,7 +4143,6 @@
"protos/perfetto/metrics/chrome/performance_mark_hashes.proto",
"protos/perfetto/metrics/chrome/reported_by_page.proto",
"protos/perfetto/metrics/chrome/scroll_jank.proto",
- "protos/perfetto/metrics/chrome/scroll_jank_v2.proto",
"protos/perfetto/metrics/chrome/scroll_jank_v3.proto",
"protos/perfetto/metrics/chrome/slice_names.proto",
"protos/perfetto/metrics/chrome/test_chrome_metric.proto",
diff --git a/docs/toc.md b/docs/toc.md
index 40f3eb9..d7c34e3 100644
--- a/docs/toc.md
+++ b/docs/toc.md
@@ -48,7 +48,7 @@
* [PerfettoSQL](#)
* [Standard Library](analysis/stdlib-docs.autogen)
* [Syntax](analysis/perfetto-sql-syntax.md)
- * [Prelude](analysis/sql-tables.autogen)
+ * [Prelude tables](analysis/sql-tables.autogen)
* [Common Queries](analysis/common-queries.md)
* [Built-ins](analysis/builtin.md)
diff --git a/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto b/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
index 44b4f1a..61f5f53 100644
--- a/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
+++ b/protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
@@ -48,8 +48,8 @@
// restarted.
//
// Specifically this sets the following system properties:
- // - debug.tracing.renderengine.skia_tracing_enabled
- // - debug.tracing.renderengine.skia_use_perfetto_track_events
+ // - debug.tracing.ctl.renderengine.skia_tracing_enabled
+ // - debug.tracing.ctl.renderengine.skia_use_perfetto_track_events
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
@@ -65,12 +65,12 @@
//
// ATTENTION: affects ALL HWUI APPS if hwui_package_name_filter is not set!
// If filtering is NOT set, this controls these GLOBAL system properties:
- // - debug.tracing.hwui.skia_tracing_enabled
- // - debug.tracing.hwui.skia_use_perfetto_track_events
+ // - debug.tracing.ctl.hwui.skia_tracing_enabled
+ // - debug.tracing.ctl.hwui.skia_use_perfetto_track_events
// If filtering IS set, this controls these APP-SPECIFIC system properties,
// for each package listed in the filter:
- // - debug.tracing.hwui.skia_tracing_enabled.<package.name>
- // - debug.tracing.hwui.skia_use_perfetto_track_events.<package.name>
+ // - debug.tracing.ctl.hwui.skia_tracing_enabled.<package.name>
+ // - debug.tracing.ctl.hwui.skia_use_perfetto_track_events.<package.name>
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto
index a9d53e6..99b62de 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -436,8 +436,8 @@
// restarted.
//
// Specifically this sets the following system properties:
- // - debug.tracing.renderengine.skia_tracing_enabled
- // - debug.tracing.renderengine.skia_use_perfetto_track_events
+ // - debug.tracing.ctl.renderengine.skia_tracing_enabled
+ // - debug.tracing.ctl.renderengine.skia_use_perfetto_track_events
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
@@ -453,12 +453,12 @@
//
// ATTENTION: affects ALL HWUI APPS if hwui_package_name_filter is not set!
// If filtering is NOT set, this controls these GLOBAL system properties:
- // - debug.tracing.hwui.skia_tracing_enabled
- // - debug.tracing.hwui.skia_use_perfetto_track_events
+ // - debug.tracing.ctl.hwui.skia_tracing_enabled
+ // - debug.tracing.ctl.hwui.skia_use_perfetto_track_events
// If filtering IS set, this controls these APP-SPECIFIC system properties,
// for each package listed in the filter:
- // - debug.tracing.hwui.skia_tracing_enabled.<package.name>
- // - debug.tracing.hwui.skia_use_perfetto_track_events.<package.name>
+ // - debug.tracing.ctl.hwui.skia_tracing_enabled.<package.name>
+ // - debug.tracing.ctl.hwui.skia_use_perfetto_track_events.<package.name>
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
@@ -3135,6 +3135,13 @@
// consumer.
STOP_TRACING = 2;
+ // 3 was taken by CLONE_SNAPSHOT but that has been moved to 4.
+ // The early implementation of CLONE_SNAPSHOT had various bugs
+ // (b/290798988, b/290799105) and made it into Android U. The number
+ // change is to make sure nobody rolls out a config that hits the broken
+ // behaviour.
+ reserved 3;
+
// When this mode is chosen, this causes a snapshot of the current tracing
// session to be created after |stop_delay_ms| while the current tracing
// session continues undisturbed (% an extra flush). This mode can be
@@ -3146,10 +3153,10 @@
// consumer is supposed to call CloneSession() itself after the event.
// Use use_clone_snapshot_if_available=true when targeting older versions
// of perfetto.
- CLONE_SNAPSHOT = 3;
+ CLONE_SNAPSHOT = 4;
- // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android U+
- // (14+) / Perfetto v34+. A bug in older versions of the tracing service
+ // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android V+
+ // (15+) / Perfetto v38+. A bug in older versions of the tracing service
// might cause indefinitely long tracing sessions (see b/274931668).
}
optional TriggerMode trigger_mode = 1;
@@ -3162,7 +3169,11 @@
// versions of Android and fall back to STOP_TRACING on older versions where
// CLONE_SNAPSHOT did not exist.
// When using this flag, trigger_mode must be set to STOP_TRACING.
- optional bool use_clone_snapshot_if_available = 4;
+ optional bool use_clone_snapshot_if_available = 5;
+
+ // DEPRECATED, was use_clone_snapshot_if_available in U. See the comment
+ // around CLONE_SNAPSHOT.
+ reserved 4;
message Trigger {
// The producer must specify this name to activate the trigger.
diff --git a/protos/perfetto/config/trace_config.proto b/protos/perfetto/config/trace_config.proto
index d19e73a..ffee900 100644
--- a/protos/perfetto/config/trace_config.proto
+++ b/protos/perfetto/config/trace_config.proto
@@ -314,6 +314,13 @@
// consumer.
STOP_TRACING = 2;
+ // 3 was taken by CLONE_SNAPSHOT but that has been moved to 4.
+ // The early implementation of CLONE_SNAPSHOT had various bugs
+ // (b/290798988, b/290799105) and made it into Android U. The number
+ // change is to make sure nobody rolls out a config that hits the broken
+ // behaviour.
+ reserved 3;
+
// When this mode is chosen, this causes a snapshot of the current tracing
// session to be created after |stop_delay_ms| while the current tracing
// session continues undisturbed (% an extra flush). This mode can be
@@ -325,10 +332,10 @@
// consumer is supposed to call CloneSession() itself after the event.
// Use use_clone_snapshot_if_available=true when targeting older versions
// of perfetto.
- CLONE_SNAPSHOT = 3;
+ CLONE_SNAPSHOT = 4;
- // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android U+
- // (14+) / Perfetto v34+. A bug in older versions of the tracing service
+ // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android V+
+ // (15+) / Perfetto v38+. A bug in older versions of the tracing service
// might cause indefinitely long tracing sessions (see b/274931668).
}
optional TriggerMode trigger_mode = 1;
@@ -341,7 +348,11 @@
// versions of Android and fall back to STOP_TRACING on older versions where
// CLONE_SNAPSHOT did not exist.
// When using this flag, trigger_mode must be set to STOP_TRACING.
- optional bool use_clone_snapshot_if_available = 4;
+ optional bool use_clone_snapshot_if_available = 5;
+
+ // DEPRECATED, was use_clone_snapshot_if_available in U. See the comment
+ // around CLONE_SNAPSHOT.
+ reserved 4;
message Trigger {
// The producer must specify this name to activate the trigger.
diff --git a/protos/perfetto/metrics/chrome/BUILD.gn b/protos/perfetto/metrics/chrome/BUILD.gn
index f82d634..60c60a7 100644
--- a/protos/perfetto/metrics/chrome/BUILD.gn
+++ b/protos/perfetto/metrics/chrome/BUILD.gn
@@ -31,7 +31,6 @@
"performance_mark_hashes.proto",
"reported_by_page.proto",
"scroll_jank.proto",
- "scroll_jank_v2.proto",
"scroll_jank_v3.proto",
"slice_names.proto",
"test_chrome_metric.proto",
diff --git a/protos/perfetto/metrics/chrome/all_chrome_metrics.proto b/protos/perfetto/metrics/chrome/all_chrome_metrics.proto
index 908af94..596bc7f 100644
--- a/protos/perfetto/metrics/chrome/all_chrome_metrics.proto
+++ b/protos/perfetto/metrics/chrome/all_chrome_metrics.proto
@@ -29,7 +29,6 @@
import "protos/perfetto/metrics/chrome/reported_by_page.proto";
import "protos/perfetto/metrics/chrome/slice_names.proto";
import "protos/perfetto/metrics/chrome/scroll_jank.proto";
-import "protos/perfetto/metrics/chrome/scroll_jank_v2.proto";
import "protos/perfetto/metrics/chrome/scroll_jank_v3.proto";
import "protos/perfetto/metrics/chrome/test_chrome_metric.proto";
import "protos/perfetto/metrics/chrome/touch_jank.proto";
@@ -53,6 +52,5 @@
optional ChromeSliceNames chrome_slice_names = 1013;
optional ChromeUnsymbolizedArgs chrome_unsymbolized_args = 1014;
optional ChromeArgsClassNames chrome_args_class_names = 1015;
- optional ChromeScrollJankV2 chrome_scroll_jank_v2 = 1016;
optional ChromeScrollJankV3 chrome_scroll_jank_v3 = 1017;
}
diff --git a/protos/perfetto/metrics/chrome/scroll_jank_v2.proto b/protos/perfetto/metrics/chrome/scroll_jank_v2.proto
deleted file mode 100644
index 4e9ef6d..0000000
--- a/protos/perfetto/metrics/chrome/scroll_jank_v2.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2023 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
- *
- * http://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.
- */
-
-syntax = "proto2";
-
-package perfetto.protos;
-
-import "protos/perfetto/metrics/custom_options.proto";
-
-message ChromeScrollJankV2 {
- // Total time spent processing scroll updates.
- optional double scroll_processing_ms = 1 [(unit) = "ms_biggerIsBetter"];
- // Of the total scrolling processing time, this much is considered
- // "janky". This excludes jank caused due to
- // `RendererCompositorQueueingDelay`, which can add nontrivial noise.
- optional double scroll_jank_processing_ms = 2 [(unit) = "ms_smallerIsBetter"];
- // Computed as: `100 * scroll_jank_processing_ms / scroll_processing_ms`.
- optional double scroll_jank_percentage = 3 [(unit) = "n%_smallerIsBetter"];
- // The number of scroll janks. Similar to above, this excludes jank caused
- // due to `RendererCompositorQueueingDelay`, which can add nontrivial noise.
- optional int64 num_scroll_janks = 4 [(unit) = "count_smallerIsBetter"];
- // The primary cause, sub-cause, and duration for scroll jank, one for each
- // jank. There are exactly `num_scroll_janks` items in this field.
- message ScrollJankCauseAndDuration {
- optional string cause = 1;
- optional string sub_cause = 2;
- optional double duration_ms = 3 [(unit) = "ms_smallerIsBetter"];
- }
- repeated ScrollJankCauseAndDuration scroll_jank_causes_and_durations = 5;
-}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 34039ff..75043d0 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -436,8 +436,8 @@
// restarted.
//
// Specifically this sets the following system properties:
- // - debug.tracing.renderengine.skia_tracing_enabled
- // - debug.tracing.renderengine.skia_use_perfetto_track_events
+ // - debug.tracing.ctl.renderengine.skia_tracing_enabled
+ // - debug.tracing.ctl.renderengine.skia_use_perfetto_track_events
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
@@ -453,12 +453,12 @@
//
// ATTENTION: affects ALL HWUI APPS if hwui_package_name_filter is not set!
// If filtering is NOT set, this controls these GLOBAL system properties:
- // - debug.tracing.hwui.skia_tracing_enabled
- // - debug.tracing.hwui.skia_use_perfetto_track_events
+ // - debug.tracing.ctl.hwui.skia_tracing_enabled
+ // - debug.tracing.ctl.hwui.skia_use_perfetto_track_events
// If filtering IS set, this controls these APP-SPECIFIC system properties,
// for each package listed in the filter:
- // - debug.tracing.hwui.skia_tracing_enabled.<package.name>
- // - debug.tracing.hwui.skia_use_perfetto_track_events.<package.name>
+ // - debug.tracing.ctl.hwui.skia_tracing_enabled.<package.name>
+ // - debug.tracing.ctl.hwui.skia_use_perfetto_track_events.<package.name>
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
@@ -3135,6 +3135,13 @@
// consumer.
STOP_TRACING = 2;
+ // 3 was taken by CLONE_SNAPSHOT but that has been moved to 4.
+ // The early implementation of CLONE_SNAPSHOT had various bugs
+ // (b/290798988, b/290799105) and made it into Android U. The number
+ // change is to make sure nobody rolls out a config that hits the broken
+ // behaviour.
+ reserved 3;
+
// When this mode is chosen, this causes a snapshot of the current tracing
// session to be created after |stop_delay_ms| while the current tracing
// session continues undisturbed (% an extra flush). This mode can be
@@ -3146,10 +3153,10 @@
// consumer is supposed to call CloneSession() itself after the event.
// Use use_clone_snapshot_if_available=true when targeting older versions
// of perfetto.
- CLONE_SNAPSHOT = 3;
+ CLONE_SNAPSHOT = 4;
- // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android U+
- // (14+) / Perfetto v34+. A bug in older versions of the tracing service
+ // NOTE: CLONE_SNAPSHOT should be used only when we targeting Android V+
+ // (15+) / Perfetto v38+. A bug in older versions of the tracing service
// might cause indefinitely long tracing sessions (see b/274931668).
}
optional TriggerMode trigger_mode = 1;
@@ -3162,7 +3169,11 @@
// versions of Android and fall back to STOP_TRACING on older versions where
// CLONE_SNAPSHOT did not exist.
// When using this flag, trigger_mode must be set to STOP_TRACING.
- optional bool use_clone_snapshot_if_available = 4;
+ optional bool use_clone_snapshot_if_available = 5;
+
+ // DEPRECATED, was use_clone_snapshot_if_available in U. See the comment
+ // around CLONE_SNAPSHOT.
+ reserved 4;
message Trigger {
// The producer must specify this name to activate the trigger.
@@ -10908,8 +10919,10 @@
// Extension range reserved for chromium:
// https://source.chromium.org/chromium/chromium/src/+/main:base/tracing/protos/chrome_track_event.proto
extensions 1000 to 1999;
+ // Extension range reserved for https://b.corp.google.com/issues/301227627.
+ extensions 2000 to 2000;
// Extension range for future use.
- extensions 2000 to 9899;
+ extensions 2001 to 9899;
// Reserved for Perfetto unit and integration tests.
extensions 9900 to 10000;
diff --git a/protos/perfetto/trace/track_event/track_event.proto b/protos/perfetto/trace/track_event/track_event.proto
index 9991979..cde2fbb 100644
--- a/protos/perfetto/trace/track_event/track_event.proto
+++ b/protos/perfetto/trace/track_event/track_event.proto
@@ -283,8 +283,10 @@
// Extension range reserved for chromium:
// https://source.chromium.org/chromium/chromium/src/+/main:base/tracing/protos/chrome_track_event.proto
extensions 1000 to 1999;
+ // Extension range reserved for https://b.corp.google.com/issues/301227627.
+ extensions 2000 to 2000;
// Extension range for future use.
- extensions 2000 to 9899;
+ extensions 2001 to 9899;
// Reserved for Perfetto unit and integration tests.
extensions 9900 to 10000;
diff --git a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
index 27df202..9d7599a 100644
--- a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
@@ -24,7 +24,7 @@
namespace trace_processor {
namespace {
-std::array<FtraceMessageDescriptor, 484> descriptors{{
+std::array<FtraceMessageDescriptor, 485> descriptors{{
{nullptr, 0, {}},
{nullptr, 0, {}},
{nullptr, 0, {}},
@@ -5323,6 +5323,18 @@
{"info_val", ProtoSchemaType::kUint64},
},
},
+ {
+ "samsung_tracing_mark_write",
+ 5,
+ {
+ {},
+ {"pid", ProtoSchemaType::kInt32},
+ {"trace_name", ProtoSchemaType::kString},
+ {"trace_begin", ProtoSchemaType::kUint32},
+ {"trace_type", ProtoSchemaType::kUint32},
+ {"value", ProtoSchemaType::kInt32},
+ },
+ },
}};
} // namespace
diff --git a/src/trace_processor/metrics/sql/chrome/BUILD.gn b/src/trace_processor/metrics/sql/chrome/BUILD.gn
index 78d7df7..30962b8 100644
--- a/src/trace_processor/metrics/sql/chrome/BUILD.gn
+++ b/src/trace_processor/metrics/sql/chrome/BUILD.gn
@@ -36,7 +36,6 @@
"chrome_reliable_range.sql",
"chrome_scroll_inputs_per_frame.sql",
"chrome_scroll_jank_caused_by_scheduling.sql",
- "chrome_scroll_jank_v2.sql",
"chrome_scroll_jank_v3.sql",
"chrome_slice_names.sql",
"chrome_stack_samples_for_task.sql",
diff --git a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql b/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql
deleted file mode 100644
index 2884d7a..0000000
--- a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v2.sql
+++ /dev/null
@@ -1,96 +0,0 @@
---
--- 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.
---
--- A collection of metrics related to janky scrolling. Please refer to the
--- corresponding `chrome/scroll_jank_v2.proto` for more details.
-
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_scroll_jank_cause;
-
-DROP VIEW IF EXISTS __chrome_scroll_jank_v2_scroll_processing;
-
-CREATE VIEW __chrome_scroll_jank_v2_scroll_processing
-AS
-SELECT COALESCE(SUM(jank.dur), 0) / 1.0e6 AS scroll_processing_ms
-FROM
- chrome_scroll_event_latency_jank AS jank
-LEFT JOIN
- chrome_event_latency_scroll_jank_cause AS cause
- ON
- jank.id = cause.slice_id;
-
-DROP VIEW IF EXISTS __chrome_scroll_jank_v2_causes_and_durations;
-
-CREATE VIEW __chrome_scroll_jank_v2_causes_and_durations
-AS
-SELECT
- COALESCE(SUM(jank.dur), 0) / 1.0e6 AS scroll_jank_processing_ms,
- COUNT(*) AS num_scroll_janks,
- RepeatedField(
- ChromeScrollJankV2_ScrollJankCauseAndDuration(
- 'cause',
- cause.cause_of_jank,
- 'sub_cause',
- cause.sub_cause_of_jank,
- 'duration_ms',
- jank.dur / 1.0e6))
- AS scroll_jank_causes_and_durations
-FROM
- chrome_scroll_event_latency_jank AS jank
-LEFT JOIN
- chrome_event_latency_scroll_jank_cause AS cause
- ON
- jank.id = cause.slice_id
-WHERE
- jank.jank AND cause.cause_of_jank != 'RendererCompositorQueueingDelay';
-
-DROP VIEW IF EXISTS __chrome_scroll_jank_v2;
-
-CREATE VIEW __chrome_scroll_jank_v2
-AS
-SELECT
- 100.0 * scroll_jank_processing_ms / scroll_processing_ms
- AS scroll_jank_percentage,
- *
-FROM
- (
- SELECT
- total_scroll_processing.scroll_processing_ms,
- causes_and_durations.scroll_jank_processing_ms,
- causes_and_durations.num_scroll_janks,
- causes_and_durations.scroll_jank_causes_and_durations
- FROM
- __chrome_scroll_jank_v2_scroll_processing
- AS total_scroll_processing,
- __chrome_scroll_jank_v2_causes_and_durations AS causes_and_durations
- );
-
-DROP VIEW IF EXISTS chrome_scroll_jank_v2_output;
-
-CREATE VIEW chrome_scroll_jank_v2_output
-AS
-SELECT
- ChromeScrollJankV2(
- 'scroll_processing_ms',
- scroll_processing_ms,
- 'scroll_jank_processing_ms',
- scroll_jank_processing_ms,
- 'scroll_jank_percentage',
- scroll_jank_percentage,
- 'num_scroll_janks',
- num_scroll_janks,
- 'scroll_jank_causes_and_durations',
- scroll_jank_causes_and_durations)
-FROM
- __chrome_scroll_jank_v2;
diff --git a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql b/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql
index 514f184..f1effb2 100644
--- a/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql
+++ b/src/trace_processor/metrics/sql/chrome/chrome_scroll_jank_v3.sql
@@ -32,7 +32,7 @@
SELECT
-- MAX does not matter for these aggregations, since the values are the
-- same across rows.
- (SELECT COUNT(*) FROM chrome_janky_frame_info_with_delay)
+ (SELECT COUNT(*) FROM chrome_frame_info_with_delay)
AS trace_num_frames,
(SELECT COUNT(*) FROM chrome_janky_frames)
AS trace_num_janky_frames,
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn
index 3e30a16..6e5f2f4 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/BUILD.gn
@@ -16,11 +16,9 @@
perfetto_sql_source_set("scroll_jank") {
sources = [
- "event_latency_scroll_jank.sql",
- "event_latency_scroll_jank_cause.sql",
- "event_latency_to_breakdowns.sql",
"scroll_jank_intervals.sql",
"scroll_jank_v3.sql",
+ "scroll_jank_v3_cause.sql",
"utils.sql",
]
}
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql
deleted file mode 100644
index 7690359..0000000
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank.sql
+++ /dev/null
@@ -1,182 +0,0 @@
---
--- Copyright 2022 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.
---
--- A scroll jank metric based on EventLatency slices.
---
--- We define an update to be janky if comparing forwards or backwards (ignoring
--- coalesced and not shown on the screen updates) a given updates exceeds the duration
--- of its predecessor or successor by 50% of a vsync interval (defaulted to 60 FPS).
---
--- WARNING: This metric should not be used as a source of truth. It is under
--- active development and the values & meaning might change without
--- notice.
-
-INCLUDE PERFETTO MODULE chrome.scroll_jank.utils;
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_to_breakdowns;
-INCLUDE PERFETTO MODULE chrome.vsync_intervals;
-
--- Creates table view where each EventLatency event has its upid.
-CREATE VIEW internal_event_latency_with_track
-AS
-SELECT
- slice.*,
- process_track.upid AS upid
-FROM slice JOIN process_track
- ON slice.track_id = process_track.id
-WHERE slice.name = "EventLatency";
-
--- Select scroll EventLatency events that were shown on the screen.
--- An update event was shown on the screen if and only if
--- it has a "SubmitCompositorFrameToPresentationCompositorFrame" breakdown.
--- But this logic is not applied for begin events, because a begin event is an artifical marker
--- and never gets shown to the screen because it doesn't contain any update.
--- Also it automaticly only includes non-coalesced EventLatency events,
--- because coalesced ones are not shown on the screen.
-CREATE VIEW internal_filtered_scroll_event_latency
-AS
-WITH shown_on_display_event_latency_ids AS (
- SELECT
- event_latency_id
- FROM chrome_event_latency_breakdowns
- WHERE name = "SubmitCompositorFrameToPresentationCompositorFrame" OR event_type = "GESTURE_SCROLL_BEGIN"
-)
-SELECT
- internal_event_latency_with_track.id,
- internal_event_latency_with_track.track_id,
- internal_event_latency_with_track.upid,
- internal_event_latency_with_track.ts,
- internal_event_latency_with_track.dur,
- EXTRACT_ARG(internal_event_latency_with_track.arg_set_id, "event_latency.event_type") AS event_type
-FROM internal_event_latency_with_track JOIN shown_on_display_event_latency_ids
- ON internal_event_latency_with_track.id = shown_on_display_event_latency_ids.event_latency_id
-WHERE
- event_type IN (
- "GESTURE_SCROLL_BEGIN", "GESTURE_SCROLL_UPDATE",
- "INERTIAL_GESTURE_SCROLL_UPDATE", "FIRST_GESTURE_SCROLL_UPDATE");
-
--- Select begin events and it's next begin event witin the same process (same upid).
---
--- Note: Must be a TABLE because it uses a window function which can behave
--- strangely in views.
-CREATE PERFETTO TABLE internal_scroll_event_latency_begins
-AS
-SELECT
- *,
- LEAD(ts) OVER sorted_begins AS next_gesture_begin_ts
-FROM internal_filtered_scroll_event_latency
-WHERE event_type = "GESTURE_SCROLL_BEGIN"
-WINDOW sorted_begins AS (PARTITION BY upid ORDER BY ts ASC);
-
--- For each scroll update event finds it's begin event.
--- Pair [upid, next_gesture_begin_ts] represent a gesture key.
--- We need to know the gesture key of gesture scroll to calculate a jank only within this gesture scroll.
--- Because different gesture scrolls can have different properties.
-CREATE VIEW internal_scroll_event_latency_updates
-AS
-SELECT
- internal_filtered_scroll_event_latency.*,
- internal_scroll_event_latency_begins.ts AS gesture_begin_ts,
- internal_scroll_event_latency_begins.next_gesture_begin_ts AS next_gesture_begin_ts
-FROM internal_filtered_scroll_event_latency LEFT JOIN internal_scroll_event_latency_begins
- ON internal_filtered_scroll_event_latency.ts >= internal_scroll_event_latency_begins.ts
- AND (internal_filtered_scroll_event_latency.ts < next_gesture_begin_ts OR next_gesture_begin_ts IS NULL)
- AND internal_filtered_scroll_event_latency.upid = internal_scroll_event_latency_begins.upid
-WHERE internal_filtered_scroll_event_latency.id != internal_scroll_event_latency_begins.id
- AND internal_filtered_scroll_event_latency.event_type != "GESTURE_SCROLL_BEGIN";
-
--- Find the last EventLatency scroll update event in the scroll.
--- We will use the last EventLatency event insted of "InputLatency::GestureScrollEnd" event.
--- We need to know when the scroll gesture ends so that we can later calculate
--- the average vsync interval just up to the end of the gesture.
-CREATE VIEW internal_scroll_event_latency_updates_ends
-AS
-SELECT
- id,
- upid,
- gesture_begin_ts,
- ts,
- dur,
- MAX(ts + dur) AS gesture_end_ts
-FROM internal_scroll_event_latency_updates
-GROUP BY upid, gesture_begin_ts;
-
-CREATE VIEW internal_scroll_event_latency_updates_with_ends
-AS
-SELECT
- internal_scroll_event_latency_updates.*,
- internal_scroll_event_latency_updates_ends.gesture_end_ts AS gesture_end_ts
-FROM internal_scroll_event_latency_updates LEFT JOIN internal_scroll_event_latency_updates_ends
- ON internal_scroll_event_latency_updates.upid = internal_scroll_event_latency_updates_ends.upid
- AND internal_scroll_event_latency_updates.gesture_begin_ts = internal_scroll_event_latency_updates_ends.gesture_begin_ts;
-
--- Creates table where each event contains info about it's previous and next events.
--- We consider only previous and next events from the same scroll id
--- to don't calculate a jank between different scrolls.
---
--- Note: Must be a TABLE because it uses a window function which can behave
--- strangely in views.
-CREATE PERFETTO TABLE internal_scroll_event_latency_with_neighbours
-AS
-SELECT
- *,
- LEAD(id) OVER sorted_events AS next_id,
- LEAD(ts) OVER sorted_events AS next_ts,
- LEAD(dur) OVER sorted_events AS next_dur,
- LAG(id) OVER sorted_events AS prev_id,
- LAG(ts) OVER sorted_events AS prev_ts,
- LAG(dur) OVER sorted_events AS prev_dur,
- calculate_avg_vsync_interval(gesture_begin_ts, gesture_end_ts) AS avg_vsync_interval
-FROM internal_scroll_event_latency_updates_with_ends
-WINDOW sorted_events AS (PARTITION BY upid, next_gesture_begin_ts ORDER BY id ASC, ts ASC);
-
-CREATE VIEW internal_scroll_event_latency_neighbors_jank
-AS
-SELECT
- is_janky_frame(gesture_begin_ts, gesture_begin_ts, next_ts,
- gesture_begin_ts, gesture_end_ts, dur / avg_vsync_interval, next_dur / avg_vsync_interval) AS next_jank,
- is_janky_frame(gesture_begin_ts, gesture_begin_ts, prev_ts,
- gesture_begin_ts, gesture_end_ts, dur / avg_vsync_interval, prev_dur / avg_vsync_interval) AS prev_jank,
- internal_scroll_event_latency_with_neighbours.*
-FROM internal_scroll_event_latency_with_neighbours;
-
--- Creates a view where each event contains information about whether it is janky
--- with respect to previous and next events within the same scroll.
---
--- @column jank Whether this event is janky.
--- @column next_jank Whether the subsequent event is janky.
--- @column prev_jank Whether the previous event is janky.
--- @column id ID of the frame.
--- @column track_id Track ID of the frame.
--- @column upid Process ID of the frame.
--- @column ts Timestamp of the frame.
--- @column dur Duration of the frame.
--- @column event_type Event type.
--- @column gesture_begin_ts Timestamp of the associated gesture begin
--- event.
--- @column next_gesture_begin_ts Timestamp of the subsequent gesture begin
--- event.
--- @column gesture_end_ts Timestamp of the associated gesture end event.
--- @column next_id ID of the next frame
--- @column next_ts Timestamp of the next frame.
--- @column next_dur Duration of the next frame.
--- @column prev_id ID of the previous frame.
--- @column prev_ts Timestamp of the previous frame.
--- @column prev_dur Duration of the previous frame.
-CREATE VIEW chrome_scroll_event_latency_jank
-AS
-SELECT
- (next_jank IS NOT NULL AND next_jank) OR (prev_jank IS NOT NULL AND prev_jank) AS jank,
- *
-FROM internal_scroll_event_latency_neighbors_jank;
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql
deleted file mode 100644
index 08a6d6a..0000000
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_scroll_jank_cause.sql
+++ /dev/null
@@ -1,194 +0,0 @@
---
--- Copyright 2022 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.
---
--- Calculating how often each breakdown causes a scroll jank.
--- We define that a breakdown causes a scroll jank in the janky EventLatency event if it increased
--- more than other breakdowns relatevly to its neigbour EventLatency events.
---
--- WARNING: This metric should not be used as a source of truth. It is under
--- active development and the values & meaning might change without
--- notice.
-
-
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_scroll_jank;
-
--- Calculating the jank delta for EventLatency events which are janky relatevly to its next EventLatency event.
--- For breakdowns that exist in the current EventLatency but not the next EventLatency
--- we use a default of 0 so that the full duration is considered when looking for the maximum increase.
--- Breakdowns that exist in the next EventLatency event, but not in the current EventLatency event,
--- are ignored because they do not cause a jank anyway.
-CREATE VIEW internal_event_latency_scroll_breakdowns_next_jank_deltas
-AS
-SELECT
- cur_breakdowns.*,
- next_breakdowns.event_type as next_event_type,
- next_breakdowns.slice_id as next_breakdown_id,
- next_breakdowns.dur as next_dur,
- cur_breakdowns.dur - COALESCE(next_breakdowns.dur, 0) as delta_dur_ns
-FROM internal_event_latency_scroll_breakdowns_jank as cur_breakdowns LEFT JOIN internal_event_latency_scroll_breakdowns_jank as next_breakdowns
-ON cur_breakdowns.next_event_latency_id = next_breakdowns.event_latency_id AND
- cur_breakdowns.name = next_breakdowns.name
-WHERE cur_breakdowns.next_jank = 1;
-
--- Calculating the jank delta for EventLatency events which are janky relatevly to its prev EventLatency event.
--- For breakdowns that exist in the current EventLatency but not the prev EventLatency
--- we use a default of 0 so that the full duration is considered when looking for the maximum increase.
--- Breakdowns that exist in the prev EventLatency event, but not in the current EventLatency event,
--- are ignored because they do not cause a jank anyway.
-CREATE VIEW internal_event_latency_scroll_breakdowns_prev_jank_deltas
-AS
-SELECT
- cur_breakdowns.*,
- prev_breakdowns.event_type as prev_event_type,
- prev_breakdowns.slice_id as prev_breakdown_id,
- prev_breakdowns.dur as prev_dur,
- cur_breakdowns.dur - COALESCE(prev_breakdowns.dur, 0) as delta_dur_ns
-FROM internal_event_latency_scroll_breakdowns_jank as cur_breakdowns LEFT JOIN internal_event_latency_scroll_breakdowns_jank as prev_breakdowns
-ON cur_breakdowns.prev_event_latency_id = prev_breakdowns.event_latency_id AND
- cur_breakdowns.name = prev_breakdowns.name
-WHERE cur_breakdowns.prev_jank = 1;
-
--- Add a jank indicator to each breakdown. Jank indicator is related to an entire EventLatency envent, not only to a breakdown.
-CREATE VIEW internal_event_latency_scroll_breakdowns_jank
-AS
-SELECT
- chrome_event_latency_breakdowns.*,
- chrome_scroll_event_latency_jank.jank,
- chrome_scroll_event_latency_jank.next_jank,
- chrome_scroll_event_latency_jank.prev_jank,
- chrome_scroll_event_latency_jank.next_id as next_event_latency_id,
- chrome_scroll_event_latency_jank.prev_id as prev_event_latency_id
-FROM chrome_event_latency_breakdowns JOIN chrome_scroll_event_latency_jank
-ON chrome_event_latency_breakdowns.event_latency_id = chrome_scroll_event_latency_jank.id
-WHERE chrome_event_latency_breakdowns.event_type in ("GESTURE_SCROLL_UPDATE", "FIRST_GESTURE_SCROLL_UPDATE", "INERTIAL_GESTURE_SCROLL_UPDATE");
-
--- Merge breakdowns from the |internal_event_latency_scroll_breakdowns_next_jank_deltas|
--- and |internal_event_latency_scroll_breakdowns_prev_jank_deltas| tables and select the maximum |delta_dur_ns| of them.
--- This is necessary in order to get a single reason for the jank for the event later.
-CREATE VIEW internal_event_latency_scroll_breakdowns_max_jank_deltas
-AS
-SELECT
- COALESCE(next.slice_id, prev.slice_id) as slice_id,
- COALESCE(next.name, prev.name) as name,
- COALESCE(next.event_latency_id, prev.event_latency_id) as event_latency_id,
- COALESCE(next.event_latency_track_id, prev.event_latency_track_id) as track_id,
- COALESCE(next.event_latency_dur, prev.event_latency_dur) as event_latency_dur,
- COALESCE(next.event_latency_ts, prev.event_latency_ts) as event_latency_ts,
- COALESCE(next.event_type, prev.event_type) as event_type,
- COALESCE(next.event_latency_ts, prev.event_latency_ts) as ts,
- COALESCE(next.event_latency_dur, prev.event_latency_dur) as dur,
- COALESCE(next.jank, prev.jank) as jank,
- COALESCE(next.next_jank, 0) as next_jank,
- COALESCE(prev.prev_jank, 0) as prev_jank,
- next.next_event_latency_id as next_event_latency_id,
- prev.prev_event_latency_id as prev_event_latency_id,
- next.delta_dur_ns as next_delta_dur_ns,
- prev.delta_dur_ns as prev_delta_dur_ns,
- CASE
- WHEN prev.delta_dur_ns IS NULL OR next.delta_dur_ns > prev.delta_dur_ns
- THEN next.delta_dur_ns
- ELSE prev.delta_dur_ns
- END as delta_dur_ns,
- CASE
- WHEN prev.delta_dur_ns IS NULL OR next.delta_dur_ns > prev.delta_dur_ns
- THEN next.next_breakdown_id
- ELSE prev.prev_breakdown_id
- END as max_jank_neigbour_breakdown_id
-FROM internal_event_latency_scroll_breakdowns_next_jank_deltas as next
-FULL JOIN internal_event_latency_scroll_breakdowns_prev_jank_deltas as prev
-ON next.slice_id = prev.slice_id;
-
--- Selecting breakdowns which have a maximum ns duration delta as a main causes of a jank for this EventLatency event.
-CREATE VIEW internal_event_latency_scroll_jank_cause_top_level
-AS
-SELECT
- event_latency_id as slice_id,
- track_id,
- event_latency_dur as dur,
- event_latency_ts as ts,
- event_type,
- next_jank,
- prev_jank,
- next_event_latency_id,
- prev_event_latency_id,
- next_delta_dur_ns,
- prev_delta_dur_ns,
- name as cause_of_jank,
- slice_id as max_jank_breakdown_id,
- max_jank_neigbour_breakdown_id,
- MAX(delta_dur_ns) as max_delta_dur_ns
-FROM internal_event_latency_scroll_breakdowns_max_jank_deltas
-GROUP BY event_latency_id;
-
--- Selecting sub-breakdowns of the main causes of a jank which have a maximum ns duration delta with a neighbour event's breakdowns.
-CREATE VIEW internal_event_latency_scroll_sub_breakdowns_max_deltas
-AS
-SELECT
- cur_event_latency.slice_id as event_latency_id,
- cur_sub_breakdowns.name as sub_breakdown_name,
- MAX(cur_sub_breakdowns.dur - neighbour_sub_breakdowns.dur) as max_sub_breakdown_delta_dur_ns
-FROM internal_event_latency_scroll_jank_cause_top_level as cur_event_latency
-LEFT JOIN slices as cur_sub_breakdowns
- ON cur_event_latency.max_jank_breakdown_id = cur_sub_breakdowns.parent_id
-LEFT JOIN slices as neighbour_sub_breakdowns
- ON cur_event_latency.max_jank_neigbour_breakdown_id = neighbour_sub_breakdowns.parent_id AND
- cur_sub_breakdowns.name = neighbour_sub_breakdowns.name
-GROUP BY cur_event_latency.slice_id, cur_event_latency.max_jank_breakdown_id;
-
--- Selecting the main cause of jank and its sub-cause of jank.
---
--- @column slice_id The id of the EventLatency/frame.
--- @column track_id The track id associated with the EventLatency.
--- @column dur The duration of the frame presentation.
--- @column ts The timestamp of the frame.
--- @column event_type The event type.
--- @column next_jank Whether the subsequent event is janky.
--- @column prev_jank Whether the previous event is janky.
--- @column next_event_latency_id The ID of the next frame.
--- @column prev_event_latency_id The ID of the previous frame.
--- @column next_delta_dur_ns The duration delta in ns of the next frame.
--- @column prev_delta_dur_ns The duration delta in ns of the previous
--- frame.
--- @column cause_of_jank The stage of EventLatency responsible for the
--- jank.
--- @column max_jank_breakdown_id The ID of the stage of maximum jank.
--- @column max_jank_neighbor_breakdown_id The ID of the stage of maximum
--- jank in a neighboring frame.
--- @column max_delta_dur_ns The maximum delta duration of jank in ns.
--- @column sub_cause_of_jank The sub-stage of the cause_of_jank that is
--- responsible for the jank, if such a stage
--- exists.
-CREATE VIEW chrome_event_latency_scroll_jank_cause
-AS
-SELECT
- internal_event_latency_scroll_jank_cause_top_level.*,
- max_sub_breakdowns.sub_breakdown_name as sub_cause_of_jank
-FROM internal_event_latency_scroll_jank_cause_top_level
-LEFT JOIN internal_event_latency_scroll_sub_breakdowns_max_deltas as max_sub_breakdowns
-ON internal_event_latency_scroll_jank_cause_top_level.slice_id = max_sub_breakdowns.event_latency_id;
-
--- Calculate how often each breakdown is a main cause of a jank for EventLatency events.
---
--- @column cause_of_jank Cause of jank in the trace
--- @column sub_cause_of_jank Associated sub-cause of jank in the trace.
--- @column cnt # of janks with this cause/subcause pair.
-CREATE VIEW chrome_event_latency_scroll_jank_cause_cnt
-AS
-SELECT
- cause_of_jank,
- sub_cause_of_jank,
- COUNT(*) as cnt
-FROM chrome_event_latency_scroll_jank_cause
-GROUP BY cause_of_jank, sub_cause_of_jank;
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql
deleted file mode 100644
index a8e9c0e..0000000
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/event_latency_to_breakdowns.sql
+++ /dev/null
@@ -1,193 +0,0 @@
---
--- Copyright 2022 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.
---
--- Creates metric with info about breakdowns and jank for GestureScrollBegin and GestureScrollUpdate.
-
--- Select EventLatency events.
-CREATE VIEW internal_event_latency
-AS
-SELECT
- *,
- EXTRACT_ARG(arg_set_id, "event_latency.event_type") AS event_type
-FROM slice
-WHERE
- name = "EventLatency";
-
--- Select breakdowns related to EventLatencies.
---
--- @column slice_id ID of the slice.
--- @column name Slice name.
--- @column dur Slice duration.
--- @column track_id Track ID of the slice.
--- @column ts Timestamp of the slice.
--- @column event_latency_id ID of the associated EventLatency slice.
--- @column event_latency_track_id Track ID of the associated EventLatency.
--- @column event_latency_ts Timestamp of the associated EventLatency.
--- @column event_latency_dur Duration of the associated EventLatency.
--- @column event_type Event type of the associated EventLatency.
-CREATE VIEW chrome_event_latency_breakdowns
-AS
-SELECT
- slice.id AS slice_id,
- slice.name AS name,
- slice.dur AS dur,
- slice.track_id AS track_id,
- slice.ts AS ts,
- internal_event_latency.slice_id AS event_latency_id,
- internal_event_latency.track_id AS event_latency_track_id,
- internal_event_latency.ts AS event_latency_ts,
- internal_event_latency.dur AS event_latency_dur,
- internal_event_latency.event_type AS event_type
-FROM slice JOIN internal_event_latency
- ON slice.parent_id = internal_event_latency.slice_id;
-
--- The function takes a breakdown name and checks if the breakdown name is known or not.
--- Returns the input breakdown name if it's an unknown breakdown, NULL otherwise.
-CREATE PERFETTO FUNCTION internal_invalid_name_or_null(name STRING)
-RETURNS STRING AS
-SELECT
- CASE
- WHEN
- $name not in (
- "GenerationToBrowserMain", "GenerationToRendererCompositor",
- "BrowserMainToRendererCompositor", "RendererCompositorQueueingDelay",
- "RendererCompositorToMain", "RendererCompositorProcessing",
- "RendererMainProcessing", "EndActivateToSubmitCompositorFrame",
- "SubmitCompositorFrameToPresentationCompositorFrame",
- "ArrivedInRendererCompositorToTermination",
- "RendererCompositorStartedToTermination",
- "RendererMainFinishedToTermination",
- "RendererCompositorFinishedToTermination",
- "RendererMainStartedToTermination",
- "RendererCompositorFinishedToBeginImplFrame",
- "RendererCompositorFinishedToCommit",
- "RendererCompositorFinishedToEndCommit",
- "RendererCompositorFinishedToActivation",
- "RendererCompositorFinishedToEndActivate",
- "RendererCompositorFinishedToSubmitCompositorFrame",
- "RendererMainFinishedToBeginImplFrame",
- "RendererMainFinishedToSendBeginMainFrame",
- "RendererMainFinishedToCommit", "RendererMainFinishedToEndCommit",
- "RendererMainFinishedToActivation", "RendererMainFinishedToEndActivate",
- "RendererMainFinishedToSubmitCompositorFrame",
- "BeginImplFrameToSendBeginMainFrame",
- "RendererCompositorFinishedToSendBeginMainFrame",
- "SendBeginMainFrameToCommit", "Commit",
- "EndCommitToActivation", "Activation")
- THEN $name
- ELSE NULL
- END;
-
--- Creates a view where each row contains information about one EventLatency event. Columns are duration of breakdowns.
--- In the result it will be something like this:
--- | event_latency_id | event_latency_ts | event_latency_dur | event_type | GenerationToBrowserMainNs | BrowserMainToRendererCompositorNs |...|
--- |------------------|------------------|-------------------|------------------|----------------------------|------------------------------------|---|
--- | 123 | 1661947470 | 20 | 1234567 | 30 | 50 | |
---
--- @column event_latency_id The EventLatency ID.
--- @column event_latency_track_id The EventLatency Track ID.
--- @column event_latency_ts Timestamp of EventLatency.
--- @column event_latency_dur Duration of EventLatency.
--- @column event_type Event type.
--- @column GenerationToRendererCompositorNs Duration of the
--- GenerationToRendererCompositorNs
--- stage. All subsequent columns are
--- durations and named for their
--- respective stages.
--- @column GenerationToBrowserMainNs Duration, see above.
--- @column BrowserMainToRendererCompositorNs Duration, see above.
--- @column RendererCompositorQueueingDelayNs Duration, see above.
--- @column RendererCompositorProcessingNs Duration, see above.
--- @column RendererCompositorToMainNs Duration, see above.
--- @column RendererMainProcessingNs Duration, see above.
--- @column ArrivedInRendererCompositorToTerminationNs Duration, see above.
--- @column RendererCompositorStartedToTerminationNs Duration, see above.
--- @column RendererCompositorFinishedToTerminationNs Duration, see above.
--- @column RendererMainStartedToTerminationNs Duration, see above.
--- @column RendererMainFinishedToTerminationNs Duration, see above.
--- @column BeginImplFrameToSendBeginMainFrameNs Duration, see above.
--- @column RendererCompositorFinishedToSendBeginMainFrameNs Duration, see above.
--- @column RendererCompositorFinishedToBeginImplFrameNs Duration, see above.
--- @column RendererCompositorFinishedToCommitNs Duration, see above.
--- @column RendererCompositorFinishedToEndCommitNs Duration, see above.
--- @column RendererCompositorFinishedToActivationNs Duration, see above.
--- @column RendererCompositorFinishedToEndActivateNs Duration, see above.
--- @column RendererCompositorFinishedToSubmitCompositorFrameNs Duration, see
--- above.
--- @column RendererMainFinishedToBeginImplFrameNs Duration, see above.
--- @column RendererMainFinishedToSendBeginMainFrameNs Duration, see above.
--- @column RendererMainFinishedToCommitNs Duration, see above.
--- @column RendererMainFinishedToEndCommitNs Duration, see above.
--- @column RendererMainFinishedToActivationNs Duration, see above.
--- @column RendererMainFinishedToEndActivateNs Duration, see above.
--- @column RendererMainFinishedToSubmitCompositorFrameNs Duration, see
--- above.
--- @column EndActivateToSubmitCompositorFrameNs Duration, see above.
--- @column SubmitCompositorFrameToPresentationCompositorFrameNs Duration, see
--- above.
--- @column SendBeginMainFrameToCommitNs Duration, see above.
--- @column CommitNs Duration, see above.
--- @column EndCommitToActivationNs Duration, see above.
--- @column ActivationNs Duration, see above.
--- @column unknown_stages_seen List of any unknown stages.
-CREATE VIEW chrome_event_latency_to_breakdowns
-AS
-SELECT
- event_latency_id,
- event_latency_track_id,
- event_latency_ts,
- event_latency_dur,
- event_type,
- max(CASE WHEN name = "GenerationToRendererCompositor" THEN dur END) AS GenerationToRendererCompositorNs,
- max(CASE WHEN name = "GenerationToBrowserMain" THEN dur END) AS GenerationToBrowserMainNs,
- max(CASE WHEN name = "BrowserMainToRendererCompositor" THEN dur END) AS BrowserMainToRendererCompositorNs,
- max(CASE WHEN name = "RendererCompositorQueueingDelay" THEN dur END) AS RendererCompositorQueueingDelayNs,
- max(CASE WHEN name = "RendererCompositorProcessing" THEN dur END) AS RendererCompositorProcessingNs,
- max(CASE WHEN name = "RendererCompositorToMain" THEN dur END) AS RendererCompositorToMainNs,
- max(CASE WHEN name = "RendererMainProcessing" THEN dur END) AS RendererMainProcessingNs,
-
- max(CASE WHEN name = "ArrivedInRendererCompositorToTermination" THEN dur END) AS ArrivedInRendererCompositorToTerminationNs,
- max(CASE WHEN name = "RendererCompositorStartedToTermination" THEN dur END) AS RendererCompositorStartedToTerminationNs,
- max(CASE WHEN name = "RendererCompositorFinishedToTermination" THEN dur END) AS RendererCompositorFinishedToTerminationNs,
- max(CASE WHEN name = "RendererMainStartedToTermination" THEN dur END) AS RendererMainStartedToTerminationNs,
- max(CASE WHEN name = "RendererMainFinishedToTermination" THEN dur END) AS RendererMainFinishedToTerminationNs,
-
- max(CASE WHEN name = "BeginImplFrameToSendBeginMainFrame" THEN dur END) AS BeginImplFrameToSendBeginMainFrameNs,
- max(CASE WHEN name = "RendererCompositorFinishedToSendBeginMainFrame" THEN dur END) AS RendererCompositorFinishedToSendBeginMainFrameNs,
- max(CASE WHEN name = "RendererCompositorFinishedToBeginImplFrame" THEN dur END) AS RendererCompositorFinishedToBeginImplFrameNs,
- max(CASE WHEN name = "RendererCompositorFinishedToCommit" THEN dur END) AS RendererCompositorFinishedToCommitNs,
- max(CASE WHEN name = "RendererCompositorFinishedToEndCommit" THEN dur END) AS RendererCompositorFinishedToEndCommitNs,
- max(CASE WHEN name = "RendererCompositorFinishedToActivation" THEN dur END) AS RendererCompositorFinishedToActivationNs,
- max(CASE WHEN name = "RendererCompositorFinishedToEndActivate" THEN dur END) AS RendererCompositorFinishedToEndActivateNs,
- max(CASE WHEN name = "RendererCompositorFinishedToSubmitCompositorFrame" THEN dur END) AS RendererCompositorFinishedToSubmitCompositorFrameNs,
- max(CASE WHEN name = "RendererMainFinishedToBeginImplFrame" THEN dur END) AS RendererMainFinishedToBeginImplFrameNs,
- max(CASE WHEN name = "RendererMainFinishedToSendBeginMainFrame" THEN dur END) AS RendererMainFinishedToSendBeginMainFrameNs,
- max(CASE WHEN name = "RendererMainFinishedToCommit" THEN dur END) AS RendererMainFinishedToCommitNs,
- max(CASE WHEN name = "RendererMainFinishedToEndCommit" THEN dur END) AS RendererMainFinishedToEndCommitNs,
- max(CASE WHEN name = "RendererMainFinishedToActivation" THEN dur END) AS RendererMainFinishedToActivationNs,
- max(CASE WHEN name = "RendererMainFinishedToEndActivate" THEN dur END) AS RendererMainFinishedToEndActivateNs,
- max(CASE WHEN name = "RendererMainFinishedToSubmitCompositorFrame" THEN dur END) AS RendererMainFinishedToSubmitCompositorFrameNs,
-
- max(CASE WHEN name = "EndActivateToSubmitCompositorFrame" THEN dur END) AS EndActivateToSubmitCompositorFrameNs,
- max(CASE WHEN name = "SubmitCompositorFrameToPresentationCompositorFrame" THEN dur END) AS SubmitCompositorFrameToPresentationCompositorFrameNs,
- max(CASE WHEN name = "SendBeginMainFrameToCommit" THEN dur END) AS SendBeginMainFrameToCommitNs,
- max(CASE WHEN name = "Commit" THEN dur END) AS CommitNs,
- max(CASE WHEN name = "EndCommitToActivation" THEN dur END) AS EndCommitToActivationNs,
- max(CASE WHEN name = "Activation" THEN dur END) AS ActivationNs,
- -- This column indicates whether there are unknown breakdowns.
- -- Contains: NULL if there are no unknown breakdowns, otherwise a list of unknown breakdows.
- group_concat(internal_invalid_name_or_null(name), ', ') AS unknown_stages_seen
-FROM chrome_event_latency_breakdowns
-GROUP BY event_latency_id;
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
index 372df5b..c6b505a 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
@@ -12,66 +12,103 @@
-- 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.
---
INCLUDE PERFETTO MODULE common.slices;
-- Hardware info is useful when using sql metrics for analysis
-- in BTP.
INCLUDE PERFETTO MODULE chrome.metadata;
-INCLUDE PERFETTO MODULE chrome.scroll_jank.event_latency_scroll_jank_cause;
+INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3_cause;
--- Grabs all gesture updates that were not coalesced with their
--- respective scroll ids and start/end timestamps.
+-- Grabs all gesture updates with respective scroll ids and start/end
+-- timestamps, regardless of being coalesced.
--
--- @column id Slice id.
--- @column start_ts The start timestamp of the scroll.
--- @column end_ts The end timestamp of the scroll.
--- @column last_coalesced_input_ts The timestamp of the last coalesced input.
+-- @column ts The start timestamp of the scroll.
+-- @column dur The duration of the scroll.
+-- @column id Slice id for the scroll.
-- @column scroll_update_id The id of the scroll update event.
-- @column scroll_id The id of the scroll.
-CREATE VIEW chrome_presented_gesture_scrolls AS
-WITH
- chrome_gesture_scrolls AS (
- SELECT
- ts AS start_ts,
- ts + dur AS end_ts,
- id,
- -- TODO(b/250089570) Add trace_id to EventLatency and update this script to use it.
- EXTRACT_ARG(arg_set_id, 'chrome_latency_info.trace_id') AS scroll_update_id,
- EXTRACT_ARG(arg_set_id, 'chrome_latency_info.gesture_scroll_id') AS scroll_id,
- EXTRACT_ARG(arg_set_id, 'chrome_latency_info.is_coalesced') AS is_coalesced
- FROM slice
- WHERE name = "InputLatency::GestureScrollUpdate"
- AND dur != -1),
- updates_with_coalesce_info AS (
- SELECT
- chrome_updates.*,
- (
- SELECT
- MAX(id)
- FROM chrome_gesture_scrolls updates
- WHERE updates.is_coalesced = false
- AND updates.start_ts <= chrome_updates.start_ts) AS coalesced_inside_id
- FROM
- chrome_gesture_scrolls chrome_updates)
+-- @column is_coalesced Whether this input event was coalesced.
+CREATE PERFETTO TABLE chrome_gesture_scroll_updates AS
SELECT
- MIN(id) AS id,
- MIN(start_ts) AS start_ts,
- MAX(end_ts) AS end_ts,
- MAX(start_ts) AS last_coalesced_input_ts,
+ ts,
+ dur,
+ id,
+ -- TODO(b/250089570) Add trace_id to EventLatency and update this script to use it.
+ EXTRACT_ARG(arg_set_id, 'chrome_latency_info.trace_id') AS scroll_update_id,
+ EXTRACT_ARG(arg_set_id, 'chrome_latency_info.gesture_scroll_id') AS scroll_id,
+ EXTRACT_ARG(arg_set_id, 'chrome_latency_info.is_coalesced') AS is_coalesced
+FROM slice
+WHERE name = "InputLatency::GestureScrollUpdate" AND dur != -1;
+
+CREATE PERFETTO TABLE internal_non_coalesced_gesture_scrolls AS
+SELECT
+ id,
+ ts,
+ dur,
scroll_update_id,
- MIN(scroll_id) AS scroll_id
-FROM updates_with_coalesce_info
-GROUP BY coalesced_inside_id;
+ scroll_id
+FROM chrome_gesture_scroll_updates
+WHERE is_coalesced = false
+ORDER BY ts ASC;
+
+-- Scroll updates, corresponding to all input events that were converted to a
+-- presented scroll update.
+--
+-- @column id Minimum slice id for input presented in this
+-- frame, the non coalesced input.
+-- @column ts The start timestamp for producing the frame.
+-- @column dur The duration between producing and
+-- presenting the frame.
+-- @column last_coalesced_input_ts The timestamp of the last input that arrived
+-- and got coalesced into the frame.
+-- @column scroll_update_id The id of the scroll update event, a unique
+-- identifier to the gesture.
+-- @column scroll_id The id of the ongoing scroll.
+CREATE PERFETTO TABLE chrome_presented_gesture_scrolls AS
+WITH
+scroll_updates_with_coalesce_info as MATERIALIZED (
+ SELECT
+ id,
+ ts,
+ -- For each scroll update, find the latest non-coalesced update which
+ -- happened before it. For coalesced scroll updates, this will be the
+ -- presented scroll update they have been coalesced into.
+ (
+ SELECT id
+ FROM internal_non_coalesced_gesture_scrolls non_coalesced
+ WHERE non_coalesced.ts <= scroll_update.ts
+ ORDER BY ts DESC
+ LIMIT 1
+ ) as coalesced_to_scroll_update_slice_id
+ FROM chrome_gesture_scroll_updates scroll_update
+ ORDER BY coalesced_to_scroll_update_slice_id, ts
+)
+SELECT
+ id,
+ ts,
+ dur,
+ -- Find the latest input that was coalesced into this scroll update.
+ (
+ SELECT coalesce_info.ts
+ FROM scroll_updates_with_coalesce_info coalesce_info
+ WHERE
+ coalesce_info.coalesced_to_scroll_update_slice_id =
+ internal_non_coalesced_gesture_scrolls.id
+ ORDER BY ts DESC
+ LIMIT 1
+ ) as last_coalesced_input_ts,
+ scroll_update_id,
+ scroll_id
+FROM internal_non_coalesced_gesture_scrolls;
-- Associate every trace_id with it's perceived delta_y on the screen after
-- prediction.
--
-- @column scroll_update_id The id of the scroll update event.
--- @column delta_y The percieved delta_y on the screen post
+-- @column delta_y The perceived delta_y on the screen post
-- prediction.
-CREATE VIEW chrome_scroll_updates_with_deltas AS
+CREATE PERFETTO TABLE chrome_scroll_updates_with_deltas AS
SELECT
EXTRACT_ARG(arg_set_id, 'scroll_deltas.trace_id') AS scroll_update_id,
EXTRACT_ARG(arg_set_id, 'scroll_deltas.provided_to_compositor_delta_y') AS delta_y
@@ -82,7 +119,7 @@
-- with gesture scroll updates, as event latencies don't have trace
-- ids associated with it.
--
--- @column start_ts Start timestampt for the EventLatency.
+-- @column ts Start timestamp for the EventLatency.
-- @column event_latency_id Slice id of the EventLatency.
-- @column dur Duration of the EventLatency.
-- @column input_latency_end_ts End timestamp for input aka the
@@ -93,9 +130,9 @@
-- SwapEndToPresentationCompositorFrame
-- substage.
-- @column event_type EventLatency event type.
-CREATE VIEW chrome_gesture_scroll_event_latencies AS
+CREATE PERFETTO TABLE chrome_gesture_scroll_event_latencies AS
SELECT
- slice.ts AS start_ts,
+ slice.ts,
slice.id AS event_latency_id,
slice.dur AS dur,
descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
@@ -115,7 +152,7 @@
-- the LatchToSwapEnd slice.
--
-- @column id ID of the frame.
--- @column start_ts Start timestamp of the frame.
+-- @column ts Start timestamp of the frame.
-- @column last_coalesced_input_ts The timestamp of the last coalesced
-- input.
-- @column scroll_id ID of the associated scroll.
@@ -123,10 +160,10 @@
-- @column event_latency_id ID of the associated EventLatency.
-- @column dur Duration of the associated EventLatency.
-- @column presentation_timestamp Frame presentation timestamp.
-CREATE VIEW chrome_full_frame_view AS
+CREATE PERFETTO TABLE chrome_full_frame_view AS
SELECT
frames.id,
- frames.start_ts,
+ frames.ts,
frames.last_coalesced_input_ts,
frames.scroll_id,
frames.scroll_update_id,
@@ -135,26 +172,26 @@
events.presentation_timestamp
FROM chrome_presented_gesture_scrolls frames
JOIN chrome_gesture_scroll_event_latencies events
- ON frames.start_ts = events.start_ts
- AND events.input_latency_end_ts = frames.end_ts;
+ ON frames.ts = events.ts
+ AND events.input_latency_end_ts = (frames.ts + frames.dur);
-- Join deltas with EventLatency data.
--
-- @column id ID of the frame.
--- @column start_ts Start timestamp of the frame.
+-- @column ts Start timestamp of the frame.
-- @column scroll_id ID of the associated scroll.
-- @column scroll_update_id ID of the associated scroll update.
-- @column last_coalesced_input_ts The timestamp of the last coalesced
-- input.
--- @column delta_y The percieved delta_y on the screen post
+-- @column delta_y The perceived delta_y on the screen post
-- -- prediction.
-- @column event_latency_id ID of the associated EventLatency.
-- @column dur Duration of the associated EventLatency.
-- @column presentation_timestamp Frame presentation timestamp.
-CREATE VIEW chrome_full_frame_delta_view AS
+CREATE PERFETTO TABLE chrome_full_frame_delta_view AS
SELECT
frames.id,
- frames.start_ts,
+ frames.ts,
frames.scroll_id,
frames.scroll_update_id,
frames.last_coalesced_input_ts,
@@ -166,33 +203,6 @@
LEFT JOIN chrome_scroll_updates_with_deltas deltas
ON deltas.scroll_update_id = frames.scroll_update_id;
--- Join the frame view with scroll jank cause and subcause based
--- on event latency id.
---
--- @column id ID of the frame.
--- @column start_ts Start timestamp of the frame.
--- @column scroll_id ID of the associated scroll.
--- @column scroll_update_id ID of the associated scroll update.
--- @column last_coalesced_input_ts The timestamp of the last coalesced
--- input.
--- @column delta_y The percieved delta_y on the screen post
--- -- prediction.
--- @column event_latency_id ID of the associated EventLatency.
--- @column dur Duration of the associated EventLatency.
--- @column presentation_timestamp Frame presentation timestamp.
--- @column cause_of_jank The stage of the EventLatency that is
--- the cause of jank.
--- @column sub_cause_of_jank The sub-stage of the cause_of_jank that
--- is the cause of jank, if it exists.
-CREATE PERFETTO TABLE chrome_frame_view_with_jank AS
-SELECT
- frames.*,
- jank_cause.cause_of_jank,
- jank_cause.sub_cause_of_jank
-FROM chrome_event_latency_scroll_jank_cause jank_cause
-RIGHT JOIN chrome_full_frame_delta_view frames
- ON jank_cause.slice_id = frames.event_latency_id;
-
-- Group all gestures presented at the same timestamp together in
-- a single row.
--
@@ -204,24 +214,20 @@
-- @column scroll_update_id ID of the associated scroll update.
-- @column encapsulated_scroll_ids All scroll updates associated with the
-- frame presentation timestamp.
--- @column total_delta Sum of all percieved delta_y values at
+-- @column total_delta Sum of all perceived delta_y values at
-- the frame presentation timestamp.
--- @column segregated_delta_y Lists all of the percieved delta_y
+-- @column segregated_delta_y Lists all of the perceived delta_y
-- values at the frame presentation
-- timestamp.
-- @column event_latency_id ID of the associated EventLatency.
-- @column dur Maximum duration of the associated
-- EventLatency.
-- @column presentation_timestamp Frame presentation timestamp.
--- @column cause_of_jank The stage of the EventLatency that is
--- the cause of jank.
--- @column sub_cause_of_jank The sub-stage of the cause_of_jank that
--- is the cause of jank, if it exists.
-CREATE VIEW chrome_merged_frame_view_with_jank AS
+CREATE VIEW chrome_merged_frame_view AS
SELECT
id,
MAX(last_coalesced_input_ts) AS max_start_ts,
- MIN(start_ts) AS min_start_ts,
+ MIN(ts) AS min_start_ts,
scroll_id,
scroll_update_id,
GROUP_CONCAT(scroll_update_id,',') AS encapsulated_scroll_ids,
@@ -229,10 +235,8 @@
GROUP_CONCAT(delta_y, ',') AS segregated_delta_y,
event_latency_id,
MAX(dur) AS dur,
- presentation_timestamp,
- cause_of_jank,
- sub_cause_of_jank
-FROM chrome_frame_view_with_jank
+ presentation_timestamp
+FROM chrome_full_frame_delta_view
GROUP BY presentation_timestamp
ORDER BY presentation_timestamp;
@@ -256,18 +260,14 @@
-- @column dur Duration of the EventLatency.
-- @column presentation_timestamp Timestamp at which the frame was shown on the
-- screen.
--- @column cause_of_jank Cause of jank will be present if a frame
--- takes more than 1/2 a vsync than it's
--- neighbours, will be filtered to real
--- positives later.
--- @column sub_cause_of_jank If the cause is GPU related, a sub cause is
--- present for further breakdown.
-- @column delay_since_last_frame Time elapsed since the previous frame was
-- presented, usually equals |VSYNC| if no frame
-- drops happened.
-- @column delay_since_last_input Difference in OS timestamps of inputs in the
-- current and the previous frame.
-CREATE VIEW chrome_janky_frame_info_with_delay AS
+-- @column prev_event_latency_id The event latency id that will be used as a
+-- reference to determine the jank cause.
+CREATE VIEW chrome_frame_info_with_delay AS
SELECT
*,
(presentation_timestamp -
@@ -275,8 +275,9 @@
OVER (PARTITION BY scroll_id ORDER BY presentation_timestamp)) / 1e6 AS delay_since_last_frame,
(min_start_ts -
LAG(max_start_ts, 1, min_start_ts)
- OVER (PARTITION BY scroll_id ORDER BY min_start_ts)) / 1e6 AS delay_since_last_input
-FROM chrome_merged_frame_view_with_jank;
+ OVER (PARTITION BY scroll_id ORDER BY min_start_ts)) / 1e6 AS delay_since_last_input,
+ LAG(event_latency_id, 1, -1) OVER (PARTITION BY scroll_id ORDER BY min_start_ts) AS prev_event_latency_id
+FROM chrome_merged_frame_view;
-- Calculate |VSYNC_INTERVAL| as the lowest delay between frames larger than
-- zero.
@@ -287,11 +288,54 @@
CREATE VIEW chrome_vsyncs AS
SELECT
MIN(delay_since_last_frame) AS vsync_interval
-FROM chrome_janky_frame_info_with_delay
+FROM chrome_frame_info_with_delay
WHERE delay_since_last_frame > 0;
-- Filter the frame view only to frames that had missed vsyncs.
--
+-- @column delay_since_last_frame Time elapsed since the previous frame was
+-- presented, will be more than |VSYNC| in this
+-- view.
+-- @column event_latency_id Event latency id of the presented frame.
+-- @column vsync_interval Vsync interval at the time of recording the
+-- trace.
+-- @column hardware_class Device brand and model.
+-- @column scroll_id The scroll corresponding to this frame.
+-- @column prev_event_latency_id The event latency id that will be used as a
+-- reference to determine the jank cause.
+CREATE VIEW chrome_janky_frames_no_cause AS
+SELECT
+ delay_since_last_frame,
+ event_latency_id,
+ (SELECT vsync_interval FROM chrome_vsyncs) AS vsync_interval,
+ chrome_hardware_class() AS hardware_class,
+ scroll_id,
+ prev_event_latency_id
+FROM chrome_frame_info_with_delay
+WHERE delay_since_last_frame > (select vsync_interval + vsync_interval / 2 from chrome_vsyncs)
+ AND delay_since_last_input < (select vsync_interval + vsync_interval / 2 from chrome_vsyncs);
+
+-- Janky frame information including the jank cause.
+-- @column delay_since_last_frame Time elapsed since the previous frame was
+-- presented, will be more than |VSYNC| in this
+-- view.
+-- @column event_latency_id Event latency id of the presented frame.
+-- @column vsync_interval Vsync interval at the time of recording the
+-- trace.
+-- @column hardware_class Device brand and model.
+-- @column scroll_id The scroll corresponding to this frame.
+-- @column prev_event_latency_id The event latency id that will be used as a
+-- reference to determine the jank cause.
+-- @column cause_id Id of the slice corresponding to the offending stage.
+CREATE VIEW chrome_janky_frames_no_subcause AS
+SELECT
+ *,
+ get_v3_jank_cause_id(event_latency_id, prev_event_latency_id) AS cause_id
+FROM chrome_janky_frames_no_cause;
+
+-- Finds all causes of jank for all janky frames, and a cause of sub jank
+-- if the cause of jank was GPU related.
+--
-- @column cause_of_jank The reason the Vsync was missed.
-- @column sub_cause_of_jank Further breakdown if the root cause was GPU
-- related.
@@ -305,16 +349,25 @@
-- @column scroll_id The scroll corresponding to this frame.
CREATE VIEW chrome_janky_frames AS
SELECT
- cause_of_jank,
- sub_cause_of_jank,
+ slice_name_from_id(cause_id) AS cause_of_jank,
+ slice_name_from_id(
+ -- Getting sub-cause
+ get_v3_jank_cause_id(
+ -- Here the cause itself is the parent.
+ cause_id,
+ -- Get the previous cause id as a child to the previous |EventLatency|.
+ (SELECT
+ id
+ FROM slice
+ WHERE name = slice_name_from_id(cause_id)
+ AND parent_id = prev_event_latency_id)
+ )) AS sub_cause_of_jank,
delay_since_last_frame,
event_latency_id,
- (SELECT vsync_interval FROM chrome_vsyncs) AS vsync_interval,
- chrome_hardware_class() AS hardware_class,
+ vsync_interval,
+ hardware_class,
scroll_id
-FROM chrome_janky_frame_info_with_delay
-WHERE delay_since_last_frame > (select vsync_interval + vsync_interval / 2 from chrome_vsyncs)
- AND delay_since_last_input < (select vsync_interval + vsync_interval / 2 from chrome_vsyncs);
+FROM chrome_janky_frames_no_subcause;
-- Counting all unique frame presentation timestamps.
--
@@ -352,7 +405,7 @@
frames AS (
SELECT scroll_id, COUNT(*) AS num_frames
FROM
- chrome_janky_frame_info_with_delay
+ chrome_frame_info_with_delay
GROUP BY scroll_id
),
janky_frames AS (
@@ -401,66 +454,4 @@
AS scroll_jank_causes
FROM
chrome_janky_frames
-GROUP BY scroll_id;
-
--- An "intermediate" view for computing `chrome_scroll_jank_v3_output` below.
---
--- @column trace_num_frames The number of frames in the trace.
--- @column trace_num_janky_frames The number of delayed/janky frames in the
--- trace.
--- @column vsync_interval The standard vsync interval.
--- @column scrolls A proto amalgamation of metrics per scroll
--- including the number of frames, number of
--- janky frames, percent of janky frames,
--- maximum presentation delay, and the causes
--- of jank (cause, sub-cause, delay).
-CREATE VIEW chrome_scroll_jank_v3_intermediate AS
-SELECT
- -- MAX does not matter for these aggregations, since the values are the
- -- same across rows.
- (SELECT COUNT(*) FROM chrome_janky_frame_info_with_delay)
- AS trace_num_frames,
- (SELECT COUNT(*) FROM chrome_janky_frames)
- AS trace_num_janky_frames,
- causes.vsync_interval,
- RepeatedField(
- ChromeScrollJankV3_Scroll(
- 'num_frames',
- frames.num_frames,
- 'num_janky_frames',
- frames.num_janky_frames,
- 'scroll_jank_percentage',
- frames.scroll_jank_percentage,
- 'max_delay_since_last_frame',
- causes.max_delay_since_last_frame,
- 'scroll_jank_causes',
- causes.scroll_jank_causes))
- AS scrolls
-FROM
- chrome_frames_per_scroll AS frames
-INNER JOIN chrome_causes_per_scroll AS causes
- ON frames.scroll_id = causes.scroll_id;
-
--- For producing a "native" Perfetto UI metric.
---
--- @column scroll_jank_summary A proto amalgamation summarizing all of the
--- scroll jank in a trace, including the number
--- of frames, janky frames, percentage of janky
--- frames, vsync interval, and a summary of this
--- data (including individual causes) for each
--- scroll.
-CREATE VIEW chrome_scroll_jank_v3_output AS
-SELECT
- ChromeScrollJankV3(
- 'trace_num_frames',
- trace_num_frames,
- 'trace_num_janky_frames',
- trace_num_janky_frames,
- 'trace_scroll_jank_percentage',
- 100.0 * trace_num_janky_frames / trace_num_frames,
- 'vsync_interval_ms',
- vsync_interval,
- 'scrolls',
- scrolls) AS scroll_jank_summary
-FROM
- chrome_scroll_jank_v3_intermediate;
+GROUP BY scroll_id;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
new file mode 100644
index 0000000..164ba7a
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
@@ -0,0 +1,66 @@
+--
+-- Copyright 2023 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.
+
+-- Helper functions for scroll_jank_v3 metric computation.
+
+INCLUDE PERFETTO MODULE common.slices;
+
+
+-- Given two slice Ids A and B, find the maximum difference
+-- between the durations of it's direct children with matching names
+-- for example if slice A has children named (X, Y, Z) with durations of (10, 10, 5)
+-- and slice B has children named (X, Y) with durations of (9, 9), the function will return
+-- the slice id of the slice named Z that is A's child, as no matching slice named Z was found
+-- under B, making 5 - 0 = 5 the maximum delta between both slice's direct children
+--
+-- @arg janky_slice_id LONG The slice id of the parent slice that we want to
+-- cause among it's children.
+-- @arg prev_slice_id LONG The slice id of the parent slice that's the reference
+-- in comparison to |janky_slice_id|.
+-- @ret breakdown_id LONG The slice id of the breakdown that has the maximum
+-- duration delta.
+CREATE PERFETTO FUNCTION get_v3_jank_cause_id(
+ janky_slice_id LONG,
+ prev_slice_id LONG
+)
+RETURNS LONG AS
+WITH
+ current_breakdowns AS (
+ SELECT
+ *
+ FROM direct_children_slice($janky_slice_id)
+ ),
+ prev_breakdowns AS (
+ SELECT
+ *
+ FROM direct_children_slice($prev_slice_id)
+ ),
+ joint_breakdowns AS (
+ SELECT
+ cur.id AS breakdown_id,
+ (cur.dur - COALESCE(prev.dur, 0)) AS breakdown_delta
+ FROM current_breakdowns cur
+ LEFT JOIN prev_breakdowns prev ON
+ cur.name = prev.name
+ ),
+ max_breakdown AS (
+ SELECT
+ MAX(breakdown_delta) AS breakdown_delta,
+ breakdown_id
+ FROM joint_breakdowns
+ )
+ SELECT
+ breakdown_id
+ FROM max_breakdown;
diff --git a/src/traced/service/builtin_producer.cc b/src/traced/service/builtin_producer.cc
index 5a89a59..d46447c 100644
--- a/src/traced/service/builtin_producer.cc
+++ b/src/traced/service/builtin_producer.cc
@@ -57,16 +57,16 @@
constexpr char kAndroidSdkSyspropGuardDataSourceName[] =
"android.sdk_sysprop_guard";
constexpr char kPerfettoSdkSyspropGuardGenerationPropertyName[] =
- "debug.tracing.perfetto.sdk_sysprop_guard_generation";
+ "debug.tracing.ctl.perfetto.sdk_sysprop_guard_generation";
constexpr char kHwuiSkiaBroadTracingPropertyName[] =
- "debug.tracing.hwui.skia_tracing_enabled";
+ "debug.tracing.ctl.hwui.skia_tracing_enabled";
constexpr char kHwuiSkiaUsePerfettoPropertyName[] =
- "debug.tracing.hwui.skia_use_perfetto_track_events";
+ "debug.tracing.ctl.hwui.skia_use_perfetto_track_events";
constexpr char kHwuiSkiaPropertyPackageSeparator[] = ".";
constexpr char kSurfaceFlingerSkiaBroadTracingPropertyName[] =
- "debug.tracing.renderengine.skia_tracing_enabled";
+ "debug.tracing.ctl.renderengine.skia_tracing_enabled";
constexpr char kSurfaceFlingerSkiaUsePerfettoPropertyName[] =
- "debug.tracing.renderengine.skia_use_perfetto_track_events";
+ "debug.tracing.ctl.renderengine.skia_use_perfetto_track_events";
} // namespace
diff --git a/src/traced/service/builtin_producer_unittest.cc b/src/traced/service/builtin_producer_unittest.cc
index 7d96dee..6efd068 100644
--- a/src/traced/service/builtin_producer_unittest.cc
+++ b/src/traced/service/builtin_producer_unittest.cc
@@ -33,16 +33,16 @@
constexpr char kAndroidSdkSyspropGuardDataSourceName[] =
"android.sdk_sysprop_guard";
constexpr char kPerfettoSdkSyspropGuardGenerationPropertyName[] =
- "debug.tracing.perfetto.sdk_sysprop_guard_generation";
+ "debug.tracing.ctl.perfetto.sdk_sysprop_guard_generation";
constexpr char kHwuiSkiaBroadTracingPropertyName[] =
- "debug.tracing.hwui.skia_tracing_enabled";
+ "debug.tracing.ctl.hwui.skia_tracing_enabled";
constexpr char kHwuiSkiaUsePerfettoPropertyName[] =
- "debug.tracing.hwui.skia_use_perfetto_track_events";
+ "debug.tracing.ctl.hwui.skia_use_perfetto_track_events";
constexpr char kHwuiSkiaPropertyPackageSeparator[] = ".";
constexpr char kSurfaceFlingerSkiaBroadTracingPropertyName[] =
- "debug.tracing.renderengine.skia_tracing_enabled";
+ "debug.tracing.ctl.renderengine.skia_tracing_enabled";
constexpr char kSurfaceFlingerSkiaUsePerfettoPropertyName[] =
- "debug.tracing.renderengine.skia_use_perfetto_track_events";
+ "debug.tracing.ctl.renderengine.skia_use_perfetto_track_events";
using ::testing::_;
using ::testing::InvokeWithoutArgs;
diff --git a/test/trace_processor/diff_tests/chrome/chrome_scroll_jank_v2.out b/test/trace_processor/diff_tests/chrome/chrome_scroll_jank_v2.out
deleted file mode 100644
index b13137f..0000000
--- a/test/trace_processor/diff_tests/chrome/chrome_scroll_jank_v2.out
+++ /dev/null
@@ -1,3 +0,0 @@
-
-"scroll_processing_ms","scroll_jank_processing_ms","scroll_jank_percentage"
-12374.560000,154.217000,1.246242
diff --git a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank.out b/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank.out
deleted file mode 100644
index effa4b0..0000000
--- a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank.out
+++ /dev/null
@@ -1,12 +0,0 @@
-
-"jank","next_jank","prev_jank","gesture_begin_ts","gesture_end_ts","ts","dur","event_type","next_ts","next_dur","prev_ts","prev_dur"
-1,0,1,3107579952792897,3107581649376897,3107580143766897,35454000,"INERTIAL_GESTURE_SCROLL_UPDATE",3107580152108897,35464000,3107580135417897,27100000
-1,1,0,3107578477792897,3107579903554897,3107578535792897,39440000,"GESTURE_SCROLL_UPDATE",3107578556443897,27153000,3107578527792897,39081000
-1,0,1,3107578477792897,3107579903554897,3107579191373897,35485000,"INERTIAL_GESTURE_SCROLL_UPDATE",3107579199700897,35521000,3107579183046897,27103000
-1,0,1,3107578477792897,3107579903554897,3107579600751897,43838000,"INERTIAL_GESTURE_SCROLL_UPDATE",3107579609175897,43757000,3107579592394897,35480000
-0,0,0,3107579952792897,3107581649376897,3107579952792897,25970000,"FIRST_GESTURE_SCROLL_UPDATE",3107579956792897,30333000,"[NULL]","[NULL]"
-0,0,0,3107579952792897,3107581649376897,3107579956792897,30333000,"GESTURE_SCROLL_UPDATE",3107579968792897,26657000,3107579952792897,25970000
-0,0,0,3107579952792897,3107581649376897,3107579968792897,26657000,"GESTURE_SCROLL_UPDATE",3107579976792897,27003000,3107579956792897,30333000
-0,0,0,3107579952792897,3107581649376897,3107579976792897,27003000,"GESTURE_SCROLL_UPDATE",3107579985792897,26361000,3107579968792897,26657000
-0,0,0,3107579952792897,3107581649376897,3107579985792897,26361000,"GESTURE_SCROLL_UPDATE",3107579993792897,26709000,3107579976792897,27003000
-0,0,0,3107579952792897,3107581649376897,3107579993792897,26709000,"GESTURE_SCROLL_UPDATE",3107579998792897,30183000,3107579985792897,26361000
diff --git a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank_cause.out b/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank_cause.out
deleted file mode 100644
index 6fc5c2f..0000000
--- a/test/trace_processor/diff_tests/chrome/event_latency_scroll_jank_cause.out
+++ /dev/null
@@ -1,6 +0,0 @@
-
-"dur","ts","event_type","next_jank","prev_jank","next_delta_dur_ns","prev_delta_dur_ns","cause_of_jank","max_delta_dur_ns","sub_cause_of_jank"
-39440000,3107578535792897,"GESTURE_SCROLL_UPDATE",1,0,9233000,"[NULL]","SubmitCompositorFrameToPresentationCompositorFrame",9233000,"BufferReadyToLatch"
-35485000,3107579191373897,"INERTIAL_GESTURE_SCROLL_UPDATE",0,1,"[NULL]",7445000,"SubmitCompositorFrameToPresentationCompositorFrame",7445000,"BufferReadyToLatch"
-43838000,3107579600751897,"INERTIAL_GESTURE_SCROLL_UPDATE",0,1,"[NULL]",8059000,"SubmitCompositorFrameToPresentationCompositorFrame",8059000,"BufferReadyToLatch"
-35454000,3107580143766897,"INERTIAL_GESTURE_SCROLL_UPDATE",0,1,"[NULL]",7219000,"SubmitCompositorFrameToPresentationCompositorFrame",7219000,"StartDrawToSwapStart"
diff --git a/test/trace_processor/diff_tests/chrome/event_latency_to_breakdowns.out b/test/trace_processor/diff_tests/chrome/event_latency_to_breakdowns.out
deleted file mode 100644
index 099e02b..0000000
--- a/test/trace_processor/diff_tests/chrome/event_latency_to_breakdowns.out
+++ /dev/null
@@ -1,32 +0,0 @@
-
-"event_latency_ts","event_latency_dur","event_type","GenerationToRendererCompositorNs","GenerationToBrowserMainNs","BrowserMainToRendererCompositorNs","RendererCompositorQueueingDelayNs","unknown_stages_seen"
-3107578415792897,17551000,"TOUCH_PRESSED",7945000,"[NULL]","[NULL]",108000,"[NULL]"
-3107578415792897,20411000,"GESTURE_TAP_DOWN",9648000,"[NULL]","[NULL]",33000,"[NULL]"
-3107578418792897,6034000,"TOUCH_MOVED",5803000,"[NULL]","[NULL]",34000,"[NULL]"
-3107578423792897,6439000,"TOUCH_MOVED",6192000,"[NULL]","[NULL]",82000,"[NULL]"
-3107578427792897,4318000,"TOUCH_MOVED",4189000,"[NULL]","[NULL]",34000,"[NULL]"
-3107578431792897,5754000,"TOUCH_MOVED",5407000,"[NULL]","[NULL]",87000,"[NULL]"
-3107578435792897,3983000,"TOUCH_MOVED",3857000,"[NULL]","[NULL]",28000,"[NULL]"
-3107578439792897,4734000,"TOUCH_MOVED",4550000,"[NULL]","[NULL]",57000,"[NULL]"
-3107578448792897,4346000,"TOUCH_MOVED",4085000,"[NULL]","[NULL]",79000,"[NULL]"
-3107578452792897,3863000,"TOUCH_MOVED",3702000,"[NULL]","[NULL]",36000,"[NULL]"
-3107578456792897,4743000,"TOUCH_MOVED",4579000,"[NULL]","[NULL]",50000,"[NULL]"
-3107578460792897,4516000,"TOUCH_MOVED",4389000,"[NULL]","[NULL]",32000,"[NULL]"
-3107578464792897,4709000,"TOUCH_MOVED",4525000,"[NULL]","[NULL]",62000,"[NULL]"
-3107578468792897,4876000,"TOUCH_MOVED",4751000,"[NULL]","[NULL]",31000,"[NULL]"
-3107578473792897,3960000,"TOUCH_MOVED",3792000,"[NULL]","[NULL]",53000,"[NULL]"
-3107578477792897,26678000,"GESTURE_TAP_CANCEL",5674000,"[NULL]","[NULL]",51000,"[NULL]"
-3107578477792897,3956000,"TOUCH_MOVED",3793000,"[NULL]","[NULL]",36000,"[NULL]"
-3107578477792897,6671000,"GESTURE_SCROLL_BEGIN","[NULL]",5477000,871000,24000,"[NULL]"
-3107578477792897,30595000,"FIRST_GESTURE_SCROLL_UPDATE","[NULL]",6101000,1077000,5608000,"[NULL]"
-3107578481792897,5625000,"TOUCH_MOVED",5463000,"[NULL]","[NULL]",45000,"[NULL]"
-3107578481792897,8937000,"GESTURE_SCROLL_UPDATE","[NULL]",5903000,455000,2428000,"[NULL]"
-3107578483992897,3438000,"TOUCH_PRESSED",788000,"[NULL]","[NULL]",14000,"[NULL]"
-3107578485792897,4373000,"TOUCH_MOVED",4213000,"[NULL]","[NULL]",45000,"[NULL]"
-3107578485792897,30948000,"GESTURE_SCROLL_UPDATE","[NULL]",5302000,979000,7100000,"[NULL]"
-3107578489792897,5294000,"TOUCH_MOVED",5191000,"[NULL]","[NULL]",53000,"[NULL]"
-3107578489792897,9525000,"GESTURE_SCROLL_UPDATE","[NULL]",5045000,454000,3882000,"[NULL]"
-3107578494792897,3912000,"TOUCH_MOVED",3821000,"[NULL]","[NULL]",41000,"[NULL]"
-3107578494792897,30309000,"GESTURE_SCROLL_UPDATE","[NULL]",3671000,1262000,7674000,"[NULL]"
-3107578498792897,7457000,"TOUCH_MOVED",7359000,"[NULL]","[NULL]",47000,"[NULL]"
-3107578498792897,8728000,"GESTURE_SCROLL_UPDATE","[NULL]",3560000,4430000,617000,"[NULL]"
diff --git a/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out b/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out
index e539208..f3d91cd 100644
--- a/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out
+++ b/test/trace_processor/diff_tests/chrome/scroll_jank_v3.out
@@ -1,4 +1,4 @@
"cause_of_jank","sub_cause_of_jank","delay_since_last_frame","vsync_interval"
-"[NULL]","[NULL]",33.462000,16.368000
+"RendererCompositorQueueingDelay","[NULL]",33.462000,16.368000
"RendererCompositorFinishedToBeginImplFrame","[NULL]",100.274000,16.368000
"RendererCompositorQueueingDelay","[NULL]",33.404000,16.368000
diff --git a/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py b/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py
index 8e88fc5..8f7aebc 100644
--- a/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py
+++ b/test/trace_processor/diff_tests/chrome/tests_scroll_jank.py
@@ -44,27 +44,6 @@
""",
out=Path('scroll_jank.out'))
- def test_event_latency_to_breakdowns(self):
- return DiffTestBlueprint(
- trace=DataPath('event_latency_with_args.perfetto-trace'),
- query="""
- SELECT IMPORT('chrome.scroll_jank.event_latency_to_breakdowns');
-
- SELECT
- event_latency_ts,
- event_latency_dur,
- event_type,
- GenerationToRendererCompositorNs,
- GenerationToBrowserMainNs,
- BrowserMainToRendererCompositorNs,
- RendererCompositorQueueingDelayNs,
- unknown_stages_seen
- FROM chrome_event_latency_to_breakdowns
- ORDER BY event_latency_id
- LIMIT 30;
- """,
- out=Path('event_latency_to_breakdowns.out'))
-
def test_chrome_frames_with_missed_vsyncs(self):
return DiffTestBlueprint(
trace=DataPath('chrome_input_with_frame_view.pftrace'),
@@ -92,53 +71,6 @@
""",
out=Path('scroll_jank_v3_percentage.out'))
- def test_event_latency_scroll_jank(self):
- return DiffTestBlueprint(
- trace=DataPath('event_latency_with_args.perfetto-trace'),
- query="""
- SELECT IMPORT('chrome.scroll_jank.event_latency_scroll_jank');
-
- SELECT
- jank,
- next_jank,
- prev_jank,
- gesture_begin_ts,
- gesture_end_ts,
- ts,
- dur,
- event_type,
- next_ts,
- next_dur,
- prev_ts,
- prev_dur
- FROM chrome_scroll_event_latency_jank
- ORDER BY jank DESC
- LIMIT 10;
- """,
- out=Path('event_latency_scroll_jank.out'))
-
- def test_event_latency_scroll_jank_cause(self):
- return DiffTestBlueprint(
- trace=DataPath('event_latency_with_args.perfetto-trace'),
- query="""
- SELECT IMPORT('chrome.scroll_jank.event_latency_scroll_jank_cause');
-
- SELECT
- dur,
- ts,
- event_type,
- next_jank,
- prev_jank,
- next_delta_dur_ns,
- prev_delta_dur_ns,
- cause_of_jank,
- max_delta_dur_ns,
- sub_cause_of_jank
- FROM chrome_event_latency_scroll_jank_cause
- ORDER by ts;
- """,
- out=Path('event_latency_scroll_jank_cause.out'))
-
def test_scroll_flow_event(self):
return DiffTestBlueprint(
trace=DataPath('chrome_scroll_without_vsync.pftrace'),
@@ -193,34 +125,6 @@
""",
out=Path('scroll_flow_event_general_validation.out'))
- def test_scroll_jank_cause(self):
- return DiffTestBlueprint(
- trace=DataPath('chrome_scroll_without_vsync.pftrace'),
- query="""
- SELECT RUN_METRIC('chrome/scroll_jank_cause.sql');
-
- SELECT
- COUNT(*) AS total,
- SUM(jank) AS total_jank,
- SUM(explained_jank + unexplained_jank) AS sum_explained_and_unexplained,
- SUM(
- CASE WHEN explained_jank THEN
- unexplained_jank
- ELSE
- CASE WHEN jank AND NOT unexplained_jank THEN
- 1
- ELSE
- 0
- END
- END
- ) AS error_rows
- FROM scroll_jank_cause;
- """,
- out=Csv("""
- "total","total_jank","sum_explained_and_unexplained","error_rows"
- 139,7,7,0
- """))
-
def test_scroll_flow_event_queuing_delay(self):
return DiffTestBlueprint(
trace=DataPath('chrome_scroll_without_vsync.pftrace'),
@@ -589,76 +493,6 @@
3,120000000,70000000
"""))
- def test_chrome_scroll_jank_v2_with_sub_cause(self):
- return DiffTestBlueprint(
- trace=DataPath('event_latency_with_args.perfetto-trace'),
- query=Metric('chrome_scroll_jank_v2'),
- out=TextProto(r"""
- [perfetto.protos.chrome_scroll_jank_v2] {
- scroll_processing_ms: 12374.56
- scroll_jank_processing_ms: 154.217
- scroll_jank_percentage: 1.2462422906349802
- num_scroll_janks: 4
- scroll_jank_causes_and_durations {
- cause: "SubmitCompositorFrameToPresentationCompositorFrame"
- sub_cause: "BufferReadyToLatch"
- duration_ms: 39.44
- }
- scroll_jank_causes_and_durations {
- cause: "SubmitCompositorFrameToPresentationCompositorFrame"
- sub_cause: "BufferReadyToLatch"
- duration_ms: 35.485
- }
- scroll_jank_causes_and_durations {
- cause: "SubmitCompositorFrameToPresentationCompositorFrame"
- sub_cause: "BufferReadyToLatch"
- duration_ms: 43.838
- }
- scroll_jank_causes_and_durations {
- cause: "SubmitCompositorFrameToPresentationCompositorFrame"
- sub_cause: "StartDrawToSwapStart"
- duration_ms: 35.454
- }
- }
- """))
-
- def test_chrome_scroll_jank_v2_without_sub_cause(self):
- return DiffTestBlueprint(
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query=Metric('chrome_scroll_jank_v2'),
- out=TextProto(r"""
- [perfetto.protos.chrome_scroll_jank_v2] {
- scroll_processing_ms: 14434.053
- scroll_jank_processing_ms: 550.359
- scroll_jank_percentage: 3.8129207368159173
- num_scroll_janks: 6
- scroll_jank_causes_and_durations {
- cause: "BrowserMainToRendererCompositor"
- duration_ms: 60.05
- }
- scroll_jank_causes_and_durations {
- cause: "RendererCompositorFinishedToBeginImplFrame"
- duration_ms: 131.289
- }
- scroll_jank_causes_and_durations {
- cause: "RendererCompositorFinishedToBeginImplFrame"
- duration_ms: 115.174
- }
- scroll_jank_causes_and_durations {
- cause: "RendererCompositorFinishedToBeginImplFrame"
- duration_ms: 99.18
- }
- scroll_jank_causes_and_durations {
- cause: "RendererCompositorFinishedToBeginImplFrame"
- duration_ms: 83.038
- }
- scroll_jank_causes_and_durations {
- cause: "RendererCompositorFinishedToBeginImplFrame"
- duration_ms: 61.628
- }
- }
- """))
-
def test_chrome_scroll_jank_v3(self):
return DiffTestBlueprint(
trace=DataPath('chrome_input_with_frame_view.pftrace'),
@@ -675,6 +509,7 @@
scroll_jank_percentage: 1.9047619047619047
max_delay_since_last_frame: 6.126221896383187
scroll_jank_causes {
+ cause: "RendererCompositorQueueingDelay"
delay_since_last_frame: 2.044354838709678
}
scroll_jank_causes {
diff --git a/ui/src/common/plugins.ts b/ui/src/common/plugins.ts
index 91f9f16..d9d5b77 100644
--- a/ui/src/common/plugins.ts
+++ b/ui/src/common/plugins.ts
@@ -296,6 +296,12 @@
});
}
+ // Look up track into for a given track's URI.
+ // Returns |undefined| if no track can be found.
+ resolveTrackInfo(uri: string): PluginTrackInfo|undefined {
+ return this.trackRegistry.get(uri);
+ }
+
// Create a new plugin track object from its ID.
// Returns undefined if no such track is registered.
createTrack(id: string): TrackLike|undefined {
diff --git a/ui/src/frontend/analytics.ts b/ui/src/frontend/analytics.ts
index 1e298ae..2e3fc95 100644
--- a/ui/src/frontend/analytics.ts
+++ b/ui/src/frontend/analytics.ts
@@ -16,10 +16,9 @@
import {VERSION} from '../gen/perfetto_version';
import {globals} from './globals';
-import {Router} from './router';
type TraceCategories = 'Trace Actions'|'Record Trace'|'User Actions';
-const ANALYTICS_ID = 'UA-137828855-1';
+const ANALYTICS_ID = 'G-BD89KT2P3C';
const PAGE_TITLE = 'no-page-title';
export function initAnalytics() {
@@ -90,7 +89,7 @@
script.src = 'https://www.googletagmanager.com/gtag/js?id=' + ANALYTICS_ID;
script.defer = true;
document.head.appendChild(script);
- const route = Router.parseUrl(window.location.href).page || '/';
+ const route = window.location.href;
console.log(
`GA initialized. route=${route}`,
`isInternalUser=${globals.isInternalUser}`);
@@ -100,13 +99,13 @@
gtagGlobals.gtag('config', ANALYTICS_ID, {
allow_google_signals: false,
anonymize_ip: true,
- page_path: route,
+ page_location: route,
referrer: document.referrer.split('?')[0],
send_page_view: false,
page_title: PAGE_TITLE,
- dimension1: globals.isInternalUser ? '1' : '0',
- dimension2: VERSION,
- dimension3: getCurrentChannel(),
+ perfetto_is_internal_user: globals.isInternalUser ? '1' : '0',
+ perfetto_version: VERSION,
+ perfetto_channel: getCurrentChannel(),
});
this.updatePath(route);
}
diff --git a/ui/src/frontend/app.ts b/ui/src/frontend/app.ts
index b8ac43c..a1a8da7 100644
--- a/ui/src/frontend/app.ts
+++ b/ui/src/frontend/app.ts
@@ -28,6 +28,7 @@
TimeSpan,
} from '../base/time';
import {Actions} from '../common/actions';
+import {pluginManager} from '../common/plugins';
import {setTimestampFormat, TimestampFormat} from '../common/timestamp_format';
import {raf} from '../core/raf_scheduler';
import {Command} from '../public';
@@ -304,6 +305,34 @@
}
},
},
+ {
+ id: 'perfetto.PrintTrackInfoToConsole',
+ name: 'Print track info to console',
+ callback:
+ async () => {
+ const tracks = Array.from(pluginManager.trackRegistry.values());
+ const options = tracks.map(({uri}): PromptOption => {
+ return {key: uri, displayName: uri};
+ });
+
+ // Sort tracks in a natural sort order
+ const collator = new Intl.Collator('en', {
+ numeric: true,
+ sensitivity: 'base',
+ });
+ const sortedOptions = options.sort((a, b) => {
+ return collator.compare(a.displayName, b.displayName);
+ });
+
+ try {
+ const uri = await this.prompt('Choose a track...', sortedOptions);
+ const trackDetails = pluginManager.resolveTrackInfo(uri);
+ console.log(trackDetails);
+ } catch {
+ // Prompt was probably cancelled - do nothing.
+ }
+ },
+ },
];
commands() {
diff --git a/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts b/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts
index 299efdb..65f03ef 100644
--- a/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts
+++ b/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_details_panel.ts
@@ -190,7 +190,7 @@
const queryResult = await this.engine.query(`
SELECT
COUNT(*) AS jankyFrames
- FROM chrome_janky_frame_info_with_delay
+ FROM chrome_frame_info_with_delay
WHERE delay_since_last_frame >
(
SELECT
diff --git a/ui/src/tracks/ftrace/index.ts b/ui/src/tracks/ftrace/index.ts
index 5a576a5..124696e 100644
--- a/ui/src/tracks/ftrace/index.ts
+++ b/ui/src/tracks/ftrace/index.ts
@@ -12,20 +12,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import {Vnode} from 'mithril';
-
import {duration, Time, time} from '../../base/time';
+import {BasicAsyncTrack} from '../../common/basic_async_track';
import {colorForString} from '../../common/colorizer';
import {LONG, NUM, STR} from '../../common/query_result';
-import {
- TrackAdapter,
- TrackControllerAdapter,
- TrackWithControllerAdapter,
-} from '../../common/track_adapter';
import {LIMIT, TrackData} from '../../common/track_data';
import {checkerboardExcept} from '../../frontend/checkerboard';
import {globals} from '../../frontend/globals';
-import {NewTrackArgs} from '../../frontend/track';
import {
EngineProxy,
Plugin,
@@ -44,23 +37,26 @@
cpu?: number;
}
-export const FTRACE_RAW_TRACK_KIND = 'FtraceRawTrack';
-
const MARGIN = 2;
const RECT_HEIGHT = 18;
const TRACK_HEIGHT = (RECT_HEIGHT) + (2 * MARGIN);
-class FtraceRawTrackController extends TrackControllerAdapter<Config, Data> {
- static readonly kind = FTRACE_RAW_TRACK_KIND;
+class FtraceRawTrack extends BasicAsyncTrack<Data> {
+ constructor(private engine: EngineProxy, private cpu: number) {
+ super();
+ }
+
+ getHeight(): number {
+ return TRACK_HEIGHT;
+ }
async onBoundsChange(start: time, end: time, resolution: duration):
Promise<Data> {
const excludeList = Array.from(globals.state.ftraceFilter.excludedNames);
const excludeListSql = excludeList.map((s) => `'${s}'`).join(',');
- const cpuFilter =
- this.config.cpu === undefined ? '' : `and cpu = ${this.config.cpu}`;
+ const cpuFilter = this.cpu === undefined ? '' : `and cpu = ${this.cpu}`;
- const queryRes = await this.query(`
+ const queryRes = await this.engine.query(`
select
cast(ts / ${resolution} as integer) * ${resolution} as tsQuant,
type,
@@ -91,21 +87,6 @@
}
return result;
}
-}
-
-export class FtraceRawTrack extends TrackAdapter<Config, Data> {
- static readonly kind = FTRACE_RAW_TRACK_KIND;
- constructor(args: NewTrackArgs) {
- super(args);
- }
-
- static create(args: NewTrackArgs): FtraceRawTrack {
- return new FtraceRawTrack(args);
- }
-
- getHeight(): number {
- return TRACK_HEIGHT;
- }
renderCanvas(ctx: CanvasRenderingContext2D): void {
const {
@@ -113,7 +94,7 @@
windowSpan,
} = globals.frontendLocalState;
- const data = this.data();
+ const data = this.data;
if (data === undefined) return; // Can't possibly draw anything.
@@ -152,10 +133,6 @@
ctx.restore();
}
}
-
- getContextMenu(): Vnode<any, {}>|null {
- return null;
- }
}
class FtraceRawPlugin implements Plugin {
@@ -165,18 +142,12 @@
const cpus = await this.lookupCpuCores(ctx.engine);
for (const cpuNum of cpus) {
const uri = `perfetto.FtraceRaw#cpu${cpuNum}`;
- const config: Config = {cpu: cpuNum};
ctx.addTrack({
uri,
displayName: `Ftrace Track for CPU ${cpuNum}`,
trackFactory: () => {
- return new TrackWithControllerAdapter<Config, Data>(
- ctx.engine,
- uri,
- config,
- FtraceRawTrack,
- FtraceRawTrackController);
+ return new FtraceRawTrack(ctx.engine, cpuNum);
},
});
}