@zephyr3d/device 0.2.3 → 0.2.5
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/README.md +1 -1
- package/dist/base_types.js +7 -66
- package/dist/base_types.js.map +1 -1
- package/dist/builder/ast.js +121 -118
- package/dist/builder/ast.js.map +1 -1
- package/dist/builder/base.js +29 -25
- package/dist/builder/base.js.map +1 -1
- package/dist/builder/builtinfunc.js +62 -19
- package/dist/builder/builtinfunc.js.map +1 -1
- package/dist/builder/constructors.js +1 -1
- package/dist/builder/constructors.js.map +1 -1
- package/dist/builder/errors.js +7 -7
- package/dist/builder/errors.js.map +1 -1
- package/dist/builder/misc.js +10 -0
- package/dist/builder/misc.js.map +1 -0
- package/dist/builder/programbuilder.js +65 -34
- package/dist/builder/programbuilder.js.map +1 -1
- package/dist/builder/reflection.js.map +1 -1
- package/dist/builder/types.js +74 -74
- package/dist/builder/types.js.map +1 -1
- package/dist/device.js +72 -43
- package/dist/device.js.map +1 -1
- package/dist/gpuobject.js +82 -24
- package/dist/gpuobject.js.map +1 -1
- package/dist/helpers/drawtext.js +1 -0
- package/dist/helpers/drawtext.js.map +1 -1
- package/dist/helpers/font.js +1 -0
- package/dist/helpers/font.js.map +1 -1
- package/dist/helpers/glyphmanager.js +7 -7
- package/dist/helpers/glyphmanager.js.map +1 -1
- package/dist/helpers/textureatlas.js +3 -5
- package/dist/helpers/textureatlas.js.map +1 -1
- package/dist/index.d.ts +267 -204
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/pool.js +102 -45
- package/dist/pool.js.map +1 -1
- package/dist/timer.js.map +1 -1
- package/dist/uniformdata.js +2 -2
- package/dist/uniformdata.js.map +1 -1
- package/dist/vertexdata.js +27 -1
- package/dist/vertexdata.js.map +1 -1
- package/package.json +31 -19
package/dist/device.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
|
+
import { Observable } from '@zephyr3d/base';
|
|
1
2
|
import { CPUTimer } from './timer.js';
|
|
2
|
-
import { getVertexAttribFormat,
|
|
3
|
-
import './
|
|
4
|
-
import './builder/types.js';
|
|
3
|
+
import { getVertexAttribFormat, makeVertexBufferType, getVertexFormatSize, GPUResourceUsageFlags } from './gpuobject.js';
|
|
4
|
+
import { Pool } from './pool.js';
|
|
5
5
|
import { ProgramBuilder } from './builder/programbuilder.js';
|
|
6
|
-
import { DeviceGPUObjectAddedEvent, DeviceGPUObjectRemovedEvent, DeviceResizeEvent } from './base_types.js';
|
|
7
|
-
import '@zephyr3d/base';
|
|
8
6
|
import { DrawText } from './helpers/drawtext.js';
|
|
9
|
-
import { Pool } from './pool.js';
|
|
10
7
|
|
|
11
8
|
/**
|
|
12
9
|
* Base class for rendering device
|
|
13
10
|
* @public
|
|
14
|
-
*/ class BaseDevice {
|
|
11
|
+
*/ class BaseDevice extends Observable {
|
|
15
12
|
_canvas;
|
|
16
13
|
_canvasClientWidth;
|
|
17
14
|
_canvasClientHeight;
|
|
@@ -29,11 +26,13 @@ import { Pool } from './pool.js';
|
|
|
29
26
|
_backend;
|
|
30
27
|
_beginFrameCounter;
|
|
31
28
|
_programBuilder;
|
|
32
|
-
|
|
29
|
+
_poolMap;
|
|
30
|
+
_defaultPoolKey;
|
|
33
31
|
_temporalFramebuffer;
|
|
34
32
|
_vSync;
|
|
35
33
|
_stateStack;
|
|
36
34
|
constructor(cvs, backend){
|
|
35
|
+
super();
|
|
37
36
|
this._backend = backend;
|
|
38
37
|
this._gpuObjectList = {
|
|
39
38
|
textures: [],
|
|
@@ -76,7 +75,10 @@ import { Pool } from './pool.js';
|
|
|
76
75
|
};
|
|
77
76
|
this._stateStack = [];
|
|
78
77
|
this._beginFrameCounter = 0;
|
|
79
|
-
this.
|
|
78
|
+
this._poolMap = new Map();
|
|
79
|
+
this._defaultPoolKey = Symbol('defaultPool');
|
|
80
|
+
this._poolMap.set(this._defaultPoolKey, new Pool(this, this._defaultPoolKey));
|
|
81
|
+
this._temporalFramebuffer = false;
|
|
80
82
|
this._temporalFramebuffer = false;
|
|
81
83
|
this._vSync = true;
|
|
82
84
|
this._registerEventHandlers();
|
|
@@ -106,7 +108,7 @@ import { Pool } from './pool.js';
|
|
|
106
108
|
this._vSync = !!val;
|
|
107
109
|
}
|
|
108
110
|
get pool() {
|
|
109
|
-
return this.
|
|
111
|
+
return this._poolMap.get(this._defaultPoolKey);
|
|
110
112
|
}
|
|
111
113
|
get runLoopFunction() {
|
|
112
114
|
return this._runLoopFunc;
|
|
@@ -114,6 +116,17 @@ import { Pool } from './pool.js';
|
|
|
114
116
|
get programBuilder() {
|
|
115
117
|
return this._programBuilder;
|
|
116
118
|
}
|
|
119
|
+
poolExists(key) {
|
|
120
|
+
return this._poolMap.has(key);
|
|
121
|
+
}
|
|
122
|
+
getPool(key) {
|
|
123
|
+
let pool = this._poolMap.get(key);
|
|
124
|
+
if (!pool) {
|
|
125
|
+
pool = new Pool(this, key);
|
|
126
|
+
this._poolMap.set(key, pool);
|
|
127
|
+
}
|
|
128
|
+
return pool;
|
|
129
|
+
}
|
|
117
130
|
setFont(fontName) {
|
|
118
131
|
DrawText.setFont(this, fontName);
|
|
119
132
|
}
|
|
@@ -126,20 +139,13 @@ import { Pool } from './pool.js';
|
|
|
126
139
|
if (!Array.isArray(colorOrRT)) {
|
|
127
140
|
newRT = colorOrRT ?? null;
|
|
128
141
|
} else {
|
|
129
|
-
|
|
130
|
-
newRT = this._pool.createTemporalFramebuffer(false, colorAttachments, depth, sampleCount, true);
|
|
131
|
-
for(let i = 0; i < colorOrRT.length; i++){
|
|
132
|
-
const rt = colorOrRT[i];
|
|
133
|
-
newRT.setColorAttachmentMipLevel(i, rt.texture ? rt.miplevel ?? 0 : 0);
|
|
134
|
-
newRT.setColorAttachmentLayer(i, rt.texture ? rt.face ?? 0 : 0);
|
|
135
|
-
newRT.setColorAttachmentCubeFace(i, rt.texture ? rt.layer ?? 0 : 0);
|
|
136
|
-
}
|
|
142
|
+
newRT = this.pool.fetchTemporalFramebuffer(false, 0, 0, colorOrRT, depth, true, sampleCount);
|
|
137
143
|
temporal = true;
|
|
138
144
|
}
|
|
139
145
|
const currentRT = this.getFramebuffer();
|
|
140
146
|
if (currentRT !== newRT) {
|
|
141
147
|
if (this._temporalFramebuffer) {
|
|
142
|
-
this.
|
|
148
|
+
this.pool.releaseFrameBuffer(currentRT);
|
|
143
149
|
}
|
|
144
150
|
this._temporalFramebuffer = temporal;
|
|
145
151
|
this._setFramebuffer(newRT);
|
|
@@ -150,22 +156,17 @@ import { Pool } from './pool.js';
|
|
|
150
156
|
if (remove) {
|
|
151
157
|
this.removeGPUObject(obj);
|
|
152
158
|
}
|
|
153
|
-
if (
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
this._disposeObjectList.push(obj);
|
|
158
|
-
}
|
|
159
|
+
if (this.isContextLost()) {
|
|
160
|
+
obj.destroy();
|
|
161
|
+
} else {
|
|
162
|
+
this._disposeObjectList.push(obj);
|
|
159
163
|
}
|
|
160
|
-
obj.dispatchEvent(null, 'disposed');
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
|
-
|
|
166
|
+
restoreObject(obj) {
|
|
164
167
|
if (obj && obj.disposed && !this.isContextLost()) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
await obj.restoreHandler(obj);
|
|
168
|
-
}
|
|
168
|
+
obj.restore();
|
|
169
|
+
obj.restoreHandler?.(obj);
|
|
169
170
|
}
|
|
170
171
|
}
|
|
171
172
|
enableGPUTimeRecording(enable) {
|
|
@@ -186,7 +187,7 @@ import { Pool } from './pool.js';
|
|
|
186
187
|
this._beginFrameCounter++;
|
|
187
188
|
this._beginFrameTime = this._cpuTimer.now();
|
|
188
189
|
this.updateFrameInfo();
|
|
189
|
-
this.
|
|
190
|
+
this._poolMap.forEach((pool)=>pool.autoRelease());
|
|
190
191
|
return this.onBeginFrame();
|
|
191
192
|
}
|
|
192
193
|
endFrame() {
|
|
@@ -194,6 +195,7 @@ import { Pool } from './pool.js';
|
|
|
194
195
|
this._beginFrameCounter--;
|
|
195
196
|
if (this._beginFrameCounter === 0) {
|
|
196
197
|
this._endFrameTime = this._cpuTimer.now();
|
|
198
|
+
this._frameInfo.frameCounter++;
|
|
197
199
|
this.onEndFrame();
|
|
198
200
|
}
|
|
199
201
|
}
|
|
@@ -203,7 +205,7 @@ import { Pool } from './pool.js';
|
|
|
203
205
|
}
|
|
204
206
|
createInterleavedVertexBuffer(attribFormats, data, options) {
|
|
205
207
|
if (options && options.usage && options.usage !== 'vertex') {
|
|
206
|
-
console.error(`
|
|
208
|
+
console.error(`createInterleavedVertexBuffer() failed: options.usage must be 'vertex' or not set`);
|
|
207
209
|
return null;
|
|
208
210
|
}
|
|
209
211
|
let size = 0;
|
|
@@ -256,6 +258,9 @@ import { Pool } from './pool.js';
|
|
|
256
258
|
this._frameInfo.drawCalls++;
|
|
257
259
|
this._drawInstanced(primitiveType, first, count, numInstances);
|
|
258
260
|
}
|
|
261
|
+
executeRenderBundle(renderBundle) {
|
|
262
|
+
this._frameInfo.drawCalls += this._executeRenderBundle(renderBundle);
|
|
263
|
+
}
|
|
259
264
|
compute(workgroupCountX, workgroupCountY, workgroupCountZ) {
|
|
260
265
|
this._frameInfo.computeCalls++;
|
|
261
266
|
this._compute(workgroupCountX, workgroupCountY, workgroupCountZ);
|
|
@@ -265,6 +270,22 @@ import { Pool } from './pool.js';
|
|
|
265
270
|
this._frameInfo.nextFrameCall.push(f);
|
|
266
271
|
}
|
|
267
272
|
}
|
|
273
|
+
async runNextFrameAsync(f) {
|
|
274
|
+
return new Promise((resolve)=>{
|
|
275
|
+
if (f) {
|
|
276
|
+
this._frameInfo.nextFrameCall.push(()=>{
|
|
277
|
+
const p = f();
|
|
278
|
+
if (p instanceof Promise) {
|
|
279
|
+
p.then(()=>resolve());
|
|
280
|
+
} else {
|
|
281
|
+
resolve();
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
} else {
|
|
285
|
+
resolve();
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
268
289
|
exitLoop() {
|
|
269
290
|
if (this._runningLoop !== null) {
|
|
270
291
|
if (this._runningLoop !== 0) {
|
|
@@ -373,7 +394,7 @@ import { Pool } from './pool.js';
|
|
|
373
394
|
const list = this.getGPUObjectList(obj);
|
|
374
395
|
if (list && list.indexOf(obj) < 0) {
|
|
375
396
|
list.push(obj);
|
|
376
|
-
this.dispatchEvent(
|
|
397
|
+
this.dispatchEvent('gpuobject_added', obj);
|
|
377
398
|
}
|
|
378
399
|
}
|
|
379
400
|
removeGPUObject(obj) {
|
|
@@ -382,7 +403,7 @@ import { Pool } from './pool.js';
|
|
|
382
403
|
const index = list.indexOf(obj);
|
|
383
404
|
if (index >= 0) {
|
|
384
405
|
list.splice(index, 1);
|
|
385
|
-
this.dispatchEvent(
|
|
406
|
+
this.dispatchEvent('gpuobject_removed', obj);
|
|
386
407
|
}
|
|
387
408
|
}
|
|
388
409
|
}
|
|
@@ -393,14 +414,14 @@ import { Pool } from './pool.js';
|
|
|
393
414
|
if (this._canvasClientWidth !== this._canvas.clientWidth || this._canvasClientHeight !== this._canvas.clientHeight) {
|
|
394
415
|
this._canvasClientWidth = this._canvas.clientWidth;
|
|
395
416
|
this._canvasClientHeight = this._canvas.clientHeight;
|
|
396
|
-
this.dispatchEvent(
|
|
417
|
+
this.dispatchEvent('resize', this._canvasClientWidth, this._canvasClientHeight);
|
|
397
418
|
}
|
|
398
419
|
}
|
|
399
420
|
_registerEventHandlers() {
|
|
400
421
|
const canvas = this._canvas;
|
|
401
422
|
const that = this;
|
|
402
423
|
if (window.ResizeObserver) {
|
|
403
|
-
new window.ResizeObserver((
|
|
424
|
+
new window.ResizeObserver(()=>{
|
|
404
425
|
that._onresize();
|
|
405
426
|
}).observe(canvas, {});
|
|
406
427
|
} else {
|
|
@@ -422,7 +443,6 @@ import { Pool } from './pool.js';
|
|
|
422
443
|
}
|
|
423
444
|
}
|
|
424
445
|
updateFrameInfo() {
|
|
425
|
-
this._frameInfo.frameCounter++;
|
|
426
446
|
this._frameInfo.drawCalls = 0;
|
|
427
447
|
this._frameInfo.computeCalls = 0;
|
|
428
448
|
const now = this._beginFrameTime;
|
|
@@ -504,8 +524,7 @@ import { Pool } from './pool.js';
|
|
|
504
524
|
this._disposeObjectList = [];
|
|
505
525
|
}
|
|
506
526
|
}
|
|
507
|
-
|
|
508
|
-
const promises = [];
|
|
527
|
+
reloadAll() {
|
|
509
528
|
for (const list of [
|
|
510
529
|
this._gpuObjectList.buffers,
|
|
511
530
|
this._gpuObjectList.textures,
|
|
@@ -517,16 +536,18 @@ import { Pool } from './pool.js';
|
|
|
517
536
|
]){
|
|
518
537
|
// obj.reload() may change the list, so make a copy first
|
|
519
538
|
for (const obj of list.slice()){
|
|
520
|
-
|
|
539
|
+
obj.reload();
|
|
521
540
|
}
|
|
522
541
|
}
|
|
523
|
-
Promise.all(promises);
|
|
524
542
|
return;
|
|
525
543
|
}
|
|
526
544
|
parseTextureOptions(options) {
|
|
527
|
-
const noMipmapFlag = options?.
|
|
545
|
+
const noMipmapFlag = options?.mipmapping === false ? GPUResourceUsageFlags.TF_NO_MIPMAP : 0;
|
|
528
546
|
const writableFlag = options?.writable ? GPUResourceUsageFlags.TF_WRITABLE : 0;
|
|
529
547
|
const dynamicFlag = options?.dynamic ? GPUResourceUsageFlags.DYNAMIC : 0;
|
|
548
|
+
if (noMipmapFlag && options?.samplerOptions) {
|
|
549
|
+
options.samplerOptions.mipFilter = 'none';
|
|
550
|
+
}
|
|
530
551
|
return noMipmapFlag | writableFlag | dynamicFlag;
|
|
531
552
|
}
|
|
532
553
|
parseBufferOptions(options, defaultUsage) {
|
|
@@ -552,6 +573,14 @@ import { Pool } from './pool.js';
|
|
|
552
573
|
usageFlag = GPUResourceUsageFlags.BF_WRITE;
|
|
553
574
|
options.managed = false;
|
|
554
575
|
break;
|
|
576
|
+
case 'pack-pixel':
|
|
577
|
+
usageFlag = GPUResourceUsageFlags.BF_PACK_PIXEL;
|
|
578
|
+
options.managed = false;
|
|
579
|
+
break;
|
|
580
|
+
case 'unpack-pixel':
|
|
581
|
+
usageFlag = GPUResourceUsageFlags.BF_UNPACK_PIXEL;
|
|
582
|
+
options.managed = false;
|
|
583
|
+
break;
|
|
555
584
|
default:
|
|
556
585
|
usageFlag = 0;
|
|
557
586
|
break;
|
package/dist/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"device.js","sources":["../src/device.ts"],"sourcesContent":["import { type Vector4, type TypedArray, type IEventTarget, Observable } from '@zephyr3d/base';\r\nimport type { ITimer } from './timer';\r\nimport { CPUTimer } from './timer';\r\nimport type {\r\n BlendingState,\r\n ColorState,\r\n DepthState,\r\n RasterizerState,\r\n RenderStateSet,\r\n StencilState\r\n} from './render_states';\r\nimport type {\r\n FrameBufferOptions,\r\n SamplerOptions,\r\n TextureSampler,\r\n Texture2D,\r\n Texture3D,\r\n TextureCube,\r\n VertexLayout,\r\n GPUDataBuffer,\r\n FrameBuffer,\r\n GPUProgram,\r\n GPUObject,\r\n StructuredBuffer,\r\n BindGroupLayout,\r\n BindGroup,\r\n IndexBuffer,\r\n TextureVideo,\r\n TextureMipmapData,\r\n TextureImageElement,\r\n Texture2DArray,\r\n TextureCreationOptions,\r\n BufferCreationOptions,\r\n BufferUsage,\r\n VertexSemantic,\r\n VertexAttribFormat,\r\n VertexLayoutOptions,\r\n BaseTexture,\r\n RenderBundle\r\n} from './gpuobject';\r\nimport {\r\n GPUResourceUsageFlags,\r\n makeVertexBufferType,\r\n getVertexFormatSize,\r\n getVertexAttribFormat\r\n} from './gpuobject';\r\nimport type { PBComputeOptions, PBRenderOptions, PBStructTypeInfo } from './builder';\r\nimport { ProgramBuilder } from './builder';\r\nimport type {\r\n DataType,\r\n PrimitiveType,\r\n TextureFormat,\r\n GPUObjectList,\r\n FrameInfo,\r\n DeviceCaps,\r\n GPUProgramConstructParams,\r\n AbstractDevice,\r\n DeviceOptions,\r\n DeviceEventMap,\r\n DeviceViewport\r\n} from './base_types';\r\nimport { DrawText } from './helpers';\r\nimport { Pool } from './pool';\r\n\r\n/**\r\n * The device backend interface\r\n * @public\r\n */\r\nexport interface DeviceBackend {\r\n typeName(): string;\r\n supported(): boolean;\r\n createDevice(cvs: HTMLCanvasElement, options?: DeviceOptions): Promise<AbstractDevice>;\r\n}\r\n\r\ntype DeviceState = {\r\n framebuffer: FrameBuffer;\r\n windowOrderReversed: boolean;\r\n viewport: DeviceViewport;\r\n scissor: DeviceViewport;\r\n renderStateSet: RenderStateSet;\r\n program: GPUProgram;\r\n vertexLayout: VertexLayout;\r\n bindGroups: [BindGroup, Iterable<number>][];\r\n};\r\n\r\n/**\r\n * Base class for rendering device\r\n * @public\r\n */\r\nexport abstract class BaseDevice extends Observable<DeviceEventMap> {\r\n protected _canvas: HTMLCanvasElement;\r\n protected _canvasClientWidth: number;\r\n protected _canvasClientHeight: number;\r\n protected _gpuObjectList: GPUObjectList;\r\n protected _gpuMemCost: number;\r\n protected _disposeObjectList: GPUObject[];\r\n protected _beginFrameTime: number;\r\n protected _endFrameTime: number;\r\n protected _frameInfo: FrameInfo;\r\n protected _cpuTimer: CPUTimer;\r\n protected _gpuTimer: ITimer;\r\n protected _runningLoop: number;\r\n protected _fpsCounter: { time: number; frame: number };\r\n protected _runLoopFunc: (device: AbstractDevice) => void;\r\n protected _backend: DeviceBackend;\r\n protected _beginFrameCounter: number;\r\n protected _programBuilder: ProgramBuilder;\r\n protected _poolMap: Map<string | symbol, Pool>;\r\n protected _defaultPoolKey: symbol;\r\n protected _temporalFramebuffer: boolean;\r\n protected _vSync: boolean;\r\n private readonly _stateStack: DeviceState[];\r\n constructor(cvs: HTMLCanvasElement, backend: DeviceBackend) {\r\n super();\r\n this._backend = backend;\r\n this._gpuObjectList = {\r\n textures: [],\r\n samplers: [],\r\n buffers: [],\r\n programs: [],\r\n framebuffers: [],\r\n vertexArrayObjects: [],\r\n bindGroups: []\r\n };\r\n this._canvas = cvs;\r\n this._canvas.setAttribute('tabindex', '1');\r\n this._canvasClientWidth = cvs.clientWidth;\r\n this._canvasClientHeight = cvs.clientHeight;\r\n this._gpuMemCost = 0;\r\n this._disposeObjectList = [];\r\n this._beginFrameTime = 0;\r\n this._endFrameTime = 0;\r\n this._runLoopFunc = null;\r\n this._frameInfo = {\r\n frameCounter: 0,\r\n frameTimestamp: 0,\r\n elapsedTimeCPU: 0,\r\n elapsedTimeGPU: 0,\r\n elapsedFrame: 0,\r\n elapsedOverall: 0,\r\n FPS: 0,\r\n drawCalls: 0,\r\n computeCalls: 0,\r\n nextFrameCall: [],\r\n nextFrameCallNext: []\r\n };\r\n this._programBuilder = new ProgramBuilder(this);\r\n this._cpuTimer = new CPUTimer();\r\n this._gpuTimer = null;\r\n this._runningLoop = null;\r\n this._fpsCounter = { time: 0, frame: 0 };\r\n this._stateStack = [];\r\n this._beginFrameCounter = 0;\r\n this._poolMap = new Map();\r\n this._defaultPoolKey = Symbol('defaultPool');\r\n this._poolMap.set(this._defaultPoolKey, new Pool(this, this._defaultPoolKey));\r\n this._temporalFramebuffer = false;\r\n this._temporalFramebuffer = false;\r\n this._vSync = true;\r\n this._registerEventHandlers();\r\n }\r\n abstract getAdapterInfo(): any;\r\n abstract getFrameBufferSampleCount(): number;\r\n abstract isContextLost(): boolean;\r\n abstract getScale(): number;\r\n abstract getDrawingBufferWidth(): number;\r\n abstract getDrawingBufferHeight(): number;\r\n abstract getBackBufferWidth(): number;\r\n abstract getBackBufferHeight(): number;\r\n abstract getDeviceCaps(): DeviceCaps;\r\n abstract initContext(): Promise<void>;\r\n abstract clearFrameBuffer(clearColor: Vector4, clearDepth: number, clearStencil: number);\r\n abstract createGPUTimer(): ITimer;\r\n abstract createRenderStateSet(): RenderStateSet;\r\n abstract createBlendingState(): BlendingState;\r\n abstract createColorState(): ColorState;\r\n abstract createRasterizerState(): RasterizerState;\r\n abstract createDepthState(): DepthState;\r\n abstract createStencilState(): StencilState;\r\n abstract createSampler(options: SamplerOptions): TextureSampler;\r\n abstract createTextureFromMipmapData<T extends BaseTexture>(\r\n data: TextureMipmapData,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): T;\r\n abstract createTexture2D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n options?: TextureCreationOptions\r\n ): Texture2D;\r\n abstract createTexture2DFromImage(\r\n element: TextureImageElement,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Texture2D;\r\n abstract createTexture2DArray(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Texture2DArray;\r\n abstract createTexture2DArrayFromImages(\r\n elements: TextureImageElement[],\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Texture2DArray;\r\n abstract createTexture3D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number,\r\n options?: TextureCreationOptions\r\n ): Texture3D;\r\n abstract createCubeTexture(\r\n format: TextureFormat,\r\n size: number,\r\n options?: TextureCreationOptions\r\n ): TextureCube;\r\n abstract createTextureVideo(el: HTMLVideoElement, samplerOptions?: SamplerOptions): TextureVideo;\r\n abstract reverseVertexWindingOrder(reverse: boolean): void;\r\n abstract isWindingOrderReversed(): boolean;\r\n abstract copyTexture2D(src: Texture2D, srcLevel: number, dst: Texture2D, dstLevel: number);\r\n abstract copyFramebufferToTexture2D(src: FrameBuffer, index: number, dst: Texture2D, level: number);\r\n // program\r\n abstract createGPUProgram(params: GPUProgramConstructParams): GPUProgram;\r\n abstract createBindGroup(layout: BindGroupLayout): BindGroup;\r\n abstract createBuffer(sizeInBytes: number, options: BufferCreationOptions): GPUDataBuffer;\r\n abstract copyBuffer(\r\n sourceBuffer: GPUDataBuffer,\r\n destBuffer: GPUDataBuffer,\r\n srcOffset: number,\r\n dstOffset: number,\r\n bytes: number\r\n );\r\n abstract createIndexBuffer(\r\n data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>,\r\n options?: BufferCreationOptions\r\n ): IndexBuffer;\r\n abstract createStructuredBuffer(\r\n structureType: PBStructTypeInfo,\r\n options: BufferCreationOptions,\r\n data?: TypedArray\r\n ): StructuredBuffer;\r\n abstract createVertexLayout(options: VertexLayoutOptions): VertexLayout;\r\n abstract createFrameBuffer(\r\n colorAttachments: BaseTexture[],\r\n depthAttachment: BaseTexture,\r\n options?: FrameBufferOptions\r\n ): FrameBuffer;\r\n // render related\r\n abstract setViewport(vp?: number[] | DeviceViewport): void;\r\n abstract getViewport(): DeviceViewport;\r\n abstract setScissor(scissor?: number[] | DeviceViewport): void;\r\n abstract getScissor(): DeviceViewport;\r\n abstract setProgram(program: GPUProgram): void;\r\n abstract getProgram(): GPUProgram;\r\n abstract setVertexLayout(vertexData: VertexLayout): void;\r\n abstract getVertexLayout(): VertexLayout;\r\n abstract setRenderStates(renderStates: RenderStateSet): void;\r\n abstract getRenderStates(): RenderStateSet;\r\n abstract getFramebuffer(): FrameBuffer;\r\n abstract setBindGroup(index: number, bindGroup: BindGroup, dynamicOffsets?: Iterable<number>);\r\n abstract getBindGroup(index: number): [BindGroup, Iterable<number>];\r\n abstract flush(): void;\r\n abstract nextFrame(callback: () => void): number;\r\n abstract cancelNextFrame(handle: number);\r\n // misc\r\n abstract readPixels(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: TypedArray\r\n ): Promise<void>;\r\n abstract readPixelsToBuffer(\r\n index: number,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number,\r\n buffer: GPUDataBuffer\r\n ): void;\r\n abstract beginCapture(): void;\r\n abstract endCapture(): RenderBundle;\r\n abstract looseContext(): void;\r\n abstract restoreContext(): void;\r\n protected abstract _executeRenderBundle(renderBundle: RenderBundle): number;\r\n protected abstract _draw(primitiveType: PrimitiveType, first: number, count: number): void;\r\n protected abstract _drawInstanced(\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ): void;\r\n protected abstract _compute(\r\n workgroupCountX: number,\r\n workgroupCountY: number,\r\n workgroupCountZ: number\r\n ): void;\r\n get backend(): DeviceBackend {\r\n return this._backend;\r\n }\r\n get videoMemoryUsage(): number {\r\n return this._gpuMemCost;\r\n }\r\n get frameInfo(): FrameInfo {\r\n return this._frameInfo;\r\n }\r\n get isRendering(): boolean {\r\n return this._runningLoop !== null;\r\n }\r\n get canvas(): HTMLCanvasElement {\r\n return this._canvas;\r\n }\r\n get type(): string {\r\n return this._backend.typeName();\r\n }\r\n get vSync(): boolean {\r\n return this._vSync;\r\n }\r\n set vSync(val: boolean) {\r\n this._vSync = !!val;\r\n }\r\n get pool(): Pool {\r\n return this._poolMap.get(this._defaultPoolKey);\r\n }\r\n get runLoopFunction(): (device: AbstractDevice) => void {\r\n return this._runLoopFunc;\r\n }\r\n get programBuilder(): ProgramBuilder {\r\n return this._programBuilder;\r\n }\r\n poolExists(key: string | symbol): boolean {\r\n return this._poolMap.has(key);\r\n }\r\n getPool(key: string | symbol): Pool {\r\n let pool = this._poolMap.get(key);\r\n if (!pool) {\r\n pool = new Pool(this, key);\r\n this._poolMap.set(key, pool);\r\n }\r\n return pool;\r\n }\r\n setFont(fontName: string) {\r\n DrawText.setFont(this, fontName);\r\n }\r\n drawText(text: string, x: number, y: number, color: string) {\r\n DrawText.drawText(this, text, color, x, y);\r\n }\r\n setFramebuffer(rt: FrameBuffer);\r\n setFramebuffer(color: BaseTexture[], depth?: BaseTexture, sampleCount?: number);\r\n setFramebuffer(colorOrRT: BaseTexture[] | FrameBuffer, depth?: BaseTexture, sampleCount?: number) {\r\n let newRT: FrameBuffer = null;\r\n let temporal = false;\r\n if (!Array.isArray(colorOrRT)) {\r\n newRT = colorOrRT ?? null;\r\n } else {\r\n newRT = this.pool.fetchTemporalFramebuffer(false, 0, 0, colorOrRT, depth, true, sampleCount);\r\n temporal = true;\r\n }\r\n const currentRT = this.getFramebuffer();\r\n if (currentRT !== newRT) {\r\n if (this._temporalFramebuffer) {\r\n this.pool.releaseFrameBuffer(currentRT);\r\n }\r\n this._temporalFramebuffer = temporal;\r\n this._setFramebuffer(newRT);\r\n }\r\n }\r\n disposeObject(obj: GPUObject, remove = true) {\r\n if (obj) {\r\n if (remove) {\r\n this.removeGPUObject(obj);\r\n }\r\n if (this.isContextLost()) {\r\n obj.destroy();\r\n } else {\r\n this._disposeObjectList.push(obj);\r\n }\r\n }\r\n }\r\n restoreObject(obj: GPUObject) {\r\n if (obj && obj.disposed && !this.isContextLost()) {\r\n obj.restore();\r\n obj.restoreHandler?.(obj);\r\n }\r\n }\r\n enableGPUTimeRecording(enable: boolean) {\r\n if (enable && !this._gpuTimer) {\r\n this._gpuTimer = this.createGPUTimer();\r\n } else if (!enable) {\r\n this._gpuTimer?.end();\r\n this._gpuTimer = null;\r\n }\r\n }\r\n beginFrame(): boolean {\r\n if (this._beginFrameCounter === 0) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n this._beginFrameCounter++;\r\n this._beginFrameTime = this._cpuTimer.now();\r\n this.updateFrameInfo();\r\n this._poolMap.forEach((pool) => pool.autoRelease());\r\n return this.onBeginFrame();\r\n }\r\n endFrame(): void {\r\n if (this._beginFrameCounter > 0) {\r\n this._beginFrameCounter--;\r\n if (this._beginFrameCounter === 0) {\r\n this._endFrameTime = this._cpuTimer.now();\r\n this._frameInfo.frameCounter++;\r\n this.onEndFrame();\r\n }\r\n }\r\n }\r\n getVertexAttribFormat(\r\n semantic: VertexSemantic,\r\n dataType: DataType,\r\n componentCount: number\r\n ): VertexAttribFormat {\r\n return getVertexAttribFormat(semantic, dataType, componentCount);\r\n }\r\n createInterleavedVertexBuffer(\r\n attribFormats: VertexAttribFormat[],\r\n data: TypedArray,\r\n options?: BufferCreationOptions\r\n ): StructuredBuffer {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createInterleavedVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n let size = 0;\r\n for (const format of attribFormats) {\r\n size += getVertexFormatSize(format);\r\n }\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / size) >> 0, ...attribFormats);\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n createVertexBuffer(\r\n attribFormat: VertexAttribFormat,\r\n data: TypedArray,\r\n options?: BufferCreationOptions\r\n ): StructuredBuffer {\r\n if (options && options.usage && options.usage !== 'vertex') {\r\n console.error(`createVertexBuffer() failed: options.usage must be 'vertex' or not set`);\r\n return null;\r\n }\r\n const count = getVertexFormatSize(attribFormat);\r\n const vertexBufferType = makeVertexBufferType((data.byteLength / count) >> 0, attribFormat);\r\n const opt = Object.assign(\r\n {\r\n usage: 'vertex',\r\n dynamic: false,\r\n managed: true,\r\n storage: false\r\n },\r\n options || {}\r\n );\r\n if (opt.storage) {\r\n opt.dynamic = false;\r\n opt.managed = false;\r\n }\r\n if (opt.dynamic) {\r\n opt.managed = false;\r\n }\r\n return this.createStructuredBuffer(vertexBufferType, opt, data);\r\n }\r\n draw(primitiveType: PrimitiveType, first: number, count: number): void {\r\n this._frameInfo.drawCalls++;\r\n this._draw(primitiveType, first, count);\r\n }\r\n drawInstanced(primitiveType: PrimitiveType, first: number, count: number, numInstances: number): void {\r\n this._frameInfo.drawCalls++;\r\n this._drawInstanced(primitiveType, first, count, numInstances);\r\n }\r\n executeRenderBundle(renderBundle: RenderBundle) {\r\n this._frameInfo.drawCalls += this._executeRenderBundle(renderBundle);\r\n }\r\n compute(workgroupCountX, workgroupCountY, workgroupCountZ): void {\r\n this._frameInfo.computeCalls++;\r\n this._compute(workgroupCountX, workgroupCountY, workgroupCountZ);\r\n }\r\n runNextFrame(f: () => void) {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(f);\r\n }\r\n }\r\n async runNextFrameAsync(f: () => void | Promise<void>): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (f) {\r\n this._frameInfo.nextFrameCall.push(() => {\r\n const p = f();\r\n if (p instanceof Promise) {\r\n p.then(() => resolve());\r\n } else {\r\n resolve();\r\n }\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n exitLoop() {\r\n if (this._runningLoop !== null) {\r\n if (this._runningLoop !== 0) {\r\n cancelAnimationFrame(this._runningLoop);\r\n } else {\r\n this.cancelNextFrame(this._runningLoop);\r\n }\r\n this._runningLoop = null;\r\n }\r\n }\r\n runLoop(func: (device: AbstractDevice) => void) {\r\n if (this._runningLoop !== null) {\r\n console.error('Device.runLoop() can not be nested');\r\n return;\r\n }\r\n if (!func) {\r\n console.error('Device.runLoop() argment error');\r\n return;\r\n }\r\n const that = this;\r\n that._runLoopFunc = func;\r\n (function entry() {\r\n if (that._vSync) {\r\n that._runningLoop = requestAnimationFrame(entry);\r\n } else {\r\n that._runningLoop = that.nextFrame(() => {\r\n if (that._runningLoop !== null) {\r\n entry();\r\n }\r\n });\r\n }\r\n if (that.beginFrame()) {\r\n that._runLoopFunc(that as unknown as AbstractDevice);\r\n that.endFrame();\r\n }\r\n })();\r\n }\r\n pushDeviceStates() {\r\n this._stateStack.push({\r\n windowOrderReversed: this.isWindingOrderReversed(),\r\n framebuffer: this.getFramebuffer(),\r\n viewport: this.getViewport(),\r\n scissor: this.getScissor(),\r\n program: this.getProgram(),\r\n renderStateSet: this.getRenderStates(),\r\n vertexLayout: this.getVertexLayout(),\r\n bindGroups: [this.getBindGroup(0), this.getBindGroup(1), this.getBindGroup(2), this.getBindGroup(3)]\r\n });\r\n }\r\n popDeviceStates() {\r\n if (this._stateStack.length === 0) {\r\n console.error('Device.popDeviceStates(): stack is empty');\r\n } else {\r\n const top = this._stateStack.pop();\r\n this.setFramebuffer(top.framebuffer);\r\n this.setViewport(top.viewport);\r\n this.setScissor(top.scissor);\r\n this.setProgram(top.program);\r\n this.setRenderStates(top.renderStateSet);\r\n this.setVertexLayout(top.vertexLayout);\r\n this.setBindGroup(0, ...top.bindGroups[0]);\r\n this.setBindGroup(1, ...top.bindGroups[1]);\r\n this.setBindGroup(2, ...top.bindGroups[2]);\r\n this.setBindGroup(3, ...top.bindGroups[3]);\r\n this.reverseVertexWindingOrder(top.windowOrderReversed);\r\n }\r\n }\r\n getGPUObjects(): GPUObjectList {\r\n return this._gpuObjectList;\r\n }\r\n getGPUObjectById(uid: number): GPUObject {\r\n for (const list of [\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.vertexArrayObjects\r\n ]) {\r\n for (const obj of list) {\r\n if (obj.uid === uid) {\r\n return obj;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n screenToDevice(val: number): number {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScale());\r\n }\r\n deviceToScreen(val: number): number {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScale());\r\n }\r\n buildRenderProgram(options: PBRenderOptions): GPUProgram {\r\n return this._programBuilder.buildRenderProgram(options);\r\n }\r\n buildComputeProgram(options: PBComputeOptions): GPUProgram {\r\n return this._programBuilder.buildComputeProgram(options);\r\n }\r\n addGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list && list.indexOf(obj) < 0) {\r\n list.push(obj);\r\n this.dispatchEvent('gpuobject_added', obj);\r\n }\r\n }\r\n removeGPUObject(obj: GPUObject) {\r\n const list = this.getGPUObjectList(obj);\r\n if (list) {\r\n const index = list.indexOf(obj);\r\n if (index >= 0) {\r\n list.splice(index, 1);\r\n this.dispatchEvent('gpuobject_removed', obj);\r\n }\r\n }\r\n }\r\n updateVideoMemoryCost(delta: number) {\r\n this._gpuMemCost += delta;\r\n }\r\n protected abstract onBeginFrame(): boolean;\r\n protected abstract onEndFrame(): void;\r\n protected abstract _setFramebuffer(fb: FrameBuffer);\r\n private _onresize() {\r\n if (\r\n this._canvasClientWidth !== this._canvas.clientWidth ||\r\n this._canvasClientHeight !== this._canvas.clientHeight\r\n ) {\r\n this._canvasClientWidth = this._canvas.clientWidth;\r\n this._canvasClientHeight = this._canvas.clientHeight;\r\n this.dispatchEvent('resize', this._canvasClientWidth, this._canvasClientHeight);\r\n }\r\n }\r\n private _registerEventHandlers() {\r\n const canvas: HTMLCanvasElement = this._canvas;\r\n const that = this;\r\n if (window.ResizeObserver) {\r\n new window.ResizeObserver(() => {\r\n that._onresize();\r\n }).observe(canvas, {});\r\n } else {\r\n if (window.MutationObserver) {\r\n new MutationObserver(function (mutations) {\r\n if (mutations.length > 0) {\r\n that._onresize();\r\n }\r\n }).observe(canvas, { attributes: true, attributeFilter: ['style'] });\r\n }\r\n window.addEventListener('resize', () => {\r\n this._onresize();\r\n });\r\n }\r\n }\r\n private updateFrameInfo() {\r\n this._frameInfo.drawCalls = 0;\r\n this._frameInfo.computeCalls = 0;\r\n const now = this._beginFrameTime;\r\n if (this._frameInfo.frameTimestamp === 0) {\r\n this._frameInfo.frameTimestamp = now;\r\n this._frameInfo.elapsedTimeCPU = 0;\r\n this._frameInfo.elapsedTimeGPU = 0;\r\n this._frameInfo.elapsedFrame = 0;\r\n this._frameInfo.elapsedOverall = 0;\r\n this._frameInfo.FPS = 0;\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n if (this._gpuTimer) {\r\n this._gpuTimer.begin();\r\n }\r\n } else {\r\n this._frameInfo.elapsedFrame = now - this._frameInfo.frameTimestamp;\r\n this._frameInfo.elapsedOverall += this._frameInfo.elapsedFrame;\r\n let gpuTime = 0;\r\n let cpuTime = 0;\r\n if (this._endFrameTime !== 0) {\r\n gpuTime = now - this._endFrameTime;\r\n cpuTime = this._endFrameTime - this._frameInfo.frameTimestamp;\r\n }\r\n this._frameInfo.frameTimestamp = now;\r\n if (now >= this._fpsCounter.time + 1000) {\r\n this._frameInfo.FPS =\r\n ((this._frameInfo.frameCounter - this._fpsCounter.frame) * 1000) / (now - this._fpsCounter.time);\r\n this._fpsCounter.time = now;\r\n this._fpsCounter.frame = this._frameInfo.frameCounter;\r\n this._frameInfo.elapsedTimeGPU = gpuTime;\r\n this._frameInfo.elapsedTimeCPU = cpuTime;\r\n }\r\n }\r\n const tmp = this._frameInfo.nextFrameCall;\r\n this._frameInfo.nextFrameCall = this._frameInfo.nextFrameCallNext;\r\n this._frameInfo.nextFrameCallNext = tmp;\r\n for (const f of this._frameInfo.nextFrameCallNext) {\r\n f();\r\n }\r\n this._frameInfo.nextFrameCallNext.length = 0;\r\n }\r\n private getGPUObjectList(obj: GPUObject): GPUObject[] {\r\n let list: GPUObject[] = null;\r\n if (obj.isTexture()) {\r\n list = this._gpuObjectList.textures;\r\n } else if (obj.isSampler()) {\r\n list = this._gpuObjectList.samplers;\r\n } else if (obj.isBuffer()) {\r\n list = this._gpuObjectList.buffers;\r\n } else if (obj.isFramebuffer()) {\r\n list = this._gpuObjectList.framebuffers;\r\n } else if (obj.isProgram()) {\r\n list = this._gpuObjectList.programs;\r\n } else if (obj.isVertexLayout()) {\r\n list = this._gpuObjectList.vertexArrayObjects;\r\n } else if (obj.isBindGroup()) {\r\n list = this._gpuObjectList.bindGroups;\r\n }\r\n return list;\r\n }\r\n protected invalidateAll() {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n for (const obj of list) {\r\n this.disposeObject(obj, false);\r\n }\r\n }\r\n if (this.isContextLost()) {\r\n for (const obj of this._disposeObjectList) {\r\n obj.destroy();\r\n }\r\n this._disposeObjectList = [];\r\n }\r\n }\r\n protected reloadAll(): void {\r\n for (const list of [\r\n this._gpuObjectList.buffers,\r\n this._gpuObjectList.textures,\r\n this._gpuObjectList.samplers,\r\n this._gpuObjectList.programs,\r\n this._gpuObjectList.framebuffers,\r\n this._gpuObjectList.vertexArrayObjects,\r\n this._gpuObjectList.bindGroups\r\n ]) {\r\n // obj.reload() may change the list, so make a copy first\r\n for (const obj of list.slice()) {\r\n obj.reload();\r\n }\r\n }\r\n return;\r\n }\r\n protected parseTextureOptions(options?: TextureCreationOptions): number {\r\n const noMipmapFlag = options?.mipmapping === false ? GPUResourceUsageFlags.TF_NO_MIPMAP : 0;\r\n const writableFlag = options?.writable ? GPUResourceUsageFlags.TF_WRITABLE : 0;\r\n const dynamicFlag = options?.dynamic ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n if (noMipmapFlag && options?.samplerOptions) {\r\n options.samplerOptions.mipFilter = 'none';\r\n }\r\n return noMipmapFlag | writableFlag | dynamicFlag;\r\n }\r\n protected parseBufferOptions(options: BufferCreationOptions, defaultUsage?: BufferUsage): number {\r\n const usage = options?.usage || defaultUsage;\r\n let usageFlag: number;\r\n switch (usage) {\r\n case 'uniform':\r\n usageFlag = GPUResourceUsageFlags.BF_UNIFORM;\r\n options.managed = false;\r\n options.dynamic = options.dynamic ?? true;\r\n break;\r\n case 'vertex':\r\n usageFlag = GPUResourceUsageFlags.BF_VERTEX;\r\n break;\r\n case 'index':\r\n usageFlag = GPUResourceUsageFlags.BF_INDEX;\r\n break;\r\n case 'read':\r\n usageFlag = GPUResourceUsageFlags.BF_READ;\r\n options.managed = false;\r\n break;\r\n case 'write':\r\n usageFlag = GPUResourceUsageFlags.BF_WRITE;\r\n options.managed = false;\r\n break;\r\n case 'pack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_PACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n case 'unpack-pixel':\r\n usageFlag = GPUResourceUsageFlags.BF_UNPACK_PIXEL;\r\n options.managed = false;\r\n break;\r\n default:\r\n usageFlag = 0;\r\n break;\r\n }\r\n const storageFlag = (options?.storage ?? false) ? GPUResourceUsageFlags.BF_STORAGE : 0;\r\n const dynamicFlag = (options?.dynamic ?? false) ? GPUResourceUsageFlags.DYNAMIC : 0;\r\n const managedFlag = dynamicFlag === 0 && (options?.managed ?? true) ? GPUResourceUsageFlags.MANAGED : 0;\r\n return usageFlag | storageFlag | dynamicFlag | managedFlag;\r\n }\r\n}\r\n\r\n/**\r\n * Merge event target interface\r\n * @public\r\n */\r\nexport interface BaseDevice extends IEventTarget<DeviceEventMap> {}\r\n"],"names":["BaseDevice","Observable","_canvas","_canvasClientWidth","_canvasClientHeight","_gpuObjectList","_gpuMemCost","_disposeObjectList","_beginFrameTime","_endFrameTime","_frameInfo","_cpuTimer","_gpuTimer","_runningLoop","_fpsCounter","_runLoopFunc","_backend","_beginFrameCounter","_programBuilder","_poolMap","_defaultPoolKey","_temporalFramebuffer","_vSync","_stateStack","cvs","backend","textures","samplers","buffers","programs","framebuffers","vertexArrayObjects","bindGroups","setAttribute","clientWidth","clientHeight","frameCounter","frameTimestamp","elapsedTimeCPU","elapsedTimeGPU","elapsedFrame","elapsedOverall","FPS","drawCalls","computeCalls","nextFrameCall","nextFrameCallNext","ProgramBuilder","CPUTimer","time","frame","Map","Symbol","set","Pool","_registerEventHandlers","videoMemoryUsage","frameInfo","isRendering","canvas","type","typeName","vSync","val","pool","get","runLoopFunction","programBuilder","poolExists","key","has","getPool","setFont","fontName","DrawText","drawText","text","x","y","color","setFramebuffer","colorOrRT","depth","sampleCount","newRT","temporal","Array","isArray","fetchTemporalFramebuffer","currentRT","getFramebuffer","releaseFrameBuffer","_setFramebuffer","disposeObject","obj","remove","removeGPUObject","isContextLost","destroy","push","restoreObject","disposed","restore","restoreHandler","enableGPUTimeRecording","enable","createGPUTimer","end","beginFrame","now","updateFrameInfo","forEach","autoRelease","onBeginFrame","endFrame","onEndFrame","getVertexAttribFormat","semantic","dataType","componentCount","createInterleavedVertexBuffer","attribFormats","data","options","usage","console","error","size","format","getVertexFormatSize","vertexBufferType","makeVertexBufferType","byteLength","opt","Object","assign","dynamic","managed","storage","createStructuredBuffer","createVertexBuffer","attribFormat","count","draw","primitiveType","first","_draw","drawInstanced","numInstances","_drawInstanced","executeRenderBundle","renderBundle","_executeRenderBundle","compute","workgroupCountX","workgroupCountY","workgroupCountZ","_compute","runNextFrame","f","runNextFrameAsync","Promise","resolve","p","then","exitLoop","cancelAnimationFrame","cancelNextFrame","runLoop","func","that","entry","requestAnimationFrame","nextFrame","pushDeviceStates","windowOrderReversed","isWindingOrderReversed","framebuffer","viewport","getViewport","scissor","getScissor","program","getProgram","renderStateSet","getRenderStates","vertexLayout","getVertexLayout","getBindGroup","popDeviceStates","length","top","pop","setViewport","setScissor","setProgram","setRenderStates","setVertexLayout","setBindGroup","reverseVertexWindingOrder","getGPUObjects","getGPUObjectById","uid","list","screenToDevice","Math","round","getScale","deviceToScreen","buildRenderProgram","buildComputeProgram","addGPUObject","getGPUObjectList","indexOf","dispatchEvent","index","splice","updateVideoMemoryCost","delta","_onresize","window","ResizeObserver","observe","MutationObserver","mutations","attributes","attributeFilter","addEventListener","begin","gpuTime","cpuTime","tmp","isTexture","isSampler","isBuffer","isFramebuffer","isProgram","isVertexLayout","isBindGroup","invalidateAll","reloadAll","slice","reload","parseTextureOptions","noMipmapFlag","mipmapping","GPUResourceUsageFlags","TF_NO_MIPMAP","writableFlag","writable","TF_WRITABLE","dynamicFlag","DYNAMIC","samplerOptions","mipFilter","parseBufferOptions","defaultUsage","usageFlag","BF_UNIFORM","BF_VERTEX","BF_INDEX","BF_READ","BF_WRITE","BF_PACK_PIXEL","BF_UNPACK_PIXEL","storageFlag","BF_STORAGE","managedFlag","MANAGED"],"mappings":"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"}
|
package/dist/gpuobject.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PBStructTypeInfo, PBArrayTypeInfo, PBPrimitiveTypeInfo, PBPrimitiveType } from './builder/types.js';
|
|
2
2
|
|
|
3
|
-
/** @
|
|
4
|
-
/** @
|
|
5
|
-
/** @
|
|
6
|
-
/** @
|
|
7
|
-
/** @
|
|
8
|
-
/** @
|
|
9
|
-
/** @
|
|
10
|
-
/** @
|
|
11
|
-
/** @
|
|
12
|
-
/** @
|
|
13
|
-
/** @
|
|
14
|
-
/** @
|
|
15
|
-
/** @
|
|
16
|
-
/** @
|
|
17
|
-
/** @
|
|
18
|
-
/** @
|
|
19
|
-
/** @
|
|
3
|
+
/** @public */ const MAX_VERTEX_ATTRIBUTES = 16;
|
|
4
|
+
/** @public */ const MAX_BINDING_GROUPS = 4;
|
|
5
|
+
/** @public */ const MAX_TEXCOORD_INDEX_COUNT = 8;
|
|
6
|
+
/** @public */ const VERTEX_ATTRIB_POSITION = 0;
|
|
7
|
+
/** @public */ const VERTEX_ATTRIB_NORMAL = 1;
|
|
8
|
+
/** @public */ const VERTEX_ATTRIB_DIFFUSE = 2;
|
|
9
|
+
/** @public */ const VERTEX_ATTRIB_TANGENT = 3;
|
|
10
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD0 = 4;
|
|
11
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD1 = 5;
|
|
12
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD2 = 6;
|
|
13
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD3 = 7;
|
|
14
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD4 = 8;
|
|
15
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD5 = 9;
|
|
16
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD6 = 10;
|
|
17
|
+
/** @public */ const VERTEX_ATTRIB_TEXCOORD7 = 11;
|
|
18
|
+
/** @public */ const VERTEX_ATTRIB_BLEND_WEIGHT = 12;
|
|
19
|
+
/** @public */ const VERTEX_ATTRIB_BLEND_INDICES = 13;
|
|
20
20
|
const vertexAttribFormatMap = {
|
|
21
21
|
position_u8normx2: [
|
|
22
22
|
VERTEX_ATTRIB_POSITION,
|
|
@@ -1955,8 +1955,10 @@ const vertexAttribNameRevMap = {
|
|
|
1955
1955
|
[VERTEX_ATTRIB_TEXCOORD6]: 'texCoord6',
|
|
1956
1956
|
[VERTEX_ATTRIB_TEXCOORD7]: 'texCoord7'
|
|
1957
1957
|
};
|
|
1958
|
-
|
|
1959
|
-
|
|
1958
|
+
/**
|
|
1959
|
+
* The gpu resource usage flags
|
|
1960
|
+
* @public
|
|
1961
|
+
*/ var GPUResourceUsageFlags = /*#__PURE__*/ function(GPUResourceUsageFlags) {
|
|
1960
1962
|
GPUResourceUsageFlags[GPUResourceUsageFlags["TF_LINEAR_COLOR_SPACE"] = 2] = "TF_LINEAR_COLOR_SPACE";
|
|
1961
1963
|
GPUResourceUsageFlags[GPUResourceUsageFlags["TF_NO_MIPMAP"] = 4] = "TF_NO_MIPMAP";
|
|
1962
1964
|
GPUResourceUsageFlags[GPUResourceUsageFlags["TF_WRITABLE"] = 8] = "TF_WRITABLE";
|
|
@@ -1967,9 +1969,12 @@ var GPUResourceUsageFlags;
|
|
|
1967
1969
|
GPUResourceUsageFlags[GPUResourceUsageFlags["BF_WRITE"] = 256] = "BF_WRITE";
|
|
1968
1970
|
GPUResourceUsageFlags[GPUResourceUsageFlags["BF_UNIFORM"] = 512] = "BF_UNIFORM";
|
|
1969
1971
|
GPUResourceUsageFlags[GPUResourceUsageFlags["BF_STORAGE"] = 1024] = "BF_STORAGE";
|
|
1970
|
-
GPUResourceUsageFlags[GPUResourceUsageFlags["
|
|
1971
|
-
GPUResourceUsageFlags[GPUResourceUsageFlags["
|
|
1972
|
-
|
|
1972
|
+
GPUResourceUsageFlags[GPUResourceUsageFlags["BF_PACK_PIXEL"] = 2048] = "BF_PACK_PIXEL";
|
|
1973
|
+
GPUResourceUsageFlags[GPUResourceUsageFlags["BF_UNPACK_PIXEL"] = 4096] = "BF_UNPACK_PIXEL";
|
|
1974
|
+
GPUResourceUsageFlags[GPUResourceUsageFlags["DYNAMIC"] = 8192] = "DYNAMIC";
|
|
1975
|
+
GPUResourceUsageFlags[GPUResourceUsageFlags["MANAGED"] = 16384] = "MANAGED";
|
|
1976
|
+
return GPUResourceUsageFlags;
|
|
1977
|
+
}({});
|
|
1973
1978
|
/**
|
|
1974
1979
|
* Get vertex attribute index by semantic
|
|
1975
1980
|
* @public
|
|
@@ -1982,14 +1987,60 @@ var GPUResourceUsageFlags;
|
|
|
1982
1987
|
*/ function getVertexAttribName(attrib) {
|
|
1983
1988
|
return vertexAttribNameRevMap[attrib];
|
|
1984
1989
|
}
|
|
1990
|
+
/**
|
|
1991
|
+
* Test whether a vertex buffer matches given semantic
|
|
1992
|
+
* @param buffer - Vertex buffer
|
|
1993
|
+
* @param name - Semantic to test
|
|
1994
|
+
* @returns true if the vertex buffer matches given semantic, otherwise false
|
|
1995
|
+
*
|
|
1996
|
+
* @public
|
|
1997
|
+
*/ function matchVertexBuffer(buffer, name) {
|
|
1998
|
+
if (!buffer) {
|
|
1999
|
+
return false;
|
|
2000
|
+
}
|
|
2001
|
+
const bufferType = buffer.structure.structMembers[0].type;
|
|
2002
|
+
if (!bufferType.isArrayType()) {
|
|
2003
|
+
return false;
|
|
2004
|
+
}
|
|
2005
|
+
const vertexType = bufferType.elementType;
|
|
2006
|
+
if (vertexType.isStructType()) {
|
|
2007
|
+
for (const attrib of vertexType.structMembers){
|
|
2008
|
+
if (attrib.name === name) {
|
|
2009
|
+
return true;
|
|
2010
|
+
}
|
|
2011
|
+
}
|
|
2012
|
+
} else {
|
|
2013
|
+
return buffer.structure.structMembers[0].name === name;
|
|
2014
|
+
}
|
|
2015
|
+
}
|
|
2016
|
+
/**
|
|
2017
|
+
* Get vertex attribute type of specified vertex format
|
|
2018
|
+
* @param fmt - The vertex format
|
|
2019
|
+
* @returns Vertex attribute type, possible values are 'f32', 'f16', 'i32', 'u32', 'i16', 'u16', 'i8norm', 'u8norm', 'i16norm', 'u16norm'
|
|
2020
|
+
*
|
|
2021
|
+
* @public
|
|
2022
|
+
*/ function getVertexAttributeFormat(fmt) {
|
|
2023
|
+
return vertexAttribFormatMap[fmt][3];
|
|
2024
|
+
}
|
|
2025
|
+
/**
|
|
2026
|
+
* Get vertex attribute index of specified vertex format
|
|
2027
|
+
* @param fmt - The vertex format
|
|
2028
|
+
* @returns Vertex attribute index
|
|
2029
|
+
*
|
|
2030
|
+
* @public
|
|
2031
|
+
*/ function getVertexAttributeIndex(fmt) {
|
|
2032
|
+
return vertexAttribFormatMap[fmt][0];
|
|
2033
|
+
}
|
|
1985
2034
|
/**
|
|
1986
2035
|
* Get byte size of specified vertex format
|
|
2036
|
+
*
|
|
1987
2037
|
* @public
|
|
1988
2038
|
*/ function getVertexFormatSize(fmt) {
|
|
1989
2039
|
return vertexAttribFormatMap[fmt][2];
|
|
1990
2040
|
}
|
|
1991
2041
|
/**
|
|
1992
2042
|
* Get number of components of specified vertex format
|
|
2043
|
+
*
|
|
1993
2044
|
* @public
|
|
1994
2045
|
*/ function getVertexFormatComponentCount(fmt) {
|
|
1995
2046
|
return vertexAttribFormatMap[fmt][4];
|
|
@@ -2000,6 +2051,7 @@ var GPUResourceUsageFlags;
|
|
|
2000
2051
|
* @param type - Data type of vertex component
|
|
2001
2052
|
* @param count - The count of vertex components
|
|
2002
2053
|
* @returns Vertex format
|
|
2054
|
+
*
|
|
2003
2055
|
* @public
|
|
2004
2056
|
*/ function getVertexAttribFormat(semantic, type, count) {
|
|
2005
2057
|
const loc = getVertexAttribByName(semantic);
|
|
@@ -2015,6 +2067,7 @@ var GPUResourceUsageFlags;
|
|
|
2015
2067
|
* Get the length of a vertex buffer by specified structure type of the vertex buffer
|
|
2016
2068
|
* @param vertexBufferType - The structure type of the vertex buffer
|
|
2017
2069
|
* @returns The length of the vertex buffer
|
|
2070
|
+
*
|
|
2018
2071
|
* @public
|
|
2019
2072
|
*/ function getVertexBufferLength(vertexBufferType) {
|
|
2020
2073
|
return vertexBufferType.structMembers[0].type.dimension;
|
|
@@ -2023,6 +2076,7 @@ var GPUResourceUsageFlags;
|
|
|
2023
2076
|
* Get byte stride of a vertex buffer by specified structure type of the vertex buffer
|
|
2024
2077
|
* @param vertexBufferType - The structure type of the vertex buffer
|
|
2025
2078
|
* @returns The byte stride of the vertex buffer
|
|
2079
|
+
*
|
|
2026
2080
|
* @public
|
|
2027
2081
|
*/ function getVertexBufferStride(vertexBufferType) {
|
|
2028
2082
|
const vertexType = vertexBufferType.structMembers[0].type.elementType;
|
|
@@ -2041,6 +2095,7 @@ var GPUResourceUsageFlags;
|
|
|
2041
2095
|
* @param vertexBufferType - The structure type of the vertex buffer
|
|
2042
2096
|
* @param semantic - The vertex semantic
|
|
2043
2097
|
* @returns - The primitive type of the vertex attribute
|
|
2098
|
+
*
|
|
2044
2099
|
* @public
|
|
2045
2100
|
*/ function getVertexBufferAttribTypeBySemantic(vertexBufferType, semantic) {
|
|
2046
2101
|
const k = vertexBufferType.structMembers[0];
|
|
@@ -2061,6 +2116,7 @@ var GPUResourceUsageFlags;
|
|
|
2061
2116
|
* @param vertexBufferType - The structure type of the vertex buffer
|
|
2062
2117
|
* @param semantic - The vertex attribute index
|
|
2063
2118
|
* @returns - The primitive type of the vertex attribute
|
|
2119
|
+
*
|
|
2064
2120
|
* @public
|
|
2065
2121
|
*/ function getVertexBufferAttribType(vertexBufferType, attrib) {
|
|
2066
2122
|
const attribName = getVertexAttribName(attrib);
|
|
@@ -2074,6 +2130,7 @@ var GPUResourceUsageFlags;
|
|
|
2074
2130
|
* @param length - The length of the vertex buffer
|
|
2075
2131
|
* @param attributes - The vertex attributes
|
|
2076
2132
|
* @returns The structure type of the vertex buffer
|
|
2133
|
+
*
|
|
2077
2134
|
* @public
|
|
2078
2135
|
*/ function makeVertexBufferType(length, ...attributes) {
|
|
2079
2136
|
if (attributes.length === 0) {
|
|
@@ -2102,6 +2159,7 @@ var GPUResourceUsageFlags;
|
|
|
2102
2159
|
}
|
|
2103
2160
|
/**
|
|
2104
2161
|
* Vertex semantic list
|
|
2162
|
+
*
|
|
2105
2163
|
* @public
|
|
2106
2164
|
*/ const semanticList = function() {
|
|
2107
2165
|
const list = [];
|
|
@@ -2175,5 +2233,5 @@ var GPUResourceUsageFlags;
|
|
|
2175
2233
|
}
|
|
2176
2234
|
}
|
|
2177
2235
|
|
|
2178
|
-
export { GPUResourceUsageFlags, MAX_BINDING_GROUPS, MAX_TEXCOORD_INDEX_COUNT, MAX_VERTEX_ATTRIBUTES, VERTEX_ATTRIB_BLEND_INDICES, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_DIFFUSE, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_TANGENT, VERTEX_ATTRIB_TEXCOORD0, VERTEX_ATTRIB_TEXCOORD1, VERTEX_ATTRIB_TEXCOORD2, VERTEX_ATTRIB_TEXCOORD3, VERTEX_ATTRIB_TEXCOORD4, VERTEX_ATTRIB_TEXCOORD5, VERTEX_ATTRIB_TEXCOORD6, VERTEX_ATTRIB_TEXCOORD7, genDefaultName, getVertexAttribByName, getVertexAttribFormat, getVertexAttribName, getVertexBufferAttribType, getVertexBufferAttribTypeBySemantic, getVertexBufferLength, getVertexBufferStride, getVertexFormatComponentCount, getVertexFormatSize, makeVertexBufferType, semanticList, semanticToAttrib };
|
|
2236
|
+
export { GPUResourceUsageFlags, MAX_BINDING_GROUPS, MAX_TEXCOORD_INDEX_COUNT, MAX_VERTEX_ATTRIBUTES, VERTEX_ATTRIB_BLEND_INDICES, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_DIFFUSE, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_TANGENT, VERTEX_ATTRIB_TEXCOORD0, VERTEX_ATTRIB_TEXCOORD1, VERTEX_ATTRIB_TEXCOORD2, VERTEX_ATTRIB_TEXCOORD3, VERTEX_ATTRIB_TEXCOORD4, VERTEX_ATTRIB_TEXCOORD5, VERTEX_ATTRIB_TEXCOORD6, VERTEX_ATTRIB_TEXCOORD7, genDefaultName, getVertexAttribByName, getVertexAttribFormat, getVertexAttribName, getVertexAttributeFormat, getVertexAttributeIndex, getVertexBufferAttribType, getVertexBufferAttribTypeBySemantic, getVertexBufferLength, getVertexBufferStride, getVertexFormatComponentCount, getVertexFormatSize, makeVertexBufferType, matchVertexBuffer, semanticList, semanticToAttrib };
|
|
2179
2237
|
//# sourceMappingURL=gpuobject.js.map
|