• 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 class XpowerGpuFreqCountStruct extends BaseStruct {
72  static maxValue: number = 0;
73  static hoverXpowerStruct: XpowerGpuFreqCountStruct | undefined;
74  static selectXpowerStruct: XpowerGpuFreqCountStruct | undefined;
75  static index = 0;
76  value: number = 0;
77  startNS: number = 0;
78  dur: number = 0; //自补充,数据库没有返回
79
80  static draw(xpowerContext: CanvasRenderingContext2D, data: XpowerGpuFreqCountStruct, maxValue: number): void {
81    if (data.frame) {
82      const width = data.frame.width || 0;
83      const drawHeight = this.calculateDrawHeight(data, maxValue);
84      const cutHeight = 0;
85
86      if (XpowerGpuFreqCountStruct.isHover(data)) {
87        this.drawHoverState(xpowerContext, data, width, drawHeight, cutHeight);
88      } else {
89        this.drawNormalState(xpowerContext, data, width, drawHeight, cutHeight);
90      }
91    }
92    this.resetCanvasContext(xpowerContext);
93  }
94
95  private static calculateDrawHeight(data: XpowerGpuFreqCountStruct, maxValue: number): number {
96    let drawHeight = Math.floor(((data.value || 0) * (data.frame!.height || 0) * 1.0) / maxValue);
97    return drawHeight === 0 ? 1 : drawHeight;
98  }
99
100  private static drawHoverState(
101    xpowerContext: CanvasRenderingContext2D,
102    data: XpowerGpuFreqCountStruct,
103    width: number,
104    drawHeight: number,
105    cutHeight: number
106  ): void {
107    xpowerContext.lineWidth = 1;
108    xpowerContext.globalAlpha = 0.6;
109    xpowerContext.fillStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
110    xpowerContext.fillRect(
111      data.frame!.x,
112      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
113      width,
114      drawHeight
115    );
116    xpowerContext.beginPath();
117    xpowerContext.arc(
118      data.frame!.x,
119      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
120      3,
121      0,
122      2 * Math.PI,
123      true
124    );
125    xpowerContext.fill();
126    xpowerContext.globalAlpha = 1.0;
127    xpowerContext.strokeStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
128    xpowerContext.stroke();
129    xpowerContext.beginPath();
130    xpowerContext.moveTo(data.frame!.x + 3, data.frame!.y + data.frame!.height - drawHeight - cutHeight);
131    xpowerContext.lineWidth = 3;
132    xpowerContext.lineTo(data.frame!.x + width, data.frame!.y + data.frame!.height - drawHeight - cutHeight);
133    xpowerContext.stroke();
134  }
135
136  private static drawNormalState(
137    xpowerContext: CanvasRenderingContext2D,
138    data: XpowerGpuFreqCountStruct,
139    width: number,
140    drawHeight: number,
141    cutHeight: number
142  ): void {
143    xpowerContext.lineWidth = 1;
144    xpowerContext.globalAlpha = 1.0;
145    xpowerContext.strokeStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
146    xpowerContext.strokeRect(
147      data.frame!.x,
148      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
149      width,
150      drawHeight
151    );
152    xpowerContext.globalAlpha = 0.6;
153    xpowerContext.fillStyle = ColorUtils.colorForTid(XpowerGpuFreqCountStruct.index);
154    xpowerContext.fillRect(
155      data.frame!.x,
156      data.frame!.y + data.frame!.height - drawHeight - cutHeight,
157      width,
158      drawHeight
159    );
160  }
161
162  private static resetCanvasContext(xpowerContext: CanvasRenderingContext2D): void {
163    xpowerContext.globalAlpha = 1.0;
164    xpowerContext.lineWidth = 1;
165  }
166
167  static isHover(xpower: XpowerGpuFreqCountStruct): boolean {
168    return (
169      xpower === XpowerGpuFreqCountStruct.hoverXpowerStruct || xpower === XpowerGpuFreqCountStruct.selectXpowerStruct
170    );
171  }
172}
173