1// Copyright (c) 2021 Huawei Device Co., Ltd. 2// Licensed under the Apache License, Version 2.0 (the "License"); 3// you may not use this file except in compliance with the License. 4// You may obtain a copy of the License at 5// 6// http://www.apache.org/licenses/LICENSE-2.0 7// 8// Unless required by applicable law or agreed to in writing, software 9// distributed under the License is distributed on an "AS IS" BASIS, 10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11// See the License for the specific language governing permissions and 12// limitations under the License. 13 14import { CHART_OFFSET_LEFT, MAX_COUNT, QueryEnum, TraficEnum } from './utils/QueryEnum'; 15import { threadPool } from '../SqlLite'; 16import { TraceRow } from '../../component/trace/base/TraceRow'; 17import { FrameAnimationStruct } from '../ui-worker/ProcedureWorkerFrameAnimation'; 18import { FrameDynamicStruct } from '../ui-worker/ProcedureWorkerFrameDynamic'; 19import { FrameSpacingStruct } from '../ui-worker/ProcedureWorkerFrameSpacing'; 20 21export function frameAnimationSender(row: TraceRow<FrameAnimationStruct>): Promise<FrameAnimationStruct[]> { 22 let transferAnimationDataType: number = TraficEnum.ProtoBuffer; 23 let width = row.clientWidth - CHART_OFFSET_LEFT; 24 if (transferAnimationDataType === TraficEnum.SharedArrayBuffer && !row.sharedArrayBuffers) { 25 row.sharedArrayBuffers = { 26 animationId: new SharedArrayBuffer(Uint16Array.BYTES_PER_ELEMENT * MAX_COUNT), 27 status: new SharedArrayBuffer(Uint16Array.BYTES_PER_ELEMENT * MAX_COUNT), 28 startTs: new SharedArrayBuffer(Uint16Array.BYTES_PER_ELEMENT * MAX_COUNT), 29 endTs: new SharedArrayBuffer(Float64Array.BYTES_PER_ELEMENT * MAX_COUNT), 30 dur: new SharedArrayBuffer(Float64Array.BYTES_PER_ELEMENT * MAX_COUNT), 31 depth: new SharedArrayBuffer(Uint16Array.BYTES_PER_ELEMENT * MAX_COUNT), 32 }; 33 } 34 return new Promise((resolve): void => { 35 threadPool.submitProto( 36 QueryEnum.FrameAnimationData, 37 { 38 startNS: TraceRow.range?.startNS || 0, 39 endNS: TraceRow.range?.endNS || 0, 40 recordStartNS: window.recordStartNS, 41 recordEndNS: window.recordEndNS, 42 width: width, 43 t: new Date().getTime(), 44 trafic: transferAnimationDataType, 45 sharedArrayBuffers: row.sharedArrayBuffers, 46 }, 47 (res: unknown, len: number, transfer: boolean): void => { 48 // @ts-ignore 49 resolve(animationBufferHandler(transfer ? res : row.sharedArrayBuffers, len)); 50 } 51 ); 52 }); 53} 54 55function animationBufferHandler(res: unknown, len: number): unknown[] { 56 // @ts-ignore 57 let recordNs: number = (window as unknown).recordStartNS; 58 let outArr = []; 59 // @ts-ignore 60 let animationId = new Uint16Array(res.animationId); 61 // @ts-ignore 62 let status = new Uint16Array(res.status); 63 // @ts-ignore 64 let startTs = new Float64Array(res.startTs); 65 // @ts-ignore 66 let endTs = new Float64Array(res.endTs); 67 // @ts-ignore 68 let dur = new Float64Array(res.dur); 69 // @ts-ignore 70 let depth = new Uint16Array(res.depth); 71 for (let index = 0; index < len; index++) { 72 outArr.push({ 73 animationId: animationId[index], 74 status: status[index], 75 startTs: startTs[index], 76 endTs: endTs[index], 77 dur: dur[index], 78 depth: depth[index], 79 inputTime: startTs[index] + recordNs, 80 endTime: endTs[index] + recordNs, 81 }); 82 } 83 return outArr; 84} 85 86export function frameDynamicSender(row: TraceRow<FrameDynamicStruct>): Promise<FrameDynamicStruct[]> { 87 let transferDynamicDataType: number = TraficEnum.Memory; 88 let width = row.clientWidth - CHART_OFFSET_LEFT; 89 if (transferDynamicDataType === TraficEnum.SharedArrayBuffer && !row.sharedArrayBuffers) { 90 row.sharedArrayBuffers = { 91 id: new SharedArrayBuffer(Uint16Array.BYTES_PER_ELEMENT * MAX_COUNT), 92 x: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 93 y: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 94 width: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 95 height: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 96 alpha: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 97 ts: new SharedArrayBuffer(Float64Array.BYTES_PER_ELEMENT * MAX_COUNT), 98 }; 99 } 100 return new Promise((resolve): void => { 101 threadPool.submitProto( 102 QueryEnum.FrameDynamicData, 103 { 104 startNS: TraceRow.range?.startNS || 0, 105 endNS: TraceRow.range?.endNS || 0, 106 recordStartNS: window.recordStartNS, 107 recordEndNS: window.recordEndNS, 108 width: width, 109 t: new Date().getTime(), 110 trafic: transferDynamicDataType, 111 sharedArrayBuffers: row.sharedArrayBuffers, 112 }, 113 (res: unknown, len: number, transfer: boolean): void => { 114 // @ts-ignore 115 resolve(dynamicBufferHandler(transfer ? res : row.sharedArrayBuffers, len)); 116 } 117 ); 118 }); 119} 120 121function dynamicBufferHandler(res: unknown, len: number): unknown[] { 122 let outArr = []; 123 // @ts-ignore 124 let id = new Uint16Array(res.id); 125 // @ts-ignore 126 let x = new Float32Array(res.x); 127 // @ts-ignore 128 let y = new Float32Array(res.y); 129 // @ts-ignore 130 let width = new Float32Array(res.width); 131 // @ts-ignore 132 let height = new Float32Array(res.height); 133 // @ts-ignore 134 let alpha = new Float32Array(res.alpha); 135 // @ts-ignore 136 let ts = new Float64Array(res.ts); 137 for (let index = 0; index < len; index++) { 138 outArr.push({ 139 id: id[index], 140 x: x[index], 141 y: y[index], 142 width: width[index], 143 height: height[index], 144 alpha: alpha[index], 145 ts: ts[index], 146 }); 147 } 148 return outArr; 149} 150 151export function frameSpacingSender( 152 physicalWidth: number, 153 physicalHeight: number, 154 row: TraceRow<FrameSpacingStruct> 155): Promise<FrameSpacingStruct[]> { 156 let transferSpacingDataType: number = TraficEnum.Memory; 157 let width = row.clientWidth - CHART_OFFSET_LEFT; 158 if (transferSpacingDataType === TraficEnum.SharedArrayBuffer && !row.sharedArrayBuffers) { 159 row.sharedArrayBuffers = { 160 id: new SharedArrayBuffer(Uint16Array.BYTES_PER_ELEMENT * MAX_COUNT), 161 x: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 162 y: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 163 currentFrameWidth: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 164 currentFrameHeight: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 165 currentTs: new SharedArrayBuffer(Float64Array.BYTES_PER_ELEMENT * MAX_COUNT), 166 frameSpacingResult: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 167 preTs: new SharedArrayBuffer(Float64Array.BYTES_PER_ELEMENT * MAX_COUNT), 168 preFrameWidth: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 169 preFrameHeight: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 170 preX: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 171 preY: new SharedArrayBuffer(Float32Array.BYTES_PER_ELEMENT * MAX_COUNT), 172 }; 173 } 174 return new Promise((resolve): void => { 175 threadPool.submitProto( 176 QueryEnum.FrameSpacingData, 177 { 178 physicalWidth: physicalWidth, 179 physicalHeight: physicalHeight, 180 startNS: TraceRow.range?.startNS || 0, 181 endNS: TraceRow.range?.endNS || 0, 182 recordStartNS: window.recordStartNS, 183 recordEndNS: window.recordEndNS, 184 width: width, 185 t: new Date().getTime(), 186 trafic: transferSpacingDataType, 187 sharedArrayBuffers: row.sharedArrayBuffers, 188 }, 189 (res: unknown, len: number, transfer: boolean): void => { 190 // @ts-ignore 191 resolve(spacingBufferHandler(transfer ? res : row.sharedArrayBuffers, len)); 192 } 193 ); 194 }); 195} 196 197function spacingBufferHandler(res: unknown, len: number): unknown[] { 198 let outArr = []; 199 // @ts-ignore 200 let id = new Uint16Array(res.id); 201 // @ts-ignore 202 let x = new Float32Array(res.x); 203 // @ts-ignore 204 let y = new Float32Array(res.y); 205 // @ts-ignore 206 let currentFrameWidth = new Float32Array(res.currentFrameWidth); 207 // @ts-ignore 208 let currentFrameHeight = new Float32Array(res.currentFrameHeight); 209 // @ts-ignore 210 let currentTs = new Float64Array(res.currentTs); 211 // @ts-ignore 212 let frameSpacingResult = new Float32Array(res.frameSpacingResult); 213 // @ts-ignore 214 let preTs = new Float64Array(res.preTs); 215 // @ts-ignore 216 let preFrameWidth = new Float32Array(res.preFrameWidth); 217 // @ts-ignore 218 let preFrameHeight = new Float32Array(res.preFrameHeight); 219 // @ts-ignore 220 let preX = new Float32Array(res.preX); 221 // @ts-ignore 222 let preY = new Float32Array(res.preY); 223 for (let index = 0; index < len; index++) { 224 outArr.push({ 225 id: id[index], 226 x: x[index], 227 y: y[index], 228 currentFrameWidth: currentFrameWidth[index], 229 currentFrameHeight: currentFrameHeight[index], 230 currentTs: currentTs[index], 231 frameSpacingResult: frameSpacingResult[index].toFixed(1), 232 preTs: preTs[index], 233 preFrameWidth: preFrameWidth[index], 234 preFrameHeight: preFrameHeight[index], 235 preX: preX[index], 236 preY: preY[index], 237 }); 238 } 239 return outArr; 240} 241