• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import { BaseStruct, dataFilterHandler, drawLoadingFrame, isFrameContainPoint, Render } from './ProcedureWorkerCommon';
17import { TraceRow } from '../../component/trace/base/TraceRow';
18import { ColorUtils } from '../../component/trace/base/ColorUtils';
19import { SpSystemTrace } from '../../component/SpSystemTrace';
20
21export class XpowerGpuFreqCountRender extends Render {
22  renderMainThread(
23    xpowerReq: {
24      context: CanvasRenderingContext2D;
25      useCache: boolean;
26    },
27    row: TraceRow<XpowerGpuFreqCountStruct>
28  ): void {
29    let xpowerGpuFreqCountList = row.dataList;
30    let xpowerGpuFreqCountFilter = row.dataListCache;
31    let maxValue = 0;
32    if (xpowerGpuFreqCountFilter.length > 0) { // @ts-ignore
33      maxValue = xpowerGpuFreqCountFilter.map((item) => item.value).reduce((a: unknown, b: unknown) => Math.max(a, b));
34    }
35    dataFilterHandler(xpowerGpuFreqCountList, xpowerGpuFreqCountFilter, {
36      startKey: 'startNS',
37      durKey: 'dur',
38      startNS: TraceRow.range?.startNS ?? 0,
39      endNS: TraceRow.range?.endNS ?? 0,
40      totalNS: TraceRow.range?.totalNS ?? 0,
41      frame: row.frame,
42      paddingTop: 5,
43      useCache: xpowerReq.useCache || !(TraceRow.range?.refresh ?? false),
44    });
45    drawLoadingFrame(xpowerReq.context, xpowerGpuFreqCountFilter, row);
46    xpowerReq.context.beginPath();
47    let find = false;
48    for (let re of xpowerGpuFreqCountFilter) {
49      XpowerGpuFreqCountStruct.draw(xpowerReq.context, re, maxValue);
50      if (row.isHover && re.frame && isFrameContainPoint(re.frame, row.hoverX, row.hoverY)) {
51        XpowerGpuFreqCountStruct.hoverXpowerStruct = re;
52        find = true;
53      }
54    }
55    if (!find) {
56      XpowerGpuFreqCountStruct.hoverXpowerStruct = undefined;
57    }
58    xpowerReq.context.closePath();
59    let maxValueStr = String(maxValue);
60    let textMetrics = xpowerReq.context.measureText(maxValueStr);
61    xpowerReq.context.globalAlpha = 0.8;
62    xpowerReq.context.fillStyle = '#f0f0f0';
63    xpowerReq.context.fillRect(0, 5, textMetrics.width + 8, 18);
64    xpowerReq.context.globalAlpha = 1;
65    xpowerReq.context.fillStyle = '#333';
66    xpowerReq.context.textBaseline = 'middle';
67    xpowerReq.context.fillText(maxValueStr, 4, 5 + 9);
68  }
69}
70
71export function XpowerGpuFreqCountStructOnClick(clickRowType: string, sp: SpSystemTrace, entry?: XpowerGpuFreqCountStruct): Promise<unknown> {
72  return new Promise((resolve, reject) => {
73    if (clickRowType === TraceRow.ROW_TYPE_XPOWER_GPU_COUNT && (XpowerGpuFreqCountStruct.hoverXpowerStruct || entry)) {
74      XpowerGpuFreqCountStruct.selectXpowerStruct = entry || XpowerGpuFreqCountStruct.hoverXpowerStruct;
75      sp.traceSheetEL?.displayXpowerGpuFreqCountData(XpowerGpuFreqCountStruct.selectXpowerStruct!);
76      sp.timerShaftEL?.modifyFlagList(undefined);
77      reject(new Error());
78    } else {
79      resolve(null);
80    }
81  });
82}
83
84export class XpowerGpuFreqCountStruct extends BaseStruct {
85  static maxValue: number = 0;
86  static hoverXpowerStruct: XpowerGpuFreqCountStruct | undefined;
87  static selectXpowerStruct: XpowerGpuFreqCountStruct | undefined;
88  static index = 0;
89  value: number = 0;
90  startNS: number = 0;
91  dur: number = 0; //自补充,数据库没有返回
92
93  static draw(xpowerContext: CanvasRenderingContext2D, data: XpowerGpuFreqCountStruct, maxValue: number): void {
94    if (data.frame) {
95      const width = data.frame.width || 0;
96      const drawHeight = this.calculateDrawHeight(data, maxValue);
97      const cutHeight = 0;
98
99      if (XpowerGpuFreqCountStruct.isHover(data)) {
100        this.drawHoverState(xpowerContext, data, width, drawHeight, cutHeight);
101      } else {
102        this.drawNormalState(xpowerContext, data, width, drawHeight, cutHeight);
103      }
104    }
105    this.resetCanvasContext(xpowerContext);
106  }
107
108  private static calculateDrawHeight(data: XpowerGpuFreqCountStruct, maxValue: number): number {
109    let drawHeight = Math.floor(((data.value || 0) * (data.frame!.height || 0) * 1.0) / maxValue);
110    return drawHeight === 0 ? 1 : drawHeight;
111  }
112
113  private static drawHoverState(
114    xpowerContext: CanvasRenderingContext2D,
115    data: XpowerGpuFreqCountStruct,
116    width: number,
117    drawHeight: number,
118    cutHeight: number
119  ): void {
120    xpowerContext.lineWidth = 1;
121    xpowerContext.globalAlpha = 0.6;
122    xpowerContext.fillStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
123    xpowerContext.fillRect(
124      data.frame!.x,
125      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
126      width,
127      drawHeight
128    );
129    xpowerContext.beginPath();
130    xpowerContext.arc(
131      data.frame!.x,
132      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
133      3,
134      0,
135      2 * Math.PI,
136      true
137    );
138    xpowerContext.fill();
139    xpowerContext.globalAlpha = 1.0;
140    xpowerContext.strokeStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
141    xpowerContext.stroke();
142    xpowerContext.beginPath();
143    xpowerContext.moveTo(data.frame!.x + 3, data.frame!.y + data.frame!.height - drawHeight - cutHeight);
144    xpowerContext.lineWidth = 3;
145    xpowerContext.lineTo(data.frame!.x + width, data.frame!.y + data.frame!.height - drawHeight - cutHeight);
146    xpowerContext.stroke();
147  }
148
149  private static drawNormalState(
150    xpowerContext: CanvasRenderingContext2D,
151    data: XpowerGpuFreqCountStruct,
152    width: number,
153    drawHeight: number,
154    cutHeight: number
155  ): void {
156    xpowerContext.lineWidth = 1;
157    xpowerContext.globalAlpha = 1.0;
158    xpowerContext.strokeStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
159    xpowerContext.strokeRect(
160      data.frame!.x,
161      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
162      width,
163      drawHeight
164    );
165    xpowerContext.globalAlpha = 0.6;
166    xpowerContext.fillStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
167    xpowerContext.fillRect(
168      data.frame!.x,
169      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
170      width,
171      drawHeight
172    );
173  }
174
175  private static resetCanvasContext(xpowerContext: CanvasRenderingContext2D): void {
176    xpowerContext.globalAlpha = 1.0;
177    xpowerContext.lineWidth = 1;
178  }
179
180  static isHover(xpower: XpowerGpuFreqCountStruct): boolean {
181    return (
182      xpower === XpowerGpuFreqCountStruct.hoverXpowerStruct || xpower === XpowerGpuFreqCountStruct.selectXpowerStruct
183    );
184  }
185}
186