Merge "Update trace processor"
diff --git a/src/trace_processor/metrics/chrome/scroll_jank_cause_queuing_delay.sql b/src/trace_processor/metrics/chrome/scroll_jank_cause_queuing_delay.sql
index b6438e2..f0eebb3 100644
--- a/src/trace_processor/metrics/chrome/scroll_jank_cause_queuing_delay.sql
+++ b/src/trace_processor/metrics/chrome/scroll_jank_cause_queuing_delay.sql
@@ -179,9 +179,9 @@
   GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15;
 
 -- Create a common name for each "cause" based on the slice stack we found.
-DROP VIEW IF EXISTS scroll_jank_cause_queuing_delay;
+DROP VIEW IF EXISTS scroll_jank_cause_queuing_delay_temp;
 
-CREATE VIEW scroll_jank_cause_queuing_delay AS
+CREATE VIEW scroll_jank_cause_queuing_delay_temp AS
   SELECT
     'InputLatency.LatencyInfo.Flow.QueuingDelay.' ||
     CASE WHEN jank THEN 'Jank' ELSE 'NoJank' END || '.BlockingTasksUs.' ||
@@ -192,3 +192,29 @@
     END || COALESCE("-" || descendant_name, "") AS metric_name,
     base.*
   FROM descendant_blocking_tasks_queuing_delay base;
+
+-- Figure out the average time taken during non-janky scrolls updates for each
+-- TraceEvent (metric_name) stack.
+DROP VIEW IF EXISTS scroll_jank_cause_queuing_delay_average_time;
+
+CREATE VIEW scroll_jank_cause_queuing_delay_average_no_jank_time AS
+  SELECT
+    metric_name,
+    AVG(dur_overlapping_ns) as avg_dur_overlapping_ns
+  FROM scroll_jank_cause_queuing_delay_temp
+  WHERE NOT jank
+  GROUP BY 1;
+
+-- Join every row (jank and non-jank with the average non-jank time for the given
+-- metric_name).
+DROP VIEW IF EXISTS scroll_jank_cause_queuing_delay;
+
+CREATE VIEW scroll_jank_cause_queuing_delay AS
+  SELECT
+    base.*,
+    COALESCE(avg_no_jank.avg_dur_overlapping_ns, 0)
+        AS avg_no_jank_dur_overlapping_ns
+  FROM
+    scroll_jank_cause_queuing_delay_temp base LEFT JOIN
+    scroll_jank_cause_queuing_delay_average_no_jank_time avg_no_jank ON
+        base.metric_name = avg_no_jank.metric_name;
diff --git a/ui/BUILD.gn b/ui/BUILD.gn
index 28b53bd..0f8cc1f 100644
--- a/ui/BUILD.gn
+++ b/ui/BUILD.gn
@@ -384,6 +384,7 @@
               "src/assets/rec_cpu_freq.png",
               "src/assets/rec_cpu_voltage.png",
               "src/assets/rec_ftrace.png",
+              "src/assets/rec_gpu_mem_total.png",
               "src/assets/rec_java_heap_dump.png",
               "src/assets/rec_lmk.png",
               "src/assets/rec_logcat.png",
diff --git a/ui/src/assets/rec_gpu_mem_total.png b/ui/src/assets/rec_gpu_mem_total.png
new file mode 100644
index 0000000..4b5a44a
--- /dev/null
+++ b/ui/src/assets/rec_gpu_mem_total.png
Binary files differ
diff --git a/ui/src/common/state.ts b/ui/src/common/state.ts
index 24ae0e7..809e8f2 100644
--- a/ui/src/common/state.ts
+++ b/ui/src/common/state.ts
@@ -356,6 +356,7 @@
   screenRecord: boolean;
 
   gpuFreq: boolean;
+  gpuMemTotal: boolean;
 
   ftrace: boolean;
   atrace: boolean;
@@ -415,6 +416,7 @@
     screenRecord: false,
 
     gpuFreq: false,
+    gpuMemTotal: false,
 
     ftrace: false,
     atrace: false,
diff --git a/ui/src/controller/record_controller.ts b/ui/src/controller/record_controller.ts
index 69e9884..8a2e278 100644
--- a/ui/src/controller/record_controller.ts
+++ b/ui/src/controller/record_controller.ts
@@ -138,6 +138,10 @@
     ftraceEvents.add('power/gpu_frequency');
   }
 
+  if (uiCfg.gpuMemTotal) {
+    ftraceEvents.add('gpu_mem/gpu_mem_total');
+  }
+
   if (uiCfg.cpuSyscall) {
     ftraceEvents.add('raw_syscalls/sys_enter');
     ftraceEvents.add('raw_syscalls/sys_exit');
diff --git a/ui/src/frontend/record_page.ts b/ui/src/frontend/record_page.ts
index 0019042..dc25082 100644
--- a/ui/src/frontend/record_page.ts
+++ b/ui/src/frontend/record_page.ts
@@ -214,13 +214,23 @@
 }
 
 function GpuSettings(cssClass: string) {
-  return m(`.record-section${cssClass}`, m(Probe, {
-             title: 'GPU frequency',
-             img: 'rec_cpu_freq.png',
-             descr: 'Records gpu frequency via ftrace',
-             setEnabled: (cfg, val) => cfg.gpuFreq = val,
-             isEnabled: (cfg) => cfg.gpuFreq
-           } as ProbeAttrs));
+  return m(
+      `.record-section${cssClass}`,
+      m(Probe, {
+        title: 'GPU frequency',
+        img: 'rec_cpu_freq.png',
+        descr: 'Records gpu frequency via ftrace',
+        setEnabled: (cfg, val) => cfg.gpuFreq = val,
+        isEnabled: (cfg) => cfg.gpuFreq
+      } as ProbeAttrs),
+      m(Probe, {
+        title: 'GPU memory',
+        img: 'rec_gpu_mem_total.png',
+        descr: `Allows to track per process and global gpu memory total updates
+                via ftrace. (Available on recent Android 11+ kernels)`,
+        setEnabled: (cfg, val) => cfg.gpuMemTotal = val,
+        isEnabled: (cfg) => cfg.gpuMemTotal
+      } as ProbeAttrs));
 }
 
 function CpuSettings(cssClass: string) {