-- -- Copyright 2021 The Android Open Source Project -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- https://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. -- The HWC execution time will be calculated based on the runtime of -- HwcPresentOrValidateDisplay, HwcValidateDisplay, and/or HwcPresentDisplay -- which are happened in the same onMessageRefresh. -- There are 3 possible combinations how those functions will be called in -- a single onMessageRefresh, i.e.: -- 1. HwcPresentOrValidateDisplay and then HwcPresentDisplay -- 2. HwcPresentOrValidateDisplay -- 3. HwcValidateDisplay and then HwcPresentDisplay DROP VIEW IF EXISTS raw_hwc_function_spans; CREATE VIEW raw_hwc_function_spans AS SELECT id, name, ts AS begin_ts, ts+dur AS end_ts, dur, LEAD(name, 1, '') OVER (PARTITION BY track_id ORDER BY ts) AS next_name, LEAD(ts, 1, 0) OVER (PARTITION BY track_id ORDER BY ts) AS next_ts, LEAD(dur, 1, 0) OVER (PARTITION BY track_id ORDER BY ts) AS next_dur, LEAD(name, 2, '') OVER (PARTITION BY track_id ORDER BY ts) AS second_next_name, LEAD(ts, 2, 0) OVER (PARTITION BY track_id ORDER BY ts) AS second_next_ts, LEAD(dur, 2, 0) OVER (PARTITION BY track_id ORDER BY ts) AS second_next_dur FROM slice WHERE name = 'HwcPresentOrValidateDisplay' OR name = 'HwcValidateDisplay' OR name = 'HwcPresentDisplay' OR name = 'onMessageRefresh' ORDER BY ts; DROP VIEW IF EXISTS {{output}}; CREATE VIEW {{output}} AS SELECT id, CASE WHEN begin_ts <= next_ts AND next_ts <= end_ts THEN CASE WHEN begin_ts <= second_next_ts AND second_next_ts <= end_ts THEN next_dur + second_next_dur ELSE next_dur END ELSE 0 END AS execution_time_ns, CASE WHEN next_name = 'HwcPresentOrValidateDisplay' AND second_next_name = 'HwcPresentDisplay' THEN 'unskipped_validation' WHEN next_name = 'HwcPresentOrValidateDisplay' AND second_next_name != 'HwcPresentDisplay' THEN 'skipped_validation' WHEN next_name = 'HwcValidateDisplay' AND second_next_name = 'HwcPresentDisplay' THEN 'separated_validation' ELSE 'unknown' END AS validation_type FROM raw_hwc_function_spans WHERE name = 'onMessageRefresh' AND dur > 0;