1// Copyright (c) 2021 Huawei Device Co., Ltd. 2// Licensed under the Apache License, Version 2.0 (the "License"); 3// you may not use this file except in compliance with the License. 4// You may obtain a copy of the License at 5// 6// http://www.apache.org/licenses/LICENSE-2.0 7// 8// Unless required by applicable law or agreed to in writing, software 9// distributed under the License is distributed on an "AS IS" BASIS, 10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11// See the License for the specific language governing permissions and 12// limitations under the License. 13 14import { TraficEnum } from './utils/QueryEnum'; 15import { dmaFenceList } from './utils/AllMemoryCache'; 16import { filterDataByGroup } from './utils/DataFilter'; 17export const queryPresentInfo = (args: unknown): string => { 18 return `WITH state AS ( 19 SELECT 20 id, 21 ts, 22 cat, 23 driver, 24 timeline, 25 context, 26 seqno, 27 CASE 28 WHEN LAG(cat) OVER (ORDER BY ts) = '${//@ts-ignore 29 args.dmaFenceInit}' AND LAG(driver) OVER (ORDER BY ts) = '' 30 THEN LAG(ts, 2) OVER (ORDER BY ts) 31 ELSE LAG(ts) OVER (ORDER BY ts) 32 END AS new_ts, 33 CASE 34 WHEN LAG(cat) OVER (ORDER BY ts) = '${//@ts-ignore 35 args.dmaFenceInit}' AND LAG(driver) OVER (ORDER BY ts) = '' 36 THEN Dur + LAG(dur) OVER (ORDER BY ts) 37 ELSE Dur 38 END AS newDur, 39 ROW_NUMBER() OVER (ORDER BY ts) AS rn 40 FROM 41 dma_fence 42 WHERE 43 timeline = '${//@ts-ignore 44 args.dmaFenceName}' 45 ) 46 SELECT 47 s.id, 48 s.new_ts - COALESCE(r.start_ts, 0) AS startTime, 49 s.newDur AS dur, 50 s.new_ts - COALESCE(r.start_ts, 0) + s.newDur AS endTime, 51 s.cat, 52 s.driver, 53 s.timeline, 54 s.context, 55 s.seqno 56 FROM 57 state s 58 LEFT JOIN trace_range r ON s.new_ts BETWEEN r.start_ts AND r.end_ts 59 WHERE 60 s.cat <> '${//@ts-ignore 61 args.dmaFenceInit}' 62 AND s.rn > 1 63 ORDER BY 64 s.new_ts;`; 65}; 66 67export function dmaFenceReceiver(data: unknown, proc: Function): void { 68 //@ts-ignore 69 if (data.params.trafic === TraficEnum.Memory) { 70 let res: unknown[]; 71 //@ts-ignore 72 if (!dmaFenceList.has(data.params.dmaFenceName)) { 73 //@ts-ignore 74 res = proc(queryPresentInfo(data.params)); 75 //@ts-ignore 76 dmaFenceList.set(data.params.dmaFenceName, res); 77 } else { 78 //@ts-ignore 79 res = dmaFenceList.get(data.params.dmaFenceName) || []; 80 } 81 //@ts-ignore 82 res = filterDataByGroup(res || [], 'startTime', 'dur', data.params.startNS, data.params.endNS, data.params.width, '', undefined, true, true); 83 arrayBufferHandler(data, res, true); 84 } else { 85 //@ts-ignore 86 let sql = queryPresentInfo(data.params); 87 let res = proc(sql); 88 //@ts-ignore 89 arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 90 } 91} 92 93function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 94 //@ts-ignore 95 let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); 96 //@ts-ignore 97 let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 98 //@ts-ignore 99 let id = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.id); 100 res.forEach((it, i) => { 101 //@ts-ignore 102 startTime[i] = it.startTime; 103 //@ts-ignore 104 dur[i] = it.dur; 105 //@ts-ignore 106 id[i] = it.id; 107 }); 108 (self as unknown as Worker).postMessage( 109 { 110 //@ts-ignore 111 id: data.id, 112 //@ts-ignore 113 action: data.action, 114 results: transfer 115 ? { 116 startTime: startTime.buffer, 117 dur: dur.buffer, 118 id: id.buffer, 119 } 120 : {}, 121 len: res.length, 122 transfer: transfer, 123 }, 124 transfer ? [startTime.buffer, dur.buffer, id.buffer] : [] 125 ); 126}