stats-gl 3.7.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.js ADDED
@@ -0,0 +1,421 @@
1
+ class StatsCore {
2
+ constructor({
3
+ trackGPU = false,
4
+ trackCPT = false,
5
+ trackHz = false,
6
+ trackFPS = true,
7
+ logsPerSecond = 4,
8
+ graphsPerSecond = 30,
9
+ samplesLog = 40,
10
+ samplesGraph = 10,
11
+ precision = 2
12
+ } = {}) {
13
+ this.gl = null;
14
+ this.ext = null;
15
+ this.gpuDevice = null;
16
+ this.gpuBackend = null;
17
+ this.renderer = null;
18
+ this.activeQuery = null;
19
+ this.gpuQueries = [];
20
+ this.threeRendererPatched = false;
21
+ this.webgpuNative = false;
22
+ this.gpuQuerySet = null;
23
+ this.gpuResolveBuffer = null;
24
+ this.gpuReadBuffers = [];
25
+ this.gpuWriteBufferIndex = 0;
26
+ this.gpuFrameCount = 0;
27
+ this.pendingResolve = null;
28
+ this.frameTimes = [];
29
+ this.renderCount = 0;
30
+ this.totalCpuDuration = 0;
31
+ this.totalGpuDuration = 0;
32
+ this.totalGpuDurationCompute = 0;
33
+ this.averageFps = { logs: [], graph: [] };
34
+ this.averageCpu = { logs: [], graph: [] };
35
+ this.averageGpu = { logs: [], graph: [] };
36
+ this.averageGpuCompute = { logs: [], graph: [] };
37
+ this.trackGPU = trackGPU;
38
+ this.trackCPT = trackCPT;
39
+ this.trackHz = trackHz;
40
+ this.trackFPS = trackFPS;
41
+ this.samplesLog = samplesLog;
42
+ this.samplesGraph = samplesGraph;
43
+ this.precision = precision;
44
+ this.logsPerSecond = logsPerSecond;
45
+ this.graphsPerSecond = graphsPerSecond;
46
+ const now = performance.now();
47
+ this.prevGraphTime = now;
48
+ this.beginTime = now;
49
+ this.prevTextTime = now;
50
+ this.prevCpuTime = now;
51
+ }
52
+ async init(canvasOrGL) {
53
+ if (!canvasOrGL) {
54
+ console.error('Stats: The "canvas" parameter is undefined.');
55
+ return;
56
+ }
57
+ if (this.handleThreeRenderer(canvasOrGL))
58
+ return;
59
+ if (await this.handleWebGPURenderer(canvasOrGL))
60
+ return;
61
+ if (this.handleNativeWebGPU(canvasOrGL))
62
+ return;
63
+ if (this.initializeWebGL(canvasOrGL)) {
64
+ if (this.trackGPU) {
65
+ this.initializeGPUTracking();
66
+ }
67
+ return;
68
+ } else {
69
+ console.error("Stats-gl: Failed to initialize WebGL context");
70
+ }
71
+ }
72
+ handleNativeWebGPU(device) {
73
+ var _a;
74
+ if (device && typeof device.createCommandEncoder === "function" && typeof device.createQuerySet === "function" && device.queue) {
75
+ this.gpuDevice = device;
76
+ this.webgpuNative = true;
77
+ if (this.trackGPU && ((_a = device.features) == null ? void 0 : _a.has("timestamp-query"))) {
78
+ this.initializeWebGPUTiming();
79
+ this.onWebGPUTimestampSupported();
80
+ }
81
+ return true;
82
+ }
83
+ return false;
84
+ }
85
+ initializeWebGPUTiming() {
86
+ if (!this.gpuDevice)
87
+ return;
88
+ this.gpuQuerySet = this.gpuDevice.createQuerySet({
89
+ type: "timestamp",
90
+ count: 2
91
+ });
92
+ this.gpuResolveBuffer = this.gpuDevice.createBuffer({
93
+ size: 16,
94
+ usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC
95
+ });
96
+ for (let i = 0; i < 2; i++) {
97
+ this.gpuReadBuffers.push(this.gpuDevice.createBuffer({
98
+ size: 16,
99
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
100
+ }));
101
+ }
102
+ }
103
+ handleThreeRenderer(renderer) {
104
+ if (renderer.isWebGLRenderer && !this.threeRendererPatched) {
105
+ this.patchThreeRenderer(renderer);
106
+ this.gl = renderer.getContext();
107
+ if (this.trackGPU) {
108
+ this.initializeGPUTracking();
109
+ }
110
+ return true;
111
+ }
112
+ return false;
113
+ }
114
+ async handleWebGPURenderer(renderer) {
115
+ var _a;
116
+ if (renderer.isWebGPURenderer) {
117
+ this.renderer = renderer;
118
+ if (this.trackGPU || this.trackCPT) {
119
+ renderer.backend.trackTimestamp = true;
120
+ if (!renderer._initialized) {
121
+ await renderer.init();
122
+ }
123
+ if (renderer.hasFeature("timestamp-query")) {
124
+ this.onWebGPUTimestampSupported();
125
+ }
126
+ }
127
+ this.info = renderer.info;
128
+ this.gpuBackend = renderer.backend;
129
+ this.gpuDevice = ((_a = renderer.backend) == null ? void 0 : _a.device) || null;
130
+ this.patchThreeWebGPU(renderer);
131
+ return true;
132
+ }
133
+ return false;
134
+ }
135
+ onWebGPUTimestampSupported() {
136
+ }
137
+ initializeWebGL(canvasOrGL) {
138
+ if (canvasOrGL instanceof WebGL2RenderingContext) {
139
+ this.gl = canvasOrGL;
140
+ } else if (canvasOrGL instanceof HTMLCanvasElement || canvasOrGL instanceof OffscreenCanvas) {
141
+ this.gl = canvasOrGL.getContext("webgl2");
142
+ if (!this.gl) {
143
+ console.error("Stats: Unable to obtain WebGL2 context.");
144
+ return false;
145
+ }
146
+ } else {
147
+ console.error(
148
+ "Stats: Invalid input type. Expected WebGL2RenderingContext, HTMLCanvasElement, or OffscreenCanvas."
149
+ );
150
+ return false;
151
+ }
152
+ return true;
153
+ }
154
+ initializeGPUTracking() {
155
+ if (this.gl) {
156
+ this.ext = this.gl.getExtension("EXT_disjoint_timer_query_webgl2");
157
+ if (this.ext) {
158
+ this.onGPUTrackingInitialized();
159
+ }
160
+ }
161
+ }
162
+ onGPUTrackingInitialized() {
163
+ }
164
+ /**
165
+ * Get timestampWrites configuration for WebGPU render pass.
166
+ * Use this when creating your render pass descriptor.
167
+ * @returns timestampWrites object or undefined if not tracking GPU
168
+ */
169
+ getTimestampWrites() {
170
+ if (!this.webgpuNative || !this.gpuQuerySet)
171
+ return void 0;
172
+ return {
173
+ querySet: this.gpuQuerySet,
174
+ beginningOfPassWriteIndex: 0,
175
+ endOfPassWriteIndex: 1
176
+ };
177
+ }
178
+ begin(encoder) {
179
+ this.beginProfiling("cpu-started");
180
+ if (this.webgpuNative) {
181
+ return;
182
+ }
183
+ if (!this.gl || !this.ext)
184
+ return;
185
+ if (this.activeQuery) {
186
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
187
+ }
188
+ this.activeQuery = this.gl.createQuery();
189
+ if (this.activeQuery) {
190
+ this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT, this.activeQuery);
191
+ }
192
+ }
193
+ end(encoder) {
194
+ this.renderCount++;
195
+ if (this.webgpuNative && encoder && this.gpuQuerySet && this.gpuResolveBuffer && this.gpuReadBuffers.length > 0) {
196
+ this.gpuFrameCount++;
197
+ const writeBuffer = this.gpuReadBuffers[this.gpuWriteBufferIndex];
198
+ if (writeBuffer.mapState === "unmapped") {
199
+ encoder.resolveQuerySet(this.gpuQuerySet, 0, 2, this.gpuResolveBuffer, 0);
200
+ encoder.copyBufferToBuffer(this.gpuResolveBuffer, 0, writeBuffer, 0, 16);
201
+ }
202
+ this.endProfiling("cpu-started", "cpu-finished", "cpu-duration");
203
+ return;
204
+ }
205
+ if (this.gl && this.ext && this.activeQuery) {
206
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
207
+ this.gpuQueries.push({ query: this.activeQuery });
208
+ this.activeQuery = null;
209
+ }
210
+ this.endProfiling("cpu-started", "cpu-finished", "cpu-duration");
211
+ }
212
+ /**
213
+ * Resolve WebGPU timestamp queries. Call this after queue.submit().
214
+ * Returns a promise that resolves to the GPU duration in milliseconds.
215
+ */
216
+ async resolveTimestampsAsync() {
217
+ if (!this.webgpuNative || this.gpuReadBuffers.length === 0) {
218
+ return this.totalGpuDuration;
219
+ }
220
+ if (this.pendingResolve) {
221
+ return this.pendingResolve;
222
+ }
223
+ const readBufferIndex = (this.gpuWriteBufferIndex + 1) % 2;
224
+ const readBuffer = this.gpuReadBuffers[readBufferIndex];
225
+ this.gpuWriteBufferIndex = (this.gpuWriteBufferIndex + 1) % 2;
226
+ if (this.gpuFrameCount < 2) {
227
+ return this.totalGpuDuration;
228
+ }
229
+ if (readBuffer.mapState !== "unmapped") {
230
+ return this.totalGpuDuration;
231
+ }
232
+ this.pendingResolve = this._resolveTimestamps(readBuffer);
233
+ try {
234
+ const result = await this.pendingResolve;
235
+ return result;
236
+ } finally {
237
+ this.pendingResolve = null;
238
+ }
239
+ }
240
+ async _resolveTimestamps(readBuffer) {
241
+ try {
242
+ await readBuffer.mapAsync(GPUMapMode.READ);
243
+ const data = new BigInt64Array(readBuffer.getMappedRange());
244
+ const startTime = data[0];
245
+ const endTime = data[1];
246
+ readBuffer.unmap();
247
+ const durationNs = Number(endTime - startTime);
248
+ this.totalGpuDuration = durationNs / 1e6;
249
+ return this.totalGpuDuration;
250
+ } catch (_) {
251
+ return this.totalGpuDuration;
252
+ }
253
+ }
254
+ processGpuQueries() {
255
+ if (!this.gl || !this.ext)
256
+ return;
257
+ this.totalGpuDuration = 0;
258
+ for (let i = this.gpuQueries.length - 1; i >= 0; i--) {
259
+ const queryInfo = this.gpuQueries[i];
260
+ const available = this.gl.getQueryParameter(queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE);
261
+ const disjoint = this.gl.getParameter(this.ext.GPU_DISJOINT_EXT);
262
+ if (available && !disjoint) {
263
+ const elapsed = this.gl.getQueryParameter(queryInfo.query, this.gl.QUERY_RESULT);
264
+ const duration = elapsed * 1e-6;
265
+ this.totalGpuDuration += duration;
266
+ this.gl.deleteQuery(queryInfo.query);
267
+ this.gpuQueries.splice(i, 1);
268
+ }
269
+ }
270
+ }
271
+ processWebGPUTimestamps() {
272
+ this.totalGpuDuration = this.info.render.timestamp;
273
+ this.totalGpuDurationCompute = this.info.compute.timestamp;
274
+ }
275
+ beginProfiling(marker) {
276
+ if (typeof performance !== "undefined") {
277
+ try {
278
+ performance.clearMarks(marker);
279
+ performance.mark(marker);
280
+ } catch (error) {
281
+ console.debug("Stats: Performance marking failed:", error);
282
+ }
283
+ }
284
+ }
285
+ endProfiling(startMarker, endMarker, measureName) {
286
+ if (typeof performance === "undefined" || !endMarker || !startMarker)
287
+ return;
288
+ try {
289
+ const entries = performance.getEntriesByName(startMarker, "mark");
290
+ if (entries.length === 0) {
291
+ this.beginProfiling(startMarker);
292
+ }
293
+ performance.clearMarks(endMarker);
294
+ performance.mark(endMarker);
295
+ performance.clearMeasures(measureName);
296
+ const cpuMeasure = performance.measure(measureName, startMarker, endMarker);
297
+ this.totalCpuDuration += cpuMeasure.duration;
298
+ performance.clearMarks(startMarker);
299
+ performance.clearMarks(endMarker);
300
+ performance.clearMeasures(measureName);
301
+ } catch (error) {
302
+ console.debug("Stats: Performance measurement failed:", error);
303
+ }
304
+ }
305
+ calculateFps() {
306
+ const currentTime = performance.now();
307
+ this.frameTimes.push(currentTime);
308
+ while (this.frameTimes.length > 0 && this.frameTimes[0] <= currentTime - 1e3) {
309
+ this.frameTimes.shift();
310
+ }
311
+ return Math.round(this.frameTimes.length);
312
+ }
313
+ updateAverages() {
314
+ this.addToAverage(this.totalCpuDuration, this.averageCpu);
315
+ this.addToAverage(this.totalGpuDuration, this.averageGpu);
316
+ if (this.info && this.totalGpuDurationCompute !== void 0) {
317
+ this.addToAverage(this.totalGpuDurationCompute, this.averageGpuCompute);
318
+ }
319
+ }
320
+ addToAverage(value, averageArray) {
321
+ averageArray.logs.push(value);
322
+ while (averageArray.logs.length > this.samplesLog) {
323
+ averageArray.logs.shift();
324
+ }
325
+ averageArray.graph.push(value);
326
+ while (averageArray.graph.length > this.samplesGraph) {
327
+ averageArray.graph.shift();
328
+ }
329
+ }
330
+ resetCounters() {
331
+ this.renderCount = 0;
332
+ this.totalCpuDuration = 0;
333
+ this.beginTime = performance.now();
334
+ }
335
+ getData() {
336
+ const fpsLogs = this.averageFps.logs;
337
+ const cpuLogs = this.averageCpu.logs;
338
+ const gpuLogs = this.averageGpu.logs;
339
+ const gpuComputeLogs = this.averageGpuCompute.logs;
340
+ return {
341
+ fps: fpsLogs.length > 0 ? fpsLogs[fpsLogs.length - 1] : 0,
342
+ cpu: cpuLogs.length > 0 ? cpuLogs[cpuLogs.length - 1] : 0,
343
+ gpu: gpuLogs.length > 0 ? gpuLogs[gpuLogs.length - 1] : 0,
344
+ gpuCompute: gpuComputeLogs.length > 0 ? gpuComputeLogs[gpuComputeLogs.length - 1] : 0
345
+ };
346
+ }
347
+ patchThreeWebGPU(renderer) {
348
+ const originalAnimationLoop = renderer.info.reset;
349
+ const statsInstance = this;
350
+ renderer.info.reset = function() {
351
+ statsInstance.beginProfiling("cpu-started");
352
+ originalAnimationLoop.call(this);
353
+ };
354
+ }
355
+ patchThreeRenderer(renderer) {
356
+ const originalRenderMethod = renderer.render;
357
+ const statsInstance = this;
358
+ renderer.render = function(scene, camera) {
359
+ statsInstance.begin();
360
+ originalRenderMethod.call(this, scene, camera);
361
+ statsInstance.end();
362
+ };
363
+ this.threeRendererPatched = true;
364
+ }
365
+ /**
366
+ * Dispose of all resources. Call when done using the stats instance.
367
+ */
368
+ dispose() {
369
+ if (this.gl) {
370
+ if (this.activeQuery && this.ext) {
371
+ try {
372
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
373
+ } catch (_) {
374
+ }
375
+ this.gl.deleteQuery(this.activeQuery);
376
+ this.activeQuery = null;
377
+ }
378
+ for (const queryInfo of this.gpuQueries) {
379
+ this.gl.deleteQuery(queryInfo.query);
380
+ }
381
+ this.gpuQueries.length = 0;
382
+ }
383
+ if (this.gpuQuerySet) {
384
+ this.gpuQuerySet.destroy();
385
+ this.gpuQuerySet = null;
386
+ }
387
+ if (this.gpuResolveBuffer) {
388
+ this.gpuResolveBuffer.destroy();
389
+ this.gpuResolveBuffer = null;
390
+ }
391
+ for (const buffer of this.gpuReadBuffers) {
392
+ if (buffer.mapState === "mapped") {
393
+ buffer.unmap();
394
+ }
395
+ buffer.destroy();
396
+ }
397
+ this.gpuReadBuffers.length = 0;
398
+ this.gpuFrameCount = 0;
399
+ this.pendingResolve = null;
400
+ this.webgpuNative = false;
401
+ this.gl = null;
402
+ this.ext = null;
403
+ this.info = void 0;
404
+ this.gpuDevice = null;
405
+ this.gpuBackend = null;
406
+ this.renderer = null;
407
+ this.frameTimes.length = 0;
408
+ this.averageFps.logs.length = 0;
409
+ this.averageFps.graph.length = 0;
410
+ this.averageCpu.logs.length = 0;
411
+ this.averageCpu.graph.length = 0;
412
+ this.averageGpu.logs.length = 0;
413
+ this.averageGpu.graph.length = 0;
414
+ this.averageGpuCompute.logs.length = 0;
415
+ this.averageGpuCompute.graph.length = 0;
416
+ }
417
+ }
418
+ export {
419
+ StatsCore
420
+ };
421
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sources":["../lib/core.ts"],"sourcesContent":null,"names":[],"mappings":"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"}