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