1 SELECT RUN_METRIC('android/android_hwui_metric.sql');
3 CREATE VIEW dequeue_buffer AS
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
12 INNER JOIN thread_track ON (thread_track.id = slice.track_id)
13 WHERE slice.name='dequeueBuffer' AND slice.dur >= 0
14 GROUP BY thread_track.utid;
16 -- limit test results starting from second frame to 7 seconds after that
17 CREATE VIEW test_start_ts AS
20 ts + 7000000000 as test_end,
21 thread.upid as process_upid
23 INNER JOIN thread_track ON (thread_track.id = slice.track_id)
24 INNER JOIN thread ON (thread.utid = thread_track.utid)
25 WHERE slice.name='DrawFrame' AND slice.dur >= 0
28 -- increase the offset if want to start from more than second frame
30 CREATE VIEW startup_time AS
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
37 INNER JOIN thread_track ON (thread_track.id = slice.track_id)
38 INNER JOIN thread ON (thread.utid = thread_track.utid)
39 INNER JOIN test_start_ts ON (test_start_ts.process_upid = thread.upid)
40 WHERE slice.name='setSurface' AND slice.dur >= 0
41 GROUP BY thread_track.utid;
43 CREATE VIEW hwui_draw_frame2 AS
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
51 INNER JOIN thread_track ON (thread_track.id = slice.track_id)
52 INNER JOIN thread ON (thread.utid = thread_track.utid)
53 INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
54 WHERE slice.name='DrawFrame' AND slice.dur >= 0
55 GROUP BY thread_track.utid;
57 CREATE VIEW skottie_animator AS
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
66 INNER JOIN thread_track ON (thread_track.id = slice.track_id)
67 INNER JOIN thread ON (thread.name='SkottieAnimator' AND thread.utid = thread_track.utid)
68 INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
69 WHERE slice.name='Choreographer#doFrame' AND slice.dur >= 0
70 GROUP BY thread_track.utid;
72 CREATE VIEW total_cpu_time AS
74 sum(sched_slice.dur) as cpu_time,
75 thread.upid as process_upid
77 INNER JOIN process ON (process.upid = thread.upid)
78 INNER 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
82 INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
83 WHERE sched_slice.dur >= 0
86 CREATE VIEW cpu_time_rt_hwui_tasks AS
88 sum(sched_slice.dur) as cpu_time,
89 thread.upid as process_upid
91 INNER JOIN thread ON (thread.name LIKE 'hwuiTask%' AND thread.utid = sched_slice.utid)
92 INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
93 WHERE sched_slice.dur >= 0
96 CREATE VIEW cpu_time_ui_thread AS
98 sum(sched_slice.dur) as cpu_time,
99 thread.upid as process_upid
101 INNER JOIN process ON (process.upid = thread.upid)
102 INNER JOIN thread ON ((thread.name=substr(process.name,-15) OR thread.name LIKE '%skottie') AND thread.utid = sched_slice.utid)
103 INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
104 WHERE sched_slice.dur >= 0
105 GROUP BY thread.upid;
107 CREATE VIEW cpu_time_rt AS
109 sum(sched_slice.dur) as cpu_time,
110 thread.upid as process_upid
112 INNER JOIN thread ON (thread.name='RenderThread' AND thread.utid = sched_slice.utid)
113 INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
114 WHERE sched_slice.dur >= 0
115 GROUP BY thread.upid;
117 CREATE VIEW cpu_time_skottie_animator AS
119 sum(sched_slice.dur) as cpu_time,
120 thread.upid as process_upid
122 INNER JOIN thread ON (thread.name='SkottieAnimator' AND thread.utid = sched_slice.utid)
123 INNER JOIN test_start_ts ON (sched_slice.ts >= test_start_ts.test_start AND sched_slice.ts <= test_start_ts.test_end)
124 WHERE sched_slice.dur >= 0
125 GROUP BY thread.upid;
127 CREATE VIEW hwui_gpu_completion2 AS
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
136 INNER JOIN thread_track ON (thread_track.id = slice.track_id)
137 INNER JOIN thread ON (thread.name='GPU completion' AND thread.utid = thread_track.utid)
138 INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
139 WHERE slice.name LIKE 'waiting for GPU completion%' AND slice.dur >= 0
140 GROUP BY thread_track.utid;
142 CREATE VIEW hwui_gpu_completion3 AS
144 sum(dur) as gpu_completion_sum,
145 thread.upid as process_upid
147 INNER JOIN thread_track ON (thread_track.id = slice.track_id)
148 INNER JOIN thread ON (thread.utid = thread_track.utid)
149 INNER JOIN test_start_ts ON (slice.ts >= test_start_ts.test_start AND slice.ts <= test_start_ts.test_end)
150 WHERE slice.name LIKE 'waiting for frame%' AND slice.dur >= 0
151 GROUP BY thread_track.utid;
153 CREATE VIEW skottie_metric_output AS
154 SELECT SkottieMetric(
156 SELECT RepeatedField(
160 'process_name', process_name,
161 'rt_cpu_time_ms', rt_cpu_time_ms,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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
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),
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,
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),
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),
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),
238 'startup_time', startup_time.start_time
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'