1-- 2-- Copyright 2022 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 16INCLUDE PERFETTO MODULE slices.with_context; 17 18-- This is for backward compatibility only: From the table with main thread name 19-- override (not needed anymore in new android versions), generates a table 20-- containing the utid for the ui thread of each CUJ. 21DROP TABLE IF EXISTS android_jank_cuj_hardcoded_thread_names; 22CREATE PERFETTO TABLE android_jank_cuj_hardcoded_thread_names AS 23SELECT 24 cuj.cuj_id, 25 thread.utid as utid 26FROM thread 27 JOIN android_jank_cuj cuj USING (upid) 28 JOIN thread_track USING (utid) 29 JOIN android_jank_cuj_param p USING (cuj_id) 30WHERE p.main_thread_override = thread.name; 31 32-- Uses both the deprecated android_jank_cuj_hardcoded_thread_names (for 33-- compatibility reasons) and the instant events ui thread overrides. 34-- Instant events for the UI thread always take precendence. 35DROP TABLE IF EXISTS android_jank_cuj_main_thread_overrides; 36CREATE PERFETTO TABLE android_jank_cuj_main_thread_overrides AS 37SELECT 38 cuj.cuj_id, 39 COALESCE(cuj.ui_thread, p.utid) AS main_thread_override 40FROM android_jank_cuj cuj 41 LEFT JOIN android_jank_cuj_hardcoded_thread_names p USING (cuj_id); 42 43DROP TABLE IF EXISTS android_jank_cuj_main_thread; 44CREATE PERFETTO TABLE android_jank_cuj_main_thread AS 45SELECT cuj_id, cuj.upid, utid, thread.name, thread_track.id AS track_id 46FROM thread 47JOIN android_jank_cuj cuj USING (upid) 48JOIN thread_track USING (utid) 49JOIN android_jank_cuj_main_thread_overrides p USING (cuj_id) 50WHERE 51 (p.main_thread_override IS NULL AND thread.is_main_thread) 52 -- Some CUJs use a dedicated thread for Choreographer callbacks 53 OR (p.main_thread_override = thread.utid); 54 55CREATE OR REPLACE PERFETTO FUNCTION android_jank_cuj_app_thread(thread_name STRING) 56RETURNS TABLE(cuj_id INT, upid INT, utid INT, name STRING, track_id INT) AS 57SELECT 58 cuj_id, 59 cuj.upid, 60 utid, 61 thread.name, 62 thread_track.id AS track_id 63FROM thread 64JOIN android_jank_cuj cuj USING (upid) 65JOIN thread_track USING (utid) 66WHERE thread.name = $thread_name; 67 68DROP TABLE IF EXISTS android_jank_cuj_render_thread; 69CREATE PERFETTO TABLE android_jank_cuj_render_thread AS 70SELECT * FROM ANDROID_JANK_CUJ_APP_THREAD('RenderThread'); 71 72DROP TABLE IF EXISTS android_jank_cuj_gpu_completion_thread; 73CREATE PERFETTO TABLE android_jank_cuj_gpu_completion_thread AS 74SELECT * FROM ANDROID_JANK_CUJ_APP_THREAD('GPU completion'); 75 76DROP TABLE IF EXISTS android_jank_cuj_hwc_release_thread; 77CREATE PERFETTO TABLE android_jank_cuj_hwc_release_thread AS 78SELECT * FROM ANDROID_JANK_CUJ_APP_THREAD('HWC release'); 79 80DROP TABLE IF EXISTS android_jank_cuj_sf_process; 81CREATE PERFETTO TABLE android_jank_cuj_sf_process AS 82SELECT * FROM process 83WHERE process.name = '/system/bin/surfaceflinger' 84LIMIT 1; 85 86DROP TABLE IF EXISTS android_jank_cuj_sf_main_thread; 87CREATE PERFETTO TABLE android_jank_cuj_sf_main_thread AS 88SELECT upid, utid, thread.name, thread_track.id AS track_id 89FROM thread 90JOIN android_jank_cuj_sf_process sf_process USING (upid) 91JOIN thread_track USING (utid) 92WHERE thread.is_main_thread; 93 94CREATE OR REPLACE PERFETTO FUNCTION android_jank_cuj_sf_thread(thread_name STRING) 95RETURNS TABLE(upid INT, utid INT, name STRING, track_id INT) AS 96SELECT upid, utid, thread.name, thread_track.id AS track_id 97FROM thread 98JOIN android_jank_cuj_sf_process sf_process USING (upid) 99JOIN thread_track USING (utid) 100WHERE thread.name = $thread_name; 101 102DROP TABLE IF EXISTS android_jank_cuj_sf_gpu_completion_thread; 103CREATE PERFETTO TABLE android_jank_cuj_sf_gpu_completion_thread AS 104SELECT * FROM ANDROID_JANK_CUJ_SF_THREAD('GPU completion'); 105 106DROP TABLE IF EXISTS android_jank_cuj_sf_render_engine_thread; 107CREATE PERFETTO TABLE android_jank_cuj_sf_render_engine_thread AS 108SELECT * FROM ANDROID_JANK_CUJ_SF_THREAD('RenderEngine'); 109