1-- 2-- Copyright 2020 The Android Open Source Project 3-- 4-- Licensed under the Apache License, Version 2.0 (the "License"); 5-- you may not use this file except in compliance with the License. 6-- You may obtain a copy of the License at 7-- 8-- https://www.apache.org/licenses/LICENSE-2.0 9-- 10-- Unless required by applicable law or agreed to in writing, software 11-- distributed under the License is distributed on an "AS IS" BASIS, 12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13-- See the License for the specific language governing permissions and 14-- limitations under the License. 15-- 16 17 18-- TOP processes that have a RenderThread, sorted by CPU time on RT 19DROP VIEW IF EXISTS hwui_processes; 20CREATE VIEW hwui_processes AS 21SELECT 22 process.name AS process_name, 23 process.upid AS process_upid, 24 CAST(SUM(sched.dur) / 1e6 AS INT64) AS rt_cpu_time_ms, 25 thread.utid AS render_thread_id 26FROM sched 27JOIN thread ON (thread.utid = sched.utid AND thread.name = 'RenderThread') 28JOIN process ON (process.upid = thread.upid) 29GROUP BY process.name 30ORDER BY rt_cpu_time_ms DESC; 31 32DROP VIEW IF EXISTS hwui_draw_frame; 33CREATE VIEW hwui_draw_frame AS 34SELECT 35 count(*) AS draw_frame_count, 36 max(dur) AS draw_frame_max, 37 min(dur) AS draw_frame_min, 38 avg(dur) AS draw_frame_avg, 39 thread_track.utid AS render_thread_id 40FROM slice 41JOIN thread_track ON (thread_track.id = slice.track_id) 42WHERE slice.name GLOB 'DrawFrame*' AND slice.dur >= 0 43GROUP BY thread_track.utid; 44 45DROP VIEW IF EXISTS hwui_flush_commands; 46CREATE VIEW hwui_flush_commands AS 47SELECT 48 count(*) AS flush_count, 49 max(dur) AS flush_max, 50 min(dur) AS flush_min, 51 avg(dur) AS flush_avg, 52 thread_track.utid AS render_thread_id 53FROM slice 54JOIN thread_track ON (thread_track.id = slice.track_id) 55WHERE slice.name = 'flush commands' AND slice.dur >= 0 56GROUP BY thread_track.utid; 57 58DROP VIEW IF EXISTS hwui_prepare_tree; 59CREATE VIEW hwui_prepare_tree AS 60SELECT 61 count(*) AS prepare_tree_count, 62 max(dur) AS prepare_tree_max, 63 min(dur) AS prepare_tree_min, 64 avg(dur) AS prepare_tree_avg, 65 thread_track.utid AS render_thread_id 66FROM slice 67JOIN thread_track ON (thread_track.id = slice.track_id) 68WHERE slice.name = 'prepareTree' AND slice.dur >= 0 69GROUP BY thread_track.utid; 70 71DROP VIEW IF EXISTS hwui_gpu_completion; 72CREATE VIEW hwui_gpu_completion AS 73SELECT 74 count(*) AS gpu_completion_count, 75 max(dur) AS gpu_completion_max, 76 min(dur) AS gpu_completion_min, 77 avg(dur) AS gpu_completion_avg, 78 thread.upid AS process_upid 79FROM slice 80JOIN thread_track ON (thread_track.id = slice.track_id) 81JOIN thread ON (thread.name = 'GPU completion' AND thread.utid = thread_track.utid) 82WHERE slice.name GLOB 'waiting for GPU completion*' AND slice.dur >= 0 83GROUP BY thread_track.utid; 84 85DROP VIEW IF EXISTS hwui_ui_record; 86CREATE VIEW hwui_ui_record AS 87SELECT 88 count(*) AS ui_record_count, 89 max(dur) AS ui_record_max, 90 min(dur) AS ui_record_min, 91 avg(dur) AS ui_record_avg, 92 thread.upid AS process_upid 93FROM slice 94JOIN thread_track ON (thread_track.id = slice.track_id) 95JOIN thread ON (thread.name = substr(process.name, -15) AND thread.utid = thread_track.utid) 96JOIN process ON (process.upid = thread.upid) 97WHERE slice.name = 'Record View#draw()' AND slice.dur >= 0 98GROUP BY thread_track.utid; 99 100DROP VIEW IF EXISTS hwui_shader_compile; 101CREATE VIEW hwui_shader_compile AS 102SELECT 103 count(*) AS shader_compile_count, 104 sum(dur) AS shader_compile_time, 105 avg(dur) AS shader_compile_avg, 106 thread_track.utid AS render_thread_id 107FROM slice 108JOIN thread_track ON (thread_track.id = slice.track_id) 109WHERE slice.name = 'shader_compile' AND slice.dur >= 0 110GROUP BY thread_track.utid; 111 112DROP VIEW IF EXISTS hwui_cache_hit; 113CREATE VIEW hwui_cache_hit AS 114SELECT 115 count(*) AS cache_hit_count, 116 sum(dur) AS cache_hit_time, 117 avg(dur) AS cache_hit_avg, 118 thread_track.utid AS render_thread_id 119FROM slice 120JOIN thread_track ON (thread_track.id = slice.track_id) 121WHERE slice.name = 'cache_hit' AND slice.dur >= 0 122GROUP BY thread_track.utid; 123 124DROP VIEW IF EXISTS hwui_cache_miss; 125CREATE VIEW hwui_cache_miss AS 126SELECT 127 count(*) AS cache_miss_count, 128 sum(dur) AS cache_miss_time, 129 avg(dur) AS cache_miss_avg, 130 thread_track.utid AS render_thread_id 131FROM slice 132JOIN thread_track ON (thread_track.id = slice.track_id) 133WHERE slice.name = 'cache_miss' AND slice.dur >= 0 134GROUP BY thread_track.utid; 135 136DROP VIEW IF EXISTS hwui_graphics_cpu_mem; 137CREATE VIEW hwui_graphics_cpu_mem AS 138SELECT 139 max(value) AS graphics_cpu_mem_max, 140 min(value) AS graphics_cpu_mem_min, 141 avg(value) AS graphics_cpu_mem_avg, 142 process_counter_track.upid AS process_upid 143FROM counter 144JOIN process_counter_track ON (counter.track_id = process_counter_track.id) 145WHERE name = 'HWUI CPU Memory' AND counter.value >= 0 146GROUP BY process_counter_track.upid; 147 148DROP VIEW IF EXISTS hwui_graphics_gpu_mem; 149CREATE VIEW hwui_graphics_gpu_mem AS 150SELECT 151 max(value) AS graphics_gpu_mem_max, 152 min(value) AS graphics_gpu_mem_min, 153 avg(value) AS graphics_gpu_mem_avg, 154 process_counter_track.upid AS process_upid 155FROM counter 156JOIN process_counter_track ON (counter.track_id = process_counter_track.id) 157WHERE name = 'HWUI Misc Memory' AND counter.value >= 0 158GROUP BY process_counter_track.upid; 159 160DROP VIEW IF EXISTS hwui_texture_mem; 161CREATE VIEW hwui_texture_mem AS 162SELECT 163 max(value) AS texture_mem_max, 164 min(value) AS texture_mem_min, 165 avg(value) AS texture_mem_avg, 166 process_counter_track.upid AS process_upid 167FROM counter 168JOIN process_counter_track ON (counter.track_id = process_counter_track.id) 169WHERE name = 'HWUI Texture Memory' AND counter.value >= 0 170GROUP BY process_counter_track.upid; 171 172DROP VIEW IF EXISTS hwui_all_mem; 173CREATE VIEW hwui_all_mem AS 174SELECT 175 max(value) AS all_mem_max, 176 min(value) AS all_mem_min, 177 avg(value) AS all_mem_avg, 178 process_counter_track.upid AS process_upid 179FROM counter 180JOIN process_counter_track ON (counter.track_id = process_counter_track.id) 181WHERE name = 'HWUI All Memory' AND counter.value >= 0 182GROUP BY process_counter_track.upid; 183 184DROP VIEW IF EXISTS android_hwui_metric_output; 185CREATE VIEW android_hwui_metric_output AS 186SELECT AndroidHwuiMetric( 187 'process_info', ( 188 SELECT RepeatedField( 189 ProcessRenderInfo( 190 'process_name', process_name, 191 'rt_cpu_time_ms', rt_cpu_time_ms, 192 193 'draw_frame_count', hwui_draw_frame.draw_frame_count, 194 'draw_frame_max', hwui_draw_frame.draw_frame_max, 195 'draw_frame_min', hwui_draw_frame.draw_frame_min, 196 'draw_frame_avg', hwui_draw_frame.draw_frame_avg, 197 198 'flush_count', hwui_flush_commands.flush_count, 199 'flush_max', hwui_flush_commands.flush_max, 200 'flush_min', hwui_flush_commands.flush_min, 201 'flush_avg', hwui_flush_commands.flush_avg, 202 203 'prepare_tree_count', hwui_prepare_tree.prepare_tree_count, 204 'prepare_tree_max', hwui_prepare_tree.prepare_tree_max, 205 'prepare_tree_min', hwui_prepare_tree.prepare_tree_min, 206 'prepare_tree_avg', hwui_prepare_tree.prepare_tree_avg, 207 208 'gpu_completion_count', hwui_gpu_completion.gpu_completion_count, 209 'gpu_completion_max', hwui_gpu_completion.gpu_completion_max, 210 'gpu_completion_min', hwui_gpu_completion.gpu_completion_min, 211 'gpu_completion_avg', hwui_gpu_completion.gpu_completion_avg, 212 213 'ui_record_count', hwui_ui_record.ui_record_count, 214 'ui_record_max', hwui_ui_record.ui_record_max, 215 'ui_record_min', hwui_ui_record.ui_record_min, 216 'ui_record_avg', hwui_ui_record.ui_record_avg, 217 218 'shader_compile_count', hwui_shader_compile.shader_compile_count, 219 'shader_compile_time', hwui_shader_compile.shader_compile_time, 220 'shader_compile_avg', hwui_shader_compile.shader_compile_avg, 221 222 'cache_hit_count', hwui_cache_hit.cache_hit_count, 223 'cache_hit_time', hwui_cache_hit.cache_hit_time, 224 'cache_hit_avg', hwui_cache_hit.cache_hit_avg, 225 226 'cache_miss_count', hwui_cache_miss.cache_miss_count, 227 'cache_miss_time', hwui_cache_miss.cache_miss_time, 228 'cache_miss_avg', hwui_cache_miss.cache_miss_avg, 229 230 'graphics_cpu_mem_max', CAST(hwui_graphics_cpu_mem.graphics_cpu_mem_max AS INT64), 231 'graphics_cpu_mem_min', CAST(hwui_graphics_cpu_mem.graphics_cpu_mem_min AS INT64), 232 'graphics_cpu_mem_avg', hwui_graphics_cpu_mem.graphics_cpu_mem_avg, 233 234 'graphics_gpu_mem_max', CAST(hwui_graphics_gpu_mem.graphics_gpu_mem_max AS INT64), 235 'graphics_gpu_mem_min', CAST(hwui_graphics_gpu_mem.graphics_gpu_mem_min AS INT64), 236 'graphics_gpu_mem_avg', hwui_graphics_gpu_mem.graphics_gpu_mem_avg, 237 238 'texture_mem_max', CAST(hwui_texture_mem.texture_mem_max AS INT64), 239 'texture_mem_min', CAST(hwui_texture_mem.texture_mem_min AS INT64), 240 'texture_mem_avg', hwui_texture_mem.texture_mem_avg, 241 242 'all_mem_max', CAST(hwui_all_mem.all_mem_max AS INT64), 243 'all_mem_min', CAST(hwui_all_mem.all_mem_min AS INT64), 244 'all_mem_avg', hwui_all_mem.all_mem_avg 245 ) 246 ) 247 FROM hwui_processes 248 LEFT JOIN hwui_draw_frame ON (hwui_draw_frame.render_thread_id = hwui_processes.render_thread_id) 249 LEFT JOIN hwui_flush_commands ON (hwui_flush_commands.render_thread_id = hwui_processes.render_thread_id) 250 LEFT JOIN hwui_prepare_tree ON (hwui_prepare_tree.render_thread_id = hwui_processes.render_thread_id) 251 LEFT JOIN hwui_gpu_completion ON (hwui_gpu_completion.process_upid = hwui_processes.process_upid) 252 LEFT JOIN hwui_ui_record ON (hwui_ui_record.process_upid = hwui_processes.process_upid) 253 LEFT JOIN hwui_shader_compile ON (hwui_shader_compile.render_thread_id = hwui_processes.render_thread_id) 254 LEFT JOIN hwui_cache_hit ON (hwui_cache_hit.render_thread_id = hwui_processes.render_thread_id) 255 LEFT JOIN hwui_cache_miss ON (hwui_cache_miss.render_thread_id = hwui_processes.render_thread_id) 256 LEFT JOIN hwui_graphics_cpu_mem ON (hwui_graphics_cpu_mem.process_upid = hwui_processes.process_upid) 257 LEFT JOIN hwui_graphics_gpu_mem ON (hwui_graphics_gpu_mem.process_upid = hwui_processes.process_upid) 258 LEFT JOIN hwui_texture_mem ON (hwui_texture_mem.process_upid = hwui_processes.process_upid) 259 LEFT JOIN hwui_all_mem ON (hwui_all_mem.process_upid = hwui_processes.process_upid) 260 ) 261); 262