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