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 16SELECT RUN_METRIC( 17 'android/frame_missed.sql', 18 'track_name', 'PrevFrameMissed', 19 'output', 'frame_missed' 20); 21SELECT RUN_METRIC( 22 'android/frame_missed.sql', 23 'track_name', 'PrevHwcFrameMissed', 24 'output', 'hwc_frame_missed' 25); 26SELECT RUN_METRIC( 27 'android/frame_missed.sql', 28 'track_name', 'PrevGpuFrameMissed', 29 'output', 'gpu_frame_missed' 30); 31 32DROP VIEW IF EXISTS surfaceflinger_track; 33CREATE PERFETTO VIEW surfaceflinger_track AS 34SELECT tr.id AS track_id, t.utid, t.tid 35FROM process p JOIN thread t ON p.upid = t.upid 36JOIN thread_track tr ON tr.utid = t.utid 37WHERE p.cmdline = '/system/bin/surfaceflinger'; 38 39DROP VIEW IF EXISTS gpu_waiting_start; 40CREATE PERFETTO VIEW gpu_waiting_start AS 41SELECT 42 CAST(SUBSTR(s.name, 28) AS UINT32) AS fence_id, 43 ts AS start_ts 44FROM slices s JOIN surfaceflinger_track t ON s.track_id = t.track_id 45WHERE s.name GLOB 'Trace GPU completion fence *'; 46 47DROP VIEW IF EXISTS gpu_waiting_end; 48CREATE PERFETTO VIEW gpu_waiting_end AS 49SELECT 50 CAST(SUBSTR(s.name, 28) AS UINT32) AS fence_id, 51 dur, 52 ts + dur AS end_ts 53FROM slices s JOIN surfaceflinger_track t ON s.track_id = t.track_id 54WHERE s.name GLOB 'waiting for GPU completion *'; 55 56DROP VIEW IF EXISTS gpu_waiting_span; 57CREATE PERFETTO VIEW gpu_waiting_span AS 58SELECT 59 fence_id, 60 ts, 61 dur 62FROM ( 63 SELECT 64 fence_id, 65 ts, 66 LEAD(ts) OVER (ORDER BY fence_id, event_type) - ts AS dur, 67 LEAD(fence_id) OVER (ORDER BY fence_id, event_type) AS next_fence_id, 68 event_type 69 FROM ( 70 SELECT fence_id, start_ts AS ts, 0 AS event_type FROM gpu_waiting_start 71 UNION 72 SELECT fence_id, end_ts AS ts, 1 AS event_type FROM gpu_waiting_end 73 ) 74 ORDER BY fence_id, event_type 75) 76WHERE event_type = 0 AND fence_id = next_fence_id; 77 78 79DROP VIEW IF EXISTS display_ids; 80CREATE PERFETTO VIEW display_ids AS 81SELECT DISTINCT display_id 82FROM ( 83 SELECT display_id FROM frame_missed 84 UNION 85 SELECT display_id FROM hwc_frame_missed 86 UNION 87 SELECT display_id FROM gpu_frame_missed 88); 89 90DROP VIEW IF EXISTS metrics_per_display; 91CREATE PERFETTO VIEW metrics_per_display AS 92SELECT AndroidSurfaceflingerMetric_MetricsPerDisplay( 93 'display_id', d.display_id, 94 'missed_frames', 95 (SELECT COUNT(1) FROM frame_missed WHERE value = 1 AND display_id = d.display_id), 96 'missed_hwc_frames', 97 (SELECT COUNT(1) FROM hwc_frame_missed WHERE value = 1 AND display_id = d.display_id), 98 'missed_gpu_frames', 99 (SELECT COUNT(1) FROM gpu_frame_missed WHERE value = 1 AND display_id = d.display_id), 100 'missed_frame_rate', 101 (SELECT AVG(value) FROM frame_missed WHERE display_id = d.display_id), 102 'missed_hwc_frame_rate', 103 (SELECT AVG(value) FROM hwc_frame_missed WHERE display_id = d.display_id), 104 'missed_gpu_frame_rate', 105 (SELECT AVG(value) FROM gpu_frame_missed WHERE display_id = d.display_id) 106) AS proto 107FROM display_ids d; 108 109DROP VIEW IF EXISTS android_surfaceflinger_output; 110CREATE PERFETTO VIEW android_surfaceflinger_output AS 111SELECT 112 AndroidSurfaceflingerMetric( 113 'missed_frames', (SELECT COUNT(1) FROM frame_missed WHERE value = 1), 114 'missed_hwc_frames', (SELECT COUNT(1) FROM hwc_frame_missed WHERE value = 1), 115 'missed_gpu_frames', (SELECT COUNT(1) FROM gpu_frame_missed WHERE value = 1), 116 'missed_frame_rate', (SELECT AVG(value) FROM frame_missed), 117 'missed_hwc_frame_rate', (SELECT AVG(value) FROM hwc_frame_missed), 118 'missed_gpu_frame_rate', (SELECT AVG(value) FROM gpu_frame_missed), 119 'gpu_invocations', (SELECT COUNT(1) FROM gpu_waiting_end), 120 'avg_gpu_waiting_dur_ms', (SELECT AVG(dur) / 1e6 FROM gpu_waiting_span), 121 'total_non_empty_gpu_waiting_dur_ms', 122 (SELECT SUM(dur) / 1e6 FROM gpu_waiting_end), 123 'metrics_per_display', (SELECT RepeatedField(proto) FROM metrics_per_display) 124 ); 125