1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../SpSystemTrace';
17fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow';
18fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
19fb726d48Sopenharmony_ciimport {
20fb726d48Sopenharmony_ci  GpuCounterStruct,
21fb726d48Sopenharmony_ci  MaleoonCounterObj,
22fb726d48Sopenharmony_ci  GpuCounterType,
23fb726d48Sopenharmony_ci  GpuCounterRender,
24fb726d48Sopenharmony_ci} from '../../database/ui-worker/ProcedureWorkerGpuCounter';
25fb726d48Sopenharmony_ciimport { folderSupplier, folderThreadHandler } from './SpChartManager';
26fb726d48Sopenharmony_ciimport { queryRangeTime } from '../../database/sql/SqlLite.sql';
27fb726d48Sopenharmony_ci
28fb726d48Sopenharmony_ciexport class SpGpuCounterChart {
29fb726d48Sopenharmony_ci  trace: SpSystemTrace;
30fb726d48Sopenharmony_ci  // @ts-ignore
31fb726d48Sopenharmony_ci  private folderRow: TraceRow<unknown> | undefined;
32fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
33fb726d48Sopenharmony_ci    this.trace = trace;
34fb726d48Sopenharmony_ci  }
35fb726d48Sopenharmony_ci
36fb726d48Sopenharmony_ci  async init(res: Array<unknown>): Promise<void> {
37fb726d48Sopenharmony_ci    if (res.length === 0) {
38fb726d48Sopenharmony_ci      let startTime = await queryRangeTime();
39fb726d48Sopenharmony_ci      this.initFolder(res, false);
40fb726d48Sopenharmony_ci      //@ts-ignore
41fb726d48Sopenharmony_ci      this.addTraceRowEventListener(startTime[0].start_ts, startTime[0].end_ts);
42fb726d48Sopenharmony_ci    } else {
43fb726d48Sopenharmony_ci      // @ts-ignore
44fb726d48Sopenharmony_ci      const { gpuCounterType, start_time } = this.handleCsvData(res);
45fb726d48Sopenharmony_ci      this.initFolder(res, true);
46fb726d48Sopenharmony_ci      await this.initGpuCounters(gpuCounterType, start_time);
47fb726d48Sopenharmony_ci    }
48fb726d48Sopenharmony_ci  }
49fb726d48Sopenharmony_ci
50fb726d48Sopenharmony_ci  initFolder(res: Array<unknown>, isSimpleUpload: boolean): void {
51fb726d48Sopenharmony_ci    this.folderRow = TraceRow.skeleton();
52fb726d48Sopenharmony_ci    this.folderRow.rowId = 'GpuCounter';
53fb726d48Sopenharmony_ci    this.folderRow.index = 0;
54fb726d48Sopenharmony_ci    this.folderRow.rowType = TraceRow.ROW_TYPE_GPU_COUNTER_GROUP;
55fb726d48Sopenharmony_ci    this.folderRow.rowParentId = '';
56fb726d48Sopenharmony_ci    this.folderRow.style.height = '40px';
57fb726d48Sopenharmony_ci    this.folderRow.rowHidden = this.folderRow!.expansion;
58fb726d48Sopenharmony_ci    this.folderRow.setAttribute('children', '');
59fb726d48Sopenharmony_ci    this.folderRow.folder = res.length > 0 ? true : false;
60fb726d48Sopenharmony_ci    this.folderRow.name = 'Gpu counter';
61fb726d48Sopenharmony_ci    //@ts-ignore
62fb726d48Sopenharmony_ci    this.folderRow.supplier = folderSupplier();
63fb726d48Sopenharmony_ci    // @ts-ignore
64fb726d48Sopenharmony_ci    this.folderRow.onThreadHandler = folderThreadHandler(this.folderRow, this.trace);
65fb726d48Sopenharmony_ci    if (!isSimpleUpload) {
66fb726d48Sopenharmony_ci      this.folderRow.addRowSampleUpload('.csv');
67fb726d48Sopenharmony_ci    }
68fb726d48Sopenharmony_ci    this.folderRow.addEventListener('expansion-change', this.trace.extracted(this.folderRow));
69fb726d48Sopenharmony_ci    this.trace.rowsEL?.appendChild(this.folderRow);
70fb726d48Sopenharmony_ci  }
71fb726d48Sopenharmony_ci
72fb726d48Sopenharmony_ci  async initGpuCounters(gpuCounterType: unknown, start_time: number): Promise<void> {
73fb726d48Sopenharmony_ci    // @ts-ignore
74fb726d48Sopenharmony_ci    for (const key in gpuCounterType) {
75fb726d48Sopenharmony_ci      let typeRows = TraceRow.skeleton();
76fb726d48Sopenharmony_ci      typeRows.rowId = key;
77fb726d48Sopenharmony_ci      typeRows.rowType = TraceRow.ROW_TYPE_GPU_COUNTER;
78fb726d48Sopenharmony_ci      typeRows.rowParentId = this.folderRow?.rowId;
79fb726d48Sopenharmony_ci      typeRows.folder = true;
80fb726d48Sopenharmony_ci      typeRows.folderTextLeft = 20;
81fb726d48Sopenharmony_ci      typeRows.rowHidden = !this.folderRow!.expansion;
82fb726d48Sopenharmony_ci      typeRows.style.height = '40px';
83fb726d48Sopenharmony_ci      typeRows.name = `${key}`;
84fb726d48Sopenharmony_ci      typeRows.selectChangeHandler = this.trace.selectChangeHandler;
85fb726d48Sopenharmony_ci      //@ts-ignore
86fb726d48Sopenharmony_ci      typeRows.supplier = folderSupplier();
87fb726d48Sopenharmony_ci      typeRows.onThreadHandler = folderThreadHandler(typeRows, this.trace);
88fb726d48Sopenharmony_ci      this.folderRow!.addChildTraceRow(typeRows);
89fb726d48Sopenharmony_ci      // @ts-ignore
90fb726d48Sopenharmony_ci      this.initTypeRow(gpuCounterType[key], key, typeRows, start_time);
91fb726d48Sopenharmony_ci    }
92fb726d48Sopenharmony_ci  }
93fb726d48Sopenharmony_ci
94fb726d48Sopenharmony_ci  initTypeRow(rowList: unknown, key: string, parentRow: unknown, start_time: number): void {
95fb726d48Sopenharmony_ci    const typeName = this.getKeyTypeName(key);
96fb726d48Sopenharmony_ci    // @ts-ignore
97fb726d48Sopenharmony_ci    for (let i = 0; i < rowList.length; i++) {
98fb726d48Sopenharmony_ci      let typeRow = TraceRow.skeleton<GpuCounterStruct>();
99fb726d48Sopenharmony_ci      // @ts-ignore
100fb726d48Sopenharmony_ci      let maxValue = Math.max(...rowList[i].map((it: GpuCounterStruct) => Number(it.height)));
101fb726d48Sopenharmony_ci      typeRow.rowId = `${typeName[i]}`;
102fb726d48Sopenharmony_ci      typeRow.rowType = TraceRow.ROW_TYPE_GPU_COUNTER;
103fb726d48Sopenharmony_ci      typeRow.rowParentId = key;
104fb726d48Sopenharmony_ci      typeRow.folder = false;
105fb726d48Sopenharmony_ci      typeRow.folderTextLeft = 40;
106fb726d48Sopenharmony_ci      typeRow.style.height = '40px';
107fb726d48Sopenharmony_ci      // @ts-ignore
108fb726d48Sopenharmony_ci      typeRow.rowHidden = !parentRow.expansion;
109fb726d48Sopenharmony_ci      typeRow.setAttribute('children', '');
110fb726d48Sopenharmony_ci      typeRow.name = `${typeName[i]}`;
111fb726d48Sopenharmony_ci      typeRow.selectChangeHandler = this.trace.selectChangeHandler;
112fb726d48Sopenharmony_ci      typeRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
113fb726d48Sopenharmony_ci      typeRow.focusHandler = (): void => this.focusHandler(typeRow, GpuCounterStruct.hoverGpuCounterStruct!);
114fb726d48Sopenharmony_ci      typeRow.findHoverStruct = (): void => {
115fb726d48Sopenharmony_ci        GpuCounterStruct.hoverGpuCounterStruct = typeRow.getHoverStruct(false);
116fb726d48Sopenharmony_ci      };
117fb726d48Sopenharmony_ci      typeRow.supplierFrame = (): Promise<GpuCounterStruct[]> =>
118fb726d48Sopenharmony_ci        new Promise((resolve): void => {
119fb726d48Sopenharmony_ci          // @ts-ignore
120fb726d48Sopenharmony_ci          resolve(rowList[i]);
121fb726d48Sopenharmony_ci        });
122fb726d48Sopenharmony_ci      typeRow.onThreadHandler = (useCache): void => {
123fb726d48Sopenharmony_ci        let context: CanvasRenderingContext2D;
124fb726d48Sopenharmony_ci        if (typeRow.currentContext) {
125fb726d48Sopenharmony_ci          context = typeRow.currentContext;
126fb726d48Sopenharmony_ci        } else {
127fb726d48Sopenharmony_ci          context = typeRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
128fb726d48Sopenharmony_ci        }
129fb726d48Sopenharmony_ci        typeRow.canvasSave(context);
130fb726d48Sopenharmony_ci        (renders.gpuCounter as GpuCounterRender).renderMainThread(
131fb726d48Sopenharmony_ci          {
132fb726d48Sopenharmony_ci            context: context,
133fb726d48Sopenharmony_ci            useCache: useCache,
134fb726d48Sopenharmony_ci            type: `${typeName[i]}`,
135fb726d48Sopenharmony_ci            startTime: start_time,
136fb726d48Sopenharmony_ci            maxValue: maxValue,
137fb726d48Sopenharmony_ci          },
138fb726d48Sopenharmony_ci          typeRow
139fb726d48Sopenharmony_ci        );
140fb726d48Sopenharmony_ci        typeRow.canvasRestore(context);
141fb726d48Sopenharmony_ci      };
142fb726d48Sopenharmony_ci      // @ts-ignore
143fb726d48Sopenharmony_ci      parentRow.addChildTraceRow(typeRow);
144fb726d48Sopenharmony_ci    }
145fb726d48Sopenharmony_ci  }
146fb726d48Sopenharmony_ci
147fb726d48Sopenharmony_ci  focusHandler(row: TraceRow<GpuCounterStruct>, struct: GpuCounterStruct): void {
148fb726d48Sopenharmony_ci    let tip = '';
149fb726d48Sopenharmony_ci    if (struct) {
150fb726d48Sopenharmony_ci      tip = `
151fb726d48Sopenharmony_ci      <span> ${struct.height}</span>
152fb726d48Sopenharmony_ci      `;
153fb726d48Sopenharmony_ci    }
154fb726d48Sopenharmony_ci    this.trace?.displayTip(row, struct, tip);
155fb726d48Sopenharmony_ci  }
156fb726d48Sopenharmony_ci
157fb726d48Sopenharmony_ci  getKeyTypeName(key: string): Array<string> {
158fb726d48Sopenharmony_ci    const typeName: { [key: string]: Array<string> } = {
159fb726d48Sopenharmony_ci      cycle: ['gpu clocks', 'tiler utilization', 'binning utilization', 'rendering utilization', 'compute utilization'],
160fb726d48Sopenharmony_ci      drawcall: [
161fb726d48Sopenharmony_ci        'drawcall count',
162fb726d48Sopenharmony_ci        'vertex count',
163fb726d48Sopenharmony_ci        'primitives count',
164fb726d48Sopenharmony_ci        'visible primitives count',
165fb726d48Sopenharmony_ci        'compute invocations count',
166fb726d48Sopenharmony_ci      ],
167fb726d48Sopenharmony_ci      shader_cycle: [
168fb726d48Sopenharmony_ci        'shader utilization',
169fb726d48Sopenharmony_ci        'eu utilization',
170fb726d48Sopenharmony_ci        'eu stall utilization',
171fb726d48Sopenharmony_ci        'eu idle utilization',
172fb726d48Sopenharmony_ci        'control flow instr utilization',
173fb726d48Sopenharmony_ci        'half float instr utilization',
174fb726d48Sopenharmony_ci        'tu utilization',
175fb726d48Sopenharmony_ci      ],
176fb726d48Sopenharmony_ci      local_count: ['concurrent warps', 'instruction count', 'quads count', 'texels count'],
177fb726d48Sopenharmony_ci      local_wr: ['memory read', 'memory write', 'memory traffic'],
178fb726d48Sopenharmony_ci    };
179fb726d48Sopenharmony_ci    return typeName[key];
180fb726d48Sopenharmony_ci  }
181fb726d48Sopenharmony_ci
182fb726d48Sopenharmony_ci  handleCsvData(res: unknown, start_ts: number = 0, end_ts: number = 0): unknown {
183fb726d48Sopenharmony_ci    // @ts-ignore
184fb726d48Sopenharmony_ci    const minIndex = this.getMinData(res) + 1;
185fb726d48Sopenharmony_ci    const gpuCounterMap = this.initGpuCounterMap();
186fb726d48Sopenharmony_ci    // @ts-ignore
187fb726d48Sopenharmony_ci    this.maleoon_gpu_counter_init(gpuCounterMap, res[0]);
188fb726d48Sopenharmony_ci    // @ts-ignore
189fb726d48Sopenharmony_ci    let start_time_data = res[minIndex].split(',');
190fb726d48Sopenharmony_ci    // @ts-ignore
191fb726d48Sopenharmony_ci    let start_time = Number(start_time_data[gpuCounterMap.timestamp]);
192fb726d48Sopenharmony_ci    let last_record_time = 0;
193fb726d48Sopenharmony_ci    // @ts-ignore
194fb726d48Sopenharmony_ci    let maleoonCounter = new maleoon_counter_obj();
195fb726d48Sopenharmony_ci    // @ts-ignore
196fb726d48Sopenharmony_ci    let read_line_num = res.length - 1;
197fb726d48Sopenharmony_ci    let utilization_array = [
198fb726d48Sopenharmony_ci      'tiler_utilization',
199fb726d48Sopenharmony_ci      'binning_utilization',
200fb726d48Sopenharmony_ci      'rendering_utilization',
201fb726d48Sopenharmony_ci      'compute_utilization',
202fb726d48Sopenharmony_ci      'shader_utilization',
203fb726d48Sopenharmony_ci      'eu_utilization',
204fb726d48Sopenharmony_ci      'eu_stall_utilization',
205fb726d48Sopenharmony_ci      'eu_idle_utilization',
206fb726d48Sopenharmony_ci      'control_flow_instr_utilization',
207fb726d48Sopenharmony_ci      'half_float_instr_utilization',
208fb726d48Sopenharmony_ci      'tu_utilization',
209fb726d48Sopenharmony_ci      'concurrent_warps',
210fb726d48Sopenharmony_ci    ];
211fb726d48Sopenharmony_ci
212fb726d48Sopenharmony_ci    let count_array = [
213fb726d48Sopenharmony_ci      'gpu_clocks',
214fb726d48Sopenharmony_ci      'drawcall_count',
215fb726d48Sopenharmony_ci      'vertex_count',
216fb726d48Sopenharmony_ci      'primitives_count',
217fb726d48Sopenharmony_ci      'visible_primitives_count',
218fb726d48Sopenharmony_ci      'instruction_count',
219fb726d48Sopenharmony_ci      'quads_count',
220fb726d48Sopenharmony_ci      'texels_count',
221fb726d48Sopenharmony_ci      'compute_invocations_count',
222fb726d48Sopenharmony_ci      'memory_read',
223fb726d48Sopenharmony_ci      'memory_write',
224fb726d48Sopenharmony_ci      'memory_traffic',
225fb726d48Sopenharmony_ci    ];
226fb726d48Sopenharmony_ci
227fb726d48Sopenharmony_ci    for (let i = minIndex; i < read_line_num; i++) {
228fb726d48Sopenharmony_ci      // @ts-ignore
229fb726d48Sopenharmony_ci      let datas = res[i].split(',');
230fb726d48Sopenharmony_ci      if (datas.length !== 25) {
231fb726d48Sopenharmony_ci        continue;
232fb726d48Sopenharmony_ci      }
233fb726d48Sopenharmony_ci      if (
234fb726d48Sopenharmony_ci        // @ts-ignore
235fb726d48Sopenharmony_ci        (start_ts > 0 && Number(datas[gpuCounterMap.timestamp]) < start_ts) ||
236fb726d48Sopenharmony_ci        // @ts-ignore
237fb726d48Sopenharmony_ci        (end_ts > 0 && Number(datas[gpuCounterMap.timestamp]) > end_ts)
238fb726d48Sopenharmony_ci      ) {
239fb726d48Sopenharmony_ci        continue;
240fb726d48Sopenharmony_ci      }
241fb726d48Sopenharmony_ci      // @ts-ignore
242fb726d48Sopenharmony_ci      let time_passed = Number(datas[gpuCounterMap.timestamp]) - start_time;
243fb726d48Sopenharmony_ci      //去重
244fb726d48Sopenharmony_ci      if (time_passed <= last_record_time) {
245fb726d48Sopenharmony_ci        continue;
246fb726d48Sopenharmony_ci      }
247fb726d48Sopenharmony_ci      time_passed -= last_record_time;
248fb726d48Sopenharmony_ci      last_record_time += time_passed;
249fb726d48Sopenharmony_ci      utilization_array.forEach((item) => {
250fb726d48Sopenharmony_ci        maleoonCounter[item].push({
251fb726d48Sopenharmony_ci          // @ts-ignore
252fb726d48Sopenharmony_ci          startNS: Number(datas[gpuCounterMap.timestamp]),
253fb726d48Sopenharmony_ci          // @ts-ignore
254fb726d48Sopenharmony_ci          height: gpuCounterMap[item] === -1 ? 0 : Math.floor(Number(datas[gpuCounterMap[item]])),
255fb726d48Sopenharmony_ci        });
256fb726d48Sopenharmony_ci      });
257fb726d48Sopenharmony_ci      count_array.forEach((item) => {
258fb726d48Sopenharmony_ci        maleoonCounter[item].push({
259fb726d48Sopenharmony_ci          // @ts-ignore
260fb726d48Sopenharmony_ci          startNS: Number(datas[gpuCounterMap.timestamp]),
261fb726d48Sopenharmony_ci          // @ts-ignore
262fb726d48Sopenharmony_ci          height: gpuCounterMap[item] === -1 ? 0 : Math.floor(Number(datas[gpuCounterMap[item]])),
263fb726d48Sopenharmony_ci        });
264fb726d48Sopenharmony_ci      });
265fb726d48Sopenharmony_ci    }
266fb726d48Sopenharmony_ci    utilization_array.forEach((item) => {
267fb726d48Sopenharmony_ci      for (let i = 0; i < maleoonCounter[item].length; i++) {
268fb726d48Sopenharmony_ci        //@ts-ignore
269fb726d48Sopenharmony_ci        maleoonCounter[item][i].dur = maleoonCounter[item][i + 1]?.startNS - maleoonCounter[item][i].startNS || 0;
270fb726d48Sopenharmony_ci      }
271fb726d48Sopenharmony_ci    });
272fb726d48Sopenharmony_ci    count_array.forEach((item) => {
273fb726d48Sopenharmony_ci      for (let i = 0; i < maleoonCounter[item].length; i++) {
274fb726d48Sopenharmony_ci        //@ts-ignore
275fb726d48Sopenharmony_ci        maleoonCounter[item][i].dur = maleoonCounter[item][i + 1]?.startNS - maleoonCounter[item][i].startNS || 0;
276fb726d48Sopenharmony_ci      }
277fb726d48Sopenharmony_ci    });
278fb726d48Sopenharmony_ci    const gpuCounterType = this.groupByGpuCounterType(maleoonCounter);
279fb726d48Sopenharmony_ci    return { gpuCounterType, start_time };
280fb726d48Sopenharmony_ci  }
281fb726d48Sopenharmony_ci
282fb726d48Sopenharmony_ci  initGpuCounterMap(): unknown {
283fb726d48Sopenharmony_ci    let gpu_counter_map = {
284fb726d48Sopenharmony_ci      timestamp: -1,
285fb726d48Sopenharmony_ci
286fb726d48Sopenharmony_ci      gpu_clocks: -1,
287fb726d48Sopenharmony_ci      tiler_utilization: -1,
288fb726d48Sopenharmony_ci      binning_utilization: -1,
289fb726d48Sopenharmony_ci      rendering_utilization: -1,
290fb726d48Sopenharmony_ci      compute_utilization: -1,
291fb726d48Sopenharmony_ci
292fb726d48Sopenharmony_ci      drawcall_count: -1,
293fb726d48Sopenharmony_ci      vertex_count: -1,
294fb726d48Sopenharmony_ci      primitives_count: -1,
295fb726d48Sopenharmony_ci      visible_primitives_count: -1,
296fb726d48Sopenharmony_ci      compute_invocations_count: -1,
297fb726d48Sopenharmony_ci
298fb726d48Sopenharmony_ci      shader_utilization: -1,
299fb726d48Sopenharmony_ci      eu_utilization: -1,
300fb726d48Sopenharmony_ci      eu_stall_utilization: -1,
301fb726d48Sopenharmony_ci      eu_idle_utilization: -1,
302fb726d48Sopenharmony_ci      control_flow_instr_utilization: -1,
303fb726d48Sopenharmony_ci      half_float_instr_utilization: -1,
304fb726d48Sopenharmony_ci      tu_utilization: -1,
305fb726d48Sopenharmony_ci
306fb726d48Sopenharmony_ci      concurrent_warps: -1,
307fb726d48Sopenharmony_ci      instruction_count: -1,
308fb726d48Sopenharmony_ci      quads_count: -1,
309fb726d48Sopenharmony_ci      texels_count: -1,
310fb726d48Sopenharmony_ci
311fb726d48Sopenharmony_ci      memory_read: -1,
312fb726d48Sopenharmony_ci      memory_write: -1,
313fb726d48Sopenharmony_ci      memory_traffic: -1,
314fb726d48Sopenharmony_ci    };
315fb726d48Sopenharmony_ci    return gpu_counter_map;
316fb726d48Sopenharmony_ci  }
317fb726d48Sopenharmony_ci
318fb726d48Sopenharmony_ci  maleoon_gpu_counter_init(gpu_counter_map: unknown, head_line: string): void {
319fb726d48Sopenharmony_ci    // @ts-ignore
320fb726d48Sopenharmony_ci    gpu_counter_map.timestamp = -1;
321fb726d48Sopenharmony_ci    // @ts-ignore
322fb726d48Sopenharmony_ci    gpu_counter_map.gpu_clocks = -1;
323fb726d48Sopenharmony_ci    // @ts-ignore
324fb726d48Sopenharmony_ci    gpu_counter_map.tiler_utilization = -1;
325fb726d48Sopenharmony_ci    // @ts-ignore
326fb726d48Sopenharmony_ci    gpu_counter_map.binning_utilization = -1;
327fb726d48Sopenharmony_ci    // @ts-ignore
328fb726d48Sopenharmony_ci    gpu_counter_map.rendering_utilization = -1;
329fb726d48Sopenharmony_ci    // @ts-ignore
330fb726d48Sopenharmony_ci    gpu_counter_map.compute_utilization = -1;
331fb726d48Sopenharmony_ci
332fb726d48Sopenharmony_ci    // @ts-ignore
333fb726d48Sopenharmony_ci    gpu_counter_map.drawcall_count = -1;
334fb726d48Sopenharmony_ci    // @ts-ignore
335fb726d48Sopenharmony_ci    gpu_counter_map.vertex_count = -1;
336fb726d48Sopenharmony_ci    // @ts-ignore
337fb726d48Sopenharmony_ci    gpu_counter_map.primitives_count = -1;
338fb726d48Sopenharmony_ci    // @ts-ignore
339fb726d48Sopenharmony_ci    gpu_counter_map.visible_primitives_count = -1;
340fb726d48Sopenharmony_ci    // @ts-ignore
341fb726d48Sopenharmony_ci    gpu_counter_map.compute_invocations_count = -1;
342fb726d48Sopenharmony_ci
343fb726d48Sopenharmony_ci    // @ts-ignore
344fb726d48Sopenharmony_ci    gpu_counter_map.shader_utilization = -1;
345fb726d48Sopenharmony_ci    // @ts-ignore
346fb726d48Sopenharmony_ci    gpu_counter_map.eu_utilization = -1;
347fb726d48Sopenharmony_ci    // @ts-ignore
348fb726d48Sopenharmony_ci    gpu_counter_map.eu_stall_utilization = -1;
349fb726d48Sopenharmony_ci    // @ts-ignore
350fb726d48Sopenharmony_ci    gpu_counter_map.eu_idle_utilization = -1;
351fb726d48Sopenharmony_ci    // @ts-ignore
352fb726d48Sopenharmony_ci    gpu_counter_map.control_flow_instr_utilization = -1;
353fb726d48Sopenharmony_ci    // @ts-ignore
354fb726d48Sopenharmony_ci    gpu_counter_map.half_float_instr_utilization = -1;
355fb726d48Sopenharmony_ci    // @ts-ignore
356fb726d48Sopenharmony_ci    gpu_counter_map.tu_utilization = -1;
357fb726d48Sopenharmony_ci
358fb726d48Sopenharmony_ci    // @ts-ignore
359fb726d48Sopenharmony_ci    gpu_counter_map.concurrent_warps = -1;
360fb726d48Sopenharmony_ci    // @ts-ignore
361fb726d48Sopenharmony_ci    gpu_counter_map.instruction_count = -1;
362fb726d48Sopenharmony_ci    // @ts-ignore
363fb726d48Sopenharmony_ci    gpu_counter_map.quads_count = -1;
364fb726d48Sopenharmony_ci    // @ts-ignore
365fb726d48Sopenharmony_ci    gpu_counter_map.texels_count = -1;
366fb726d48Sopenharmony_ci
367fb726d48Sopenharmony_ci    // @ts-ignore
368fb726d48Sopenharmony_ci    gpu_counter_map.memory_read = -1;
369fb726d48Sopenharmony_ci    // @ts-ignore
370fb726d48Sopenharmony_ci    gpu_counter_map.memory_write = -1;
371fb726d48Sopenharmony_ci    // @ts-ignore
372fb726d48Sopenharmony_ci    gpu_counter_map.memory_traffic = -1;
373fb726d48Sopenharmony_ci
374fb726d48Sopenharmony_ci    let paras = head_line.split(',');
375fb726d48Sopenharmony_ci    for (let i = 0; i < paras.length; i++) {
376fb726d48Sopenharmony_ci      // @ts-ignore
377fb726d48Sopenharmony_ci      if (paras[i] === 'TIMESTAMP') {
378fb726d48Sopenharmony_ci        // @ts-ignore
379fb726d48Sopenharmony_ci        gpu_counter_map.timestamp = i;
380fb726d48Sopenharmony_ci      }
381fb726d48Sopenharmony_ci
382fb726d48Sopenharmony_ci      if (paras[i] === 'GPU Clocks') {
383fb726d48Sopenharmony_ci        // @ts-ignore
384fb726d48Sopenharmony_ci        gpu_counter_map.gpu_clocks = i;
385fb726d48Sopenharmony_ci      }
386fb726d48Sopenharmony_ci      if (paras[i] === 'Tiler Utilization') {
387fb726d48Sopenharmony_ci        // @ts-ignore
388fb726d48Sopenharmony_ci        gpu_counter_map.tiler_utilization = i;
389fb726d48Sopenharmony_ci      }
390fb726d48Sopenharmony_ci      if (paras[i] === 'Binning Queue Utilization') {
391fb726d48Sopenharmony_ci        // @ts-ignore
392fb726d48Sopenharmony_ci        gpu_counter_map.binning_utilization = i;
393fb726d48Sopenharmony_ci      }
394fb726d48Sopenharmony_ci      if (paras[i] === 'Rendering Queue Utilization') {
395fb726d48Sopenharmony_ci        // @ts-ignore
396fb726d48Sopenharmony_ci        gpu_counter_map.rendering_utilization = i;
397fb726d48Sopenharmony_ci      }
398fb726d48Sopenharmony_ci      if (paras[i] === 'Compute Queue Utilization') {
399fb726d48Sopenharmony_ci        // @ts-ignore
400fb726d48Sopenharmony_ci        gpu_counter_map.compute_utilization = i;
401fb726d48Sopenharmony_ci      }
402fb726d48Sopenharmony_ci
403fb726d48Sopenharmony_ci      if (paras[i] === 'Drawcalls Count') {
404fb726d48Sopenharmony_ci        // @ts-ignore
405fb726d48Sopenharmony_ci        gpu_counter_map.drawcall_count = i;
406fb726d48Sopenharmony_ci      }
407fb726d48Sopenharmony_ci      if (paras[i] === 'Vertex Count') {
408fb726d48Sopenharmony_ci        // @ts-ignore
409fb726d48Sopenharmony_ci        gpu_counter_map.vertex_count = i;
410fb726d48Sopenharmony_ci      }
411fb726d48Sopenharmony_ci      if (paras[i] === 'Primitive Count') {
412fb726d48Sopenharmony_ci        // @ts-ignore
413fb726d48Sopenharmony_ci        gpu_counter_map.primitives_count = i;
414fb726d48Sopenharmony_ci      }
415fb726d48Sopenharmony_ci      if (paras[i] === 'Visible Primitive Count') {
416fb726d48Sopenharmony_ci        // @ts-ignore
417fb726d48Sopenharmony_ci        gpu_counter_map.visible_primitives_count = i;
418fb726d48Sopenharmony_ci      }
419fb726d48Sopenharmony_ci      if (paras[i] === 'Compute Shader Invocations') {
420fb726d48Sopenharmony_ci        // @ts-ignore
421fb726d48Sopenharmony_ci        gpu_counter_map.compute_invocations_count = i;
422fb726d48Sopenharmony_ci      }
423fb726d48Sopenharmony_ci
424fb726d48Sopenharmony_ci      if (paras[i] === 'Shader Core Utilization') {
425fb726d48Sopenharmony_ci        // @ts-ignore
426fb726d48Sopenharmony_ci        gpu_counter_map.shader_utilization = i;
427fb726d48Sopenharmony_ci      }
428fb726d48Sopenharmony_ci      if (paras[i] === 'EU Utilization') {
429fb726d48Sopenharmony_ci        // @ts-ignore
430fb726d48Sopenharmony_ci        gpu_counter_map.eu_utilization = i;
431fb726d48Sopenharmony_ci      }
432fb726d48Sopenharmony_ci      if (paras[i] === 'EU Stall') {
433fb726d48Sopenharmony_ci        // @ts-ignore
434fb726d48Sopenharmony_ci        gpu_counter_map.eu_stall_utilization = i;
435fb726d48Sopenharmony_ci      }
436fb726d48Sopenharmony_ci      if (paras[i] === 'EU Idle') {
437fb726d48Sopenharmony_ci        // @ts-ignore
438fb726d48Sopenharmony_ci        gpu_counter_map.eu_idle_utilization = i;
439fb726d48Sopenharmony_ci      }
440fb726d48Sopenharmony_ci      if (paras[i] === 'Instructions Diverged') {
441fb726d48Sopenharmony_ci        // @ts-ignore
442fb726d48Sopenharmony_ci        gpu_counter_map.control_flow_instr_utilization = i;
443fb726d48Sopenharmony_ci      }
444fb726d48Sopenharmony_ci      if (paras[i] === 'Half-float Instructions') {
445fb726d48Sopenharmony_ci        // @ts-ignore
446fb726d48Sopenharmony_ci        gpu_counter_map.half_float_instr_utilization = i;
447fb726d48Sopenharmony_ci      }
448fb726d48Sopenharmony_ci      if (paras[i] === 'TU Utilization') {
449fb726d48Sopenharmony_ci        // @ts-ignore
450fb726d48Sopenharmony_ci        gpu_counter_map.tu_utilization = i;
451fb726d48Sopenharmony_ci      }
452fb726d48Sopenharmony_ci
453fb726d48Sopenharmony_ci      if (paras[i] === 'Concurrent Warps') {
454fb726d48Sopenharmony_ci        // @ts-ignore
455fb726d48Sopenharmony_ci        gpu_counter_map.concurrent_warps = i;
456fb726d48Sopenharmony_ci      }
457fb726d48Sopenharmony_ci      if (paras[i] === 'Instructions Executed') {
458fb726d48Sopenharmony_ci        // @ts-ignore
459fb726d48Sopenharmony_ci        gpu_counter_map.instruction_count = i;
460fb726d48Sopenharmony_ci      }
461fb726d48Sopenharmony_ci      if (paras[i] === 'Quads Shaded') {
462fb726d48Sopenharmony_ci        // @ts-ignore
463fb726d48Sopenharmony_ci        gpu_counter_map.quads_count = i;
464fb726d48Sopenharmony_ci      }
465fb726d48Sopenharmony_ci      if (paras[i] === 'Texels Sampled') {
466fb726d48Sopenharmony_ci        // @ts-ignore
467fb726d48Sopenharmony_ci        gpu_counter_map.texels_count = i;
468fb726d48Sopenharmony_ci      }
469fb726d48Sopenharmony_ci
470fb726d48Sopenharmony_ci      if (paras[i] === 'External Memory Read') {
471fb726d48Sopenharmony_ci        // @ts-ignore
472fb726d48Sopenharmony_ci        gpu_counter_map.memory_read = i;
473fb726d48Sopenharmony_ci      }
474fb726d48Sopenharmony_ci      if (paras[i] === 'External Memory Write') {
475fb726d48Sopenharmony_ci        // @ts-ignore
476fb726d48Sopenharmony_ci        gpu_counter_map.memory_write = i;
477fb726d48Sopenharmony_ci      }
478fb726d48Sopenharmony_ci      if (paras[i] === 'External Memory Traffic') {
479fb726d48Sopenharmony_ci        // @ts-ignore
480fb726d48Sopenharmony_ci        gpu_counter_map.memory_traffic = i;
481fb726d48Sopenharmony_ci      }
482fb726d48Sopenharmony_ci    }
483fb726d48Sopenharmony_ci  }
484fb726d48Sopenharmony_ci
485fb726d48Sopenharmony_ci  groupByGpuCounterType(maleoonCounter: MaleoonCounterObj): GpuCounterType {
486fb726d48Sopenharmony_ci    const gpuCounterType = new GpuCounterType();
487fb726d48Sopenharmony_ci    let index = 0;
488fb726d48Sopenharmony_ci    for (const key in maleoonCounter) {
489fb726d48Sopenharmony_ci      if (index < 5) {
490fb726d48Sopenharmony_ci        gpuCounterType.cycle.push(maleoonCounter[key]);
491fb726d48Sopenharmony_ci      }
492fb726d48Sopenharmony_ci      if (index >= 5 && index < 10) {
493fb726d48Sopenharmony_ci        gpuCounterType.drawcall.push(maleoonCounter[key]);
494fb726d48Sopenharmony_ci      }
495fb726d48Sopenharmony_ci      if (index >= 10 && index < 17) {
496fb726d48Sopenharmony_ci        gpuCounterType.shader_cycle.push(maleoonCounter[key]);
497fb726d48Sopenharmony_ci      }
498fb726d48Sopenharmony_ci      if (index >= 17 && index < 21) {
499fb726d48Sopenharmony_ci        gpuCounterType.local_count.push(maleoonCounter[key]);
500fb726d48Sopenharmony_ci      }
501fb726d48Sopenharmony_ci      if (index >= 21 && index < 24) {
502fb726d48Sopenharmony_ci        gpuCounterType.local_wr.push(maleoonCounter[key]);
503fb726d48Sopenharmony_ci      }
504fb726d48Sopenharmony_ci      index++;
505fb726d48Sopenharmony_ci    }
506fb726d48Sopenharmony_ci    return gpuCounterType;
507fb726d48Sopenharmony_ci  }
508fb726d48Sopenharmony_ci
509fb726d48Sopenharmony_ci  /**
510fb726d48Sopenharmony_ci   * 监听文件上传事件
511fb726d48Sopenharmony_ci   * @param row
512fb726d48Sopenharmony_ci   * @param start_ts
513fb726d48Sopenharmony_ci   */
514fb726d48Sopenharmony_ci  addTraceRowEventListener(startTime: number, endTime: number): void {
515fb726d48Sopenharmony_ci    this.folderRow?.uploadEl?.addEventListener('sample-file-change', (e: unknown) => {
516fb726d48Sopenharmony_ci      this.getCsvData(e).then((res: unknown) => {
517fb726d48Sopenharmony_ci        this.resetChartData(this.folderRow!);
518fb726d48Sopenharmony_ci        // @ts-ignore
519fb726d48Sopenharmony_ci        const { gpuCounterType } = this.handleCsvData(res, startTime, endTime);
520fb726d48Sopenharmony_ci        this.initGpuCounters(gpuCounterType, startTime);
521fb726d48Sopenharmony_ci        if (!this.folderRow!.folder) {
522fb726d48Sopenharmony_ci          this.folderRow!.folder = true;
523fb726d48Sopenharmony_ci        }
524fb726d48Sopenharmony_ci      });
525fb726d48Sopenharmony_ci    });
526fb726d48Sopenharmony_ci  }
527fb726d48Sopenharmony_ci
528fb726d48Sopenharmony_ci  /**
529fb726d48Sopenharmony_ci   * 清空缓存
530fb726d48Sopenharmony_ci   * @param row
531fb726d48Sopenharmony_ci   */
532fb726d48Sopenharmony_ci  // @ts-ignore
533fb726d48Sopenharmony_ci  resetChartData(row: TraceRow<unknown>): void {
534fb726d48Sopenharmony_ci    if (row.expansion) {
535fb726d48Sopenharmony_ci      row.describeEl?.click();
536fb726d48Sopenharmony_ci    }
537fb726d48Sopenharmony_ci    row.childrenList = [];
538fb726d48Sopenharmony_ci  }
539fb726d48Sopenharmony_ci
540fb726d48Sopenharmony_ci  getMinData(list: Array<unknown>): number {
541fb726d48Sopenharmony_ci    // @ts-ignore
542fb726d48Sopenharmony_ci    const sliceList = list.slice(1, 11).map((item) => Number(item.split(',')[0]));
543fb726d48Sopenharmony_ci    const nonZeroList = sliceList.filter((item) => item !== 0).sort((a, b) => a - b);
544fb726d48Sopenharmony_ci    const minIndex = sliceList.findIndex((item) => item === nonZeroList[0]);
545fb726d48Sopenharmony_ci    return minIndex;
546fb726d48Sopenharmony_ci  }
547fb726d48Sopenharmony_ci
548fb726d48Sopenharmony_ci  /**
549fb726d48Sopenharmony_ci   * 获取上传的文件内容 转为json格式
550fb726d48Sopenharmony_ci   * @param file
551fb726d48Sopenharmony_ci   * @returns
552fb726d48Sopenharmony_ci   */
553fb726d48Sopenharmony_ci  getCsvData(file: unknown): Promise<unknown> {
554fb726d48Sopenharmony_ci    return new Promise((resolve, reject) => {
555fb726d48Sopenharmony_ci      let reader = new FileReader();
556fb726d48Sopenharmony_ci      // @ts-ignore
557fb726d48Sopenharmony_ci      reader.readAsText(file.detail || file);
558fb726d48Sopenharmony_ci      reader.onloadend = (e: unknown): void => {
559fb726d48Sopenharmony_ci        // @ts-ignore
560fb726d48Sopenharmony_ci        const fileContent = e.target?.result.split(/[\r\n]/).filter(Boolean);
561fb726d48Sopenharmony_ci        try {
562fb726d48Sopenharmony_ci          resolve(fileContent);
563fb726d48Sopenharmony_ci          document.dispatchEvent(new CustomEvent('file-correct'));
564fb726d48Sopenharmony_ci        } catch (error) {
565fb726d48Sopenharmony_ci          document.dispatchEvent(new CustomEvent('file-error'));
566fb726d48Sopenharmony_ci        }
567fb726d48Sopenharmony_ci      };
568fb726d48Sopenharmony_ci    });
569fb726d48Sopenharmony_ci  }
570fb726d48Sopenharmony_ci}
571