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