• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1SELECT RUN_METRIC('android/android_hwui_metric.sql');
2
3CREATE VIEW dequeue_buffer AS
4SELECT
5  count(*) as dequeue_buffer_count,
6  max(dur) as dequeue_buffer_max,
7  min(dur) as dequeue_buffer_min,
8  avg(dur) as dequeue_buffer_avg,
9  sum(dur) as dequeue_buffer_sum,
10  thread_track.utid as render_thread_id
11FROM slice
12INNER JOIN thread_track ON (thread_track.id = slice.track_id)
13WHERE slice.name='dequeueBuffer' AND slice.dur >= 0
14GROUP BY thread_track.utid;
15
16-- limit test results starting from second frame to 7 seconds after that
17CREATE VIEW test_start_ts AS
18SELECT
19  ts as test_start,
20  ts + 7000000000 as test_end,
21  thread.upid as process_upid
22FROM slice
23INNER JOIN thread_track ON (thread_track.id = slice.track_id)
24INNER JOIN thread ON (thread.utid = thread_track.utid)
25WHERE slice.name='DrawFrame' AND slice.dur >= 0
26ORDER BY slice.ts
27LIMIT 1 OFFSET 1;
28-- increase the offset if want to start from more than second frame
29
30CREATE VIEW startup_time AS
31SELECT
32  min(ts) as first_draw_frame,
33  test_start_ts.test_start as second_draw_frame,
34  test_start_ts.test_start - min(ts) as start_time,
35  thread_track.utid as render_thread_id
36FROM slice
37INNER JOIN thread_track ON (thread_track.id = slice.track_id)
38INNER JOIN thread ON (thread.utid = thread_track.utid)
39INNER JOIN test_start_ts ON (test_start_ts.process_upid = thread.upid)
40WHERE slice.name='setSurface' AND slice.dur >= 0
41GROUP BY thread_track.utid;
42
43CREATE VIEW hwui_draw_frame2 AS
44SELECT
45  count(*) as draw_frame_count,
46  max(dur) as draw_frame_max,
47  min(dur) as draw_frame_min,
48  avg(dur) as draw_frame_avg,
49  thread_track.utid as render_thread_id
50FROM slice
51INNER JOIN thread_track ON (thread_track.id = slice.track_id)
52INNER JOIN thread ON (thread.utid = thread_track.utid)
53INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
54WHERE slice.name='DrawFrame' AND slice.dur >= 0
55GROUP BY thread_track.utid;
56
57CREATE VIEW skottie_animator AS
58SELECT
59  count(*) as skottie_animator_count,
60  max(dur) as skottie_animator_max,
61  min(dur) as skottie_animator_min,
62  avg(dur) as skottie_animator_avg,
63  sum(dur) as skottie_animator_sum,
64  thread.upid as process_upid
65FROM slice
66INNER JOIN thread_track ON (thread_track.id = slice.track_id)
67INNER JOIN thread ON (thread.name='SkottieAnimator' AND thread.utid = thread_track.utid)
68INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
69WHERE slice.name='Choreographer#doFrame' AND slice.dur >= 0
70GROUP BY thread_track.utid;
71
72CREATE VIEW total_cpu_time AS
73SELECT
74  sum(sched_slice.dur) as cpu_time,
75  thread.upid as process_upid
76FROM sched_slice
77INNER JOIN process ON (process.upid = thread.upid)
78INNER JOIN thread ON (
79                      (thread.name LIKE 'hwuiTask%' OR thread.name=substr(process.name,-15) OR thread.name LIKE '%skottie' OR thread.name='RenderThread' OR thread.name='SkottieAnimator')
80                      AND thread.utid = sched_slice.utid
81                     )
82INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
83WHERE sched_slice.dur >= 0
84GROUP BY thread.upid;
85
86CREATE VIEW cpu_time_rt_hwui_tasks AS
87SELECT
88  sum(sched_slice.dur) as cpu_time,
89  thread.upid as process_upid
90FROM sched_slice
91INNER JOIN thread ON (thread.name LIKE 'hwuiTask%' AND thread.utid = sched_slice.utid)
92INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
93WHERE sched_slice.dur >= 0
94GROUP BY thread.upid;
95
96CREATE VIEW cpu_time_ui_thread AS
97SELECT
98  sum(sched_slice.dur) as cpu_time,
99  thread.upid as process_upid
100FROM sched_slice
101INNER JOIN process ON (process.upid = thread.upid)
102INNER JOIN thread ON ((thread.name=substr(process.name,-15) OR thread.name LIKE '%skottie') AND thread.utid = sched_slice.utid)
103INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
104WHERE sched_slice.dur >= 0
105GROUP BY thread.upid;
106
107CREATE VIEW cpu_time_rt AS
108SELECT
109  sum(sched_slice.dur) as cpu_time,
110  thread.upid as process_upid
111FROM sched_slice
112INNER JOIN thread ON (thread.name='RenderThread' AND thread.utid = sched_slice.utid)
113INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
114WHERE sched_slice.dur >= 0
115GROUP BY thread.upid;
116
117CREATE VIEW cpu_time_skottie_animator AS
118SELECT
119  sum(sched_slice.dur) as cpu_time,
120  thread.upid as process_upid
121FROM sched_slice
122INNER JOIN thread ON (thread.name='SkottieAnimator' AND thread.utid = sched_slice.utid)
123INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
124WHERE sched_slice.dur >= 0
125GROUP BY thread.upid;
126
127CREATE VIEW hwui_gpu_completion2 AS
128SELECT
129  count(*) as gpu_completion_count,
130  max(dur) as gpu_completion_max,
131  min(dur) as gpu_completion_min,
132  avg(dur) as gpu_completion_avg,
133  sum(dur) as gpu_completion_sum,
134  thread.upid as process_upid
135FROM slice
136INNER JOIN thread_track ON (thread_track.id = slice.track_id)
137INNER JOIN thread ON (thread.name='GPU completion' AND thread.utid = thread_track.utid)
138INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
139WHERE slice.name LIKE 'waiting for GPU completion%' AND slice.dur >= 0
140GROUP BY thread_track.utid;
141
142CREATE VIEW hwui_gpu_completion3 AS
143SELECT
144  sum(dur) as gpu_completion_sum,
145  thread.upid as process_upid
146FROM slice
147INNER JOIN thread_track ON (thread_track.id = slice.track_id)
148INNER JOIN thread ON (thread.utid = thread_track.utid)
149INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
150WHERE slice.name LIKE 'waiting for frame%' AND slice.dur >= 0
151GROUP BY thread_track.utid;
152
153CREATE VIEW skottie_metric_output AS
154SELECT SkottieMetric(
155  'process_info', (
156    SELECT RepeatedField(
157      ProcessRenderInfoEx(
158        'hwui_process_info',
159        ProcessRenderInfo(
160            'process_name', process_name,
161            'rt_cpu_time_ms', rt_cpu_time_ms,
162
163            'draw_frame_count', hwui_draw_frame2.draw_frame_count,
164            'draw_frame_max', hwui_draw_frame2.draw_frame_max,
165            'draw_frame_min', hwui_draw_frame2.draw_frame_min,
166            'draw_frame_avg', hwui_draw_frame2.draw_frame_avg,
167
168            'flush_count', hwui_flush_commands.flush_count,
169            'flush_max', hwui_flush_commands.flush_max,
170            'flush_min', hwui_flush_commands.flush_min,
171            'flush_avg', hwui_flush_commands.flush_avg,
172
173            'prepare_tree_count', hwui_prepare_tree.prepare_tree_count,
174            'prepare_tree_max', hwui_prepare_tree.prepare_tree_max,
175            'prepare_tree_min', hwui_prepare_tree.prepare_tree_min,
176            'prepare_tree_avg', hwui_prepare_tree.prepare_tree_avg,
177
178            'gpu_completion_count', hwui_gpu_completion2.gpu_completion_count,
179            'gpu_completion_max', hwui_gpu_completion2.gpu_completion_max,
180            'gpu_completion_min', hwui_gpu_completion2.gpu_completion_min,
181            'gpu_completion_avg', hwui_gpu_completion2.gpu_completion_avg,
182
183            'ui_record_count', hwui_ui_record.ui_record_count,
184            'ui_record_max', hwui_ui_record.ui_record_max,
185            'ui_record_min', hwui_ui_record.ui_record_min,
186            'ui_record_avg', hwui_ui_record.ui_record_avg,
187
188            'shader_compile_count', hwui_shader_compile.shader_compile_count,
189            'shader_compile_time', hwui_shader_compile.shader_compile_time,
190            'shader_compile_avg', hwui_shader_compile.shader_compile_avg,
191
192            'cache_hit_count', hwui_cache_hit.cache_hit_count,
193            'cache_hit_time', hwui_cache_hit.cache_hit_time,
194            'cache_hit_avg', hwui_cache_hit.cache_hit_avg,
195
196            'cache_miss_count', hwui_cache_miss.cache_miss_count,
197            'cache_miss_time', hwui_cache_miss.cache_miss_time,
198            'cache_miss_avg', hwui_cache_miss.cache_miss_avg,
199
200            'graphics_cpu_mem_max', CAST(hwui_graphics_cpu_mem.graphics_cpu_mem_max as INT64),
201            'graphics_cpu_mem_min', CAST(hwui_graphics_cpu_mem.graphics_cpu_mem_min as INT64),
202            'graphics_cpu_mem_avg', hwui_graphics_cpu_mem.graphics_cpu_mem_avg,
203
204            'graphics_gpu_mem_max', CAST(hwui_graphics_gpu_mem.graphics_gpu_mem_max as INT64),
205            'graphics_gpu_mem_min', CAST(hwui_graphics_gpu_mem.graphics_gpu_mem_min as INT64),
206            'graphics_gpu_mem_avg', hwui_graphics_gpu_mem.graphics_gpu_mem_avg,
207
208            'texture_mem_max', CAST(hwui_texture_mem.texture_mem_max as INT64),
209            'texture_mem_min', CAST(hwui_texture_mem.texture_mem_min as INT64),
210            'texture_mem_avg', hwui_texture_mem.texture_mem_avg,
211
212            'all_mem_max', CAST(hwui_all_mem.all_mem_max as INT64),
213            'all_mem_min', CAST(hwui_all_mem.all_mem_min as INT64),
214            'all_mem_avg', hwui_all_mem.all_mem_avg
215        ),
216        'skottie_animator_count', ifnull(skottie_animator.skottie_animator_count, 0),
217        'skottie_animator_max', ifnull(skottie_animator.skottie_animator_max, 0),
218        'skottie_animator_min', ifnull(skottie_animator.skottie_animator_min, 0),
219        'skottie_animator_avg', ifnull(skottie_animator.skottie_animator_avg, 0.0),
220
221        'dequeue_buffer_count', dequeue_buffer.dequeue_buffer_count,
222        'dequeue_buffer_max', dequeue_buffer.dequeue_buffer_max,
223        'dequeue_buffer_min', dequeue_buffer.dequeue_buffer_min,
224        'dequeue_buffer_avg', dequeue_buffer.dequeue_buffer_avg,
225
226        'render_time_avg', ifnull(skottie_animator.skottie_animator_avg, 0.0) + hwui_draw_frame2.draw_frame_avg,
227        'render_time_avg_no_dequeue', ifnull(skottie_animator.skottie_animator_avg, 0.0) + hwui_draw_frame2.draw_frame_avg - ifnull(dequeue_buffer.dequeue_buffer_avg, 0.0),
228
229        'ui_thread_cpu_time', ifnull(cpu_time_ui_thread.cpu_time, 0),
230        'rt_thread_cpu_time', ifnull(cpu_time_rt.cpu_time, 0),
231        'hwui_tasks_cpu_time', ifnull(cpu_time_rt_hwui_tasks.cpu_time, 0),
232        'skottie_animator_cpu_time', ifnull(cpu_time_skottie_animator.cpu_time, 0),
233
234        'total_cpu_time', ifnull(total_cpu_time.cpu_time, 0),
235        'total_gpu_time', ifnull(hwui_gpu_completion3.gpu_completion_sum, 0),
236        'total_time', ifnull(total_cpu_time.cpu_time, 0) + ifnull(hwui_gpu_completion3.gpu_completion_sum, 0),
237
238        'startup_time', startup_time.start_time
239      )
240    )
241    FROM hwui_processes
242    LEFT JOIN hwui_draw_frame2 ON (hwui_draw_frame2.render_thread_id = hwui_processes.render_thread_id)
243    LEFT JOIN hwui_flush_commands ON (hwui_flush_commands.render_thread_id = hwui_processes.render_thread_id)
244    LEFT JOIN hwui_prepare_tree ON (hwui_prepare_tree.render_thread_id = hwui_processes.render_thread_id)
245    LEFT JOIN hwui_gpu_completion2 ON (hwui_gpu_completion2.process_upid = hwui_processes.process_upid)
246    LEFT JOIN hwui_ui_record ON (hwui_ui_record.process_upid = hwui_processes.process_upid)
247    LEFT JOIN hwui_shader_compile ON (hwui_shader_compile.render_thread_id = hwui_processes.render_thread_id)
248    LEFT JOIN hwui_cache_hit ON (hwui_cache_hit.render_thread_id = hwui_processes.render_thread_id)
249    LEFT JOIN hwui_cache_miss ON (hwui_cache_miss.render_thread_id = hwui_processes.render_thread_id)
250    LEFT JOIN hwui_graphics_cpu_mem ON (hwui_graphics_cpu_mem.process_upid = hwui_processes.process_upid)
251    LEFT JOIN hwui_graphics_gpu_mem ON (hwui_graphics_gpu_mem.process_upid = hwui_processes.process_upid)
252    LEFT JOIN hwui_texture_mem ON (hwui_texture_mem.process_upid = hwui_processes.process_upid)
253    LEFT JOIN hwui_all_mem ON (hwui_all_mem.process_upid = hwui_processes.process_upid)
254    LEFT JOIN skottie_animator ON (skottie_animator.process_upid = hwui_processes.process_upid)
255    LEFT JOIN dequeue_buffer ON (dequeue_buffer.render_thread_id = hwui_processes.render_thread_id)
256    LEFT JOIN total_cpu_time ON (total_cpu_time.process_upid = hwui_processes.process_upid)
257    LEFT JOIN cpu_time_rt_hwui_tasks ON (cpu_time_rt_hwui_tasks.process_upid = hwui_processes.process_upid)
258    LEFT JOIN cpu_time_rt ON (cpu_time_rt.process_upid = hwui_processes.process_upid)
259    LEFT JOIN cpu_time_skottie_animator ON (cpu_time_skottie_animator.process_upid = hwui_processes.process_upid)
260    LEFT JOIN cpu_time_ui_thread ON (cpu_time_ui_thread.process_upid = hwui_processes.process_upid)
261    LEFT JOIN hwui_gpu_completion3 ON (hwui_gpu_completion3.process_upid = hwui_processes.process_upid)
262    LEFT JOIN startup_time ON (startup_time.render_thread_id = hwui_processes.render_thread_id)
263    JOIN (SELECT MAX(rt_cpu_time_ms), process_upid AS id FROM hwui_processes) max_render ON hwui_processes.process_upid = max_render.id
264    -- process name is often missing on WearOs/Android P -> instead select process is highest CPU time in RenderThread.
265    -- WHERE hwui_processes.process_name='org.skia.skottie'
266  )
267);
268
269
270