@zephyr3d/device 0.2.5 → 0.2.6

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.
Files changed (41) hide show
  1. package/dist/base_types.js +12 -13
  2. package/dist/base_types.js.map +1 -1
  3. package/dist/builder/ast.js +34 -48
  4. package/dist/builder/ast.js.map +1 -1
  5. package/dist/builder/base.js +6 -2
  6. package/dist/builder/base.js.map +1 -1
  7. package/dist/builder/builtinfunc.js +42 -6
  8. package/dist/builder/builtinfunc.js.map +1 -1
  9. package/dist/builder/constructors.js +2 -0
  10. package/dist/builder/constructors.js.map +1 -1
  11. package/dist/builder/errors.js +4 -4
  12. package/dist/builder/errors.js.map +1 -1
  13. package/dist/builder/misc.js +1 -1
  14. package/dist/builder/misc.js.map +1 -1
  15. package/dist/builder/programbuilder.js +18 -27
  16. package/dist/builder/programbuilder.js.map +1 -1
  17. package/dist/builder/reflection.js +1 -1
  18. package/dist/builder/reflection.js.map +1 -1
  19. package/dist/builder/types.js +7 -6
  20. package/dist/builder/types.js.map +1 -1
  21. package/dist/device.js +150 -39
  22. package/dist/device.js.map +1 -1
  23. package/dist/gpuobject.js +2 -1
  24. package/dist/gpuobject.js.map +1 -1
  25. package/dist/helpers/drawtext.js +29 -25
  26. package/dist/helpers/drawtext.js.map +1 -1
  27. package/dist/helpers/font.js.map +1 -1
  28. package/dist/helpers/glyphmanager.js +26 -8
  29. package/dist/helpers/glyphmanager.js.map +1 -1
  30. package/dist/helpers/textureatlas.js +7 -3
  31. package/dist/helpers/textureatlas.js.map +1 -1
  32. package/dist/index.d.ts +290 -266
  33. package/dist/pool.js +15 -6
  34. package/dist/pool.js.map +1 -1
  35. package/dist/timer.js +3 -2
  36. package/dist/timer.js.map +1 -1
  37. package/dist/uniformdata.js +1 -1
  38. package/dist/uniformdata.js.map +1 -1
  39. package/dist/vertexdata.js +2 -2
  40. package/dist/vertexdata.js.map +1 -1
  41. package/package.json +80 -80
package/dist/device.js CHANGED
@@ -5,10 +5,115 @@ import { Pool } from './pool.js';
5
5
  import { ProgramBuilder } from './builder/programbuilder.js';
6
6
  import { DrawText } from './helpers/drawtext.js';
7
7
 
8
+ class ResizeHandler {
9
+ _canvas;
10
+ _dpr;
11
+ _cssWidth;
12
+ _cssHeight;
13
+ _deviceWidth;
14
+ _deviceHeight;
15
+ _resizeObserver;
16
+ _mutationObserver;
17
+ _onResizeCallback;
18
+ constructor(canvas, onResize, dpr){
19
+ this._canvas = canvas;
20
+ this._dpr = dpr;
21
+ this._cssWidth = 0;
22
+ this._cssHeight = 0;
23
+ this._deviceWidth = 0;
24
+ this._deviceHeight = 0;
25
+ this._onResizeCallback = onResize;
26
+ }
27
+ init() {
28
+ const canvas = this._canvas;
29
+ if (window.ResizeObserver) {
30
+ this._resizeObserver = new ResizeObserver((entries)=>{
31
+ const entry = entries[0];
32
+ this._handleResizeEntry(entry);
33
+ });
34
+ try {
35
+ this._resizeObserver.observe(canvas, {
36
+ box: 'device-pixel-content-box'
37
+ });
38
+ } catch {
39
+ this._resizeObserver.observe(canvas);
40
+ }
41
+ } else {
42
+ if (window.MutationObserver) {
43
+ this._mutationObserver = new MutationObserver((mutations)=>{
44
+ if (mutations.length > 0) {
45
+ this._handleLegacyResize();
46
+ }
47
+ });
48
+ this._mutationObserver.observe(canvas, {
49
+ attributes: true,
50
+ attributeFilter: [
51
+ 'style'
52
+ ]
53
+ });
54
+ }
55
+ window.addEventListener('resize', this._handleLegacyResize);
56
+ this._handleLegacyResize();
57
+ }
58
+ }
59
+ _handleResizeEntry(_entry) {
60
+ // CSS pixel
61
+ const cssWidth = this._canvas.clientWidth;
62
+ const cssHeight = this._canvas.clientHeight;
63
+ // Device pixel
64
+ /*
65
+ let deviceWidth: number;
66
+ let deviceHeight: number;
67
+
68
+ const dpBox = (entry as any).devicePixelContentBoxSize?.[0];
69
+ if (dpBox) {
70
+ deviceWidth = dpBox.inlineSize;
71
+ deviceHeight = dpBox.blockSize;
72
+ } else {
73
+ deviceWidth = Math.round(cssWidth * this._dpr);
74
+ deviceHeight = Math.round(cssHeight * this._dpr);
75
+ }
76
+ */ const deviceWidth = cssWidth * this._dpr;
77
+ const deviceHeight = cssHeight * this._dpr;
78
+ if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
79
+ return;
80
+ }
81
+ this._cssWidth = cssWidth;
82
+ this._cssHeight = cssHeight;
83
+ this._deviceWidth = deviceWidth;
84
+ this._deviceHeight = deviceHeight;
85
+ this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
86
+ }
87
+ _handleLegacyResize = ()=>{
88
+ const cssWidth = this._canvas.clientWidth;
89
+ const cssHeight = this._canvas.clientHeight;
90
+ const dpr = window.devicePixelRatio || 1;
91
+ const deviceWidth = Math.round(cssWidth * dpr);
92
+ const deviceHeight = Math.round(cssHeight * dpr);
93
+ if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
94
+ return;
95
+ }
96
+ this._cssWidth = cssWidth;
97
+ this._cssHeight = cssHeight;
98
+ this._deviceWidth = deviceWidth;
99
+ this._deviceHeight = deviceHeight;
100
+ this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
101
+ };
102
+ dispose() {
103
+ if (this._resizeObserver) {
104
+ this._resizeObserver.disconnect();
105
+ }
106
+ if (this._mutationObserver) {
107
+ this._mutationObserver.disconnect();
108
+ }
109
+ window.removeEventListener('resize', this._handleLegacyResize);
110
+ }
111
+ }
8
112
  /**
9
113
  * Base class for rendering device
10
114
  * @public
11
115
  */ class BaseDevice extends Observable {
116
+ _dpr;
12
117
  _canvas;
13
118
  _canvasClientWidth;
14
119
  _canvasClientHeight;
@@ -30,9 +135,11 @@ import { DrawText } from './helpers/drawtext.js';
30
135
  _defaultPoolKey;
31
136
  _temporalFramebuffer;
32
137
  _vSync;
138
+ _resizer;
33
139
  _stateStack;
34
- constructor(cvs, backend){
140
+ constructor(cvs, backend, dpr){
35
141
  super();
142
+ this._dpr = dpr ?? window.devicePixelRatio ?? 1;
36
143
  this._backend = backend;
37
144
  this._gpuObjectList = {
38
145
  textures: [],
@@ -81,7 +188,16 @@ import { DrawText } from './helpers/drawtext.js';
81
188
  this._temporalFramebuffer = false;
82
189
  this._temporalFramebuffer = false;
83
190
  this._vSync = true;
84
- this._registerEventHandlers();
191
+ //this._registerEventHandlers();
192
+ this._resizer = new ResizeHandler(this._canvas, (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
193
+ this.dispatchEvent('resize', cssWidth, cssHeight, deviceWidth, deviceHeight);
194
+ }, this._dpr);
195
+ }
196
+ getScaleX() {
197
+ return this._canvas.width / this._canvas.clientWidth;
198
+ }
199
+ getScaleY() {
200
+ return this._canvas.height / this._canvas.clientHeight;
85
201
  }
86
202
  get backend() {
87
203
  return this._backend;
@@ -130,8 +246,8 @@ import { DrawText } from './helpers/drawtext.js';
130
246
  setFont(fontName) {
131
247
  DrawText.setFont(this, fontName);
132
248
  }
133
- drawText(text, x, y, color) {
134
- DrawText.drawText(this, text, color, x, y);
249
+ drawText(text, x, y, color, viewport) {
250
+ DrawText.drawText(this, text, color, x, y, viewport);
135
251
  }
136
252
  setFramebuffer(colorOrRT, depth, sampleCount) {
137
253
  let newRT = null;
@@ -144,7 +260,7 @@ import { DrawText } from './helpers/drawtext.js';
144
260
  }
145
261
  const currentRT = this.getFramebuffer();
146
262
  if (currentRT !== newRT) {
147
- if (this._temporalFramebuffer) {
263
+ if (this._temporalFramebuffer && currentRT) {
148
264
  this.pool.releaseFrameBuffer(currentRT);
149
265
  }
150
266
  this._temporalFramebuffer = temporal;
@@ -213,6 +329,10 @@ import { DrawText } from './helpers/drawtext.js';
213
329
  size += getVertexFormatSize(format);
214
330
  }
215
331
  const vertexBufferType = makeVertexBufferType(data.byteLength / size >> 0, ...attribFormats);
332
+ if (!vertexBufferType) {
333
+ console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
334
+ return null;
335
+ }
216
336
  const opt = Object.assign({
217
337
  usage: 'vertex',
218
338
  dynamic: false,
@@ -235,6 +355,10 @@ import { DrawText } from './helpers/drawtext.js';
235
355
  }
236
356
  const count = getVertexFormatSize(attribFormat);
237
357
  const vertexBufferType = makeVertexBufferType(data.byteLength / count >> 0, attribFormat);
358
+ if (!vertexBufferType) {
359
+ console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
360
+ return null;
361
+ }
238
362
  const opt = Object.assign({
239
363
  usage: 'vertex',
240
364
  dynamic: false,
@@ -378,11 +502,17 @@ import { DrawText } from './helpers/drawtext.js';
378
502
  }
379
503
  return null;
380
504
  }
381
- screenToDevice(val) {
382
- return this.getFramebuffer() ? val : Math.round(val * this.getScale());
505
+ screenXToDevice(val) {
506
+ return this.getFramebuffer() ? val : Math.round(val * this.getScaleX());
507
+ }
508
+ deviceXToScreen(val) {
509
+ return this.getFramebuffer() ? val : Math.round(val / this.getScaleX());
510
+ }
511
+ screenYToDevice(val) {
512
+ return this.getFramebuffer() ? val : Math.round(val * this.getScaleY());
383
513
  }
384
- deviceToScreen(val) {
385
- return this.getFramebuffer() ? val : Math.round(val / this.getScale());
514
+ deviceYToScreen(val) {
515
+ return this.getFramebuffer() ? val : Math.round(val / this.getScaleY());
386
516
  }
387
517
  buildRenderProgram(options) {
388
518
  return this._programBuilder.buildRenderProgram(options);
@@ -410,37 +540,17 @@ import { DrawText } from './helpers/drawtext.js';
410
540
  updateVideoMemoryCost(delta) {
411
541
  this._gpuMemCost += delta;
412
542
  }
413
- _onresize() {
414
- if (this._canvasClientWidth !== this._canvas.clientWidth || this._canvasClientHeight !== this._canvas.clientHeight) {
415
- this._canvasClientWidth = this._canvas.clientWidth;
416
- this._canvasClientHeight = this._canvas.clientHeight;
417
- this.dispatchEvent('resize', this._canvasClientWidth, this._canvasClientHeight);
418
- }
419
- }
420
- _registerEventHandlers() {
421
- const canvas = this._canvas;
422
- const that = this;
423
- if (window.ResizeObserver) {
424
- new window.ResizeObserver(()=>{
425
- that._onresize();
426
- }).observe(canvas, {});
427
- } else {
428
- if (window.MutationObserver) {
429
- new MutationObserver(function(mutations) {
430
- if (mutations.length > 0) {
431
- that._onresize();
432
- }
433
- }).observe(canvas, {
434
- attributes: true,
435
- attributeFilter: [
436
- 'style'
437
- ]
543
+ async initResizer() {
544
+ return new Promise((resolve)=>{
545
+ this.once('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
546
+ this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
547
+ this.on('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
548
+ this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
438
549
  });
439
- }
440
- window.addEventListener('resize', ()=>{
441
- this._onresize();
550
+ resolve();
442
551
  });
443
- }
552
+ this._resizer.init();
553
+ });
444
554
  }
445
555
  updateFrameInfo() {
446
556
  this._frameInfo.drawCalls = 0;
@@ -551,7 +661,8 @@ import { DrawText } from './helpers/drawtext.js';
551
661
  return noMipmapFlag | writableFlag | dynamicFlag;
552
662
  }
553
663
  parseBufferOptions(options, defaultUsage) {
554
- const usage = options?.usage || defaultUsage;
664
+ options = options ?? {};
665
+ const usage = options.usage ?? defaultUsage;
555
666
  let usageFlag;
556
667
  switch(usage){
557
668
  case 'uniform':
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"device.js","sources":["../src/device.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { 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(): Promise<boolean>;\r\n createDevice(cvs: HTMLCanvasElement, options?: DeviceOptions): Promise<Nullable<AbstractDevice>>;\r\n}\r\n\r\ntype DeviceState = {\r\n framebuffer: Nullable<FrameBuffer>;\r\n windowOrderReversed: boolean;\r\n viewport: DeviceViewport;\r\n scissor: DeviceViewport;\r\n renderStateSet: Nullable<RenderStateSet>;\r\n program: Nullable<GPUProgram>;\r\n vertexLayout: Nullable<VertexLayout>;\r\n bindGroups: [BindGroup, Nullable<Iterable<number>>][];\r\n};\r\n\r\ntype ResizeCallback = (\r\n cssWidth: number,\r\n cssHeight: number,\r\n deviceWidth: number,\r\n deviceHeight: number\r\n) => void;\r\n\r\nclass ResizeHandler {\r\n private readonly _canvas: HTMLCanvasElement;\r\n private readonly _dpr: number;\r\n private _cssWidth: number;\r\n private _cssHeight: number;\r\n private _deviceWidth: number;\r\n private _deviceHeight: number;\r\n\r\n private _resizeObserver!: ResizeObserver;\r\n private _mutationObserver!: MutationObserver;\r\n private _onResizeCallback: ResizeCallback;\r\n\r\n constructor(canvas: HTMLCanvasElement, onResize: ResizeCallback, dpr: number) {\r\n this._canvas = canvas;\r\n this._dpr = dpr;\r\n this._cssWidth = 0;\r\n this._cssHeight = 0;\r\n this._deviceWidth = 0;\r\n this._deviceHeight = 0;\r\n this._onResizeCallback = onResize;\r\n }\r\n\r\n init() {\r\n const canvas = this._canvas;\r\n if (window.ResizeObserver) {\r\n this._resizeObserver = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n this._handleResizeEntry(entry);\r\n });\r\n try {\r\n (this._resizeObserver as any).observe(canvas, { box: 'device-pixel-content-box' });\r\n } catch {\r\n this._resizeObserver.observe(canvas);\r\n }\r\n } else {\r\n if (window.MutationObserver) {\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n if (mutations.length > 0) {\r\n this._handleLegacyResize();\r\n }\r\n });\r\n this._mutationObserver.observe(canvas, { attributes: true, attributeFilter: ['style'] });\r\n }\r\n window.addEventListener('resize', this._handleLegacyResize);\r\n this._handleLegacyResize();\r\n }\r\n }\r\n\r\n private _handleResizeEntry(_entry: ResizeObserverEntry) {\r\n // CSS pixel\r\n const cssWidth = this._canvas.clientWidth;\r\n const cssHeight = this._canvas.clientHeight;\r\n\r\n // Device pixel\r\n /*\r\n let deviceWidth: number;\r\n let deviceHeight: number;\r\n\r\n const dpBox = (entry as any).devicePixelContentBoxSize?.[0];\r\n if (dpBox) {\r\n deviceWidth = dpBox.inlineSize;\r\n deviceHeight = dpBox.blockSize;\r\n } else {\r\n deviceWidth = Math.round(cssWidth * this._dpr);\r\n deviceHeight = Math.round(cssHeight * this._dpr);\r\n }\r\n */\r\n const deviceWidth = cssWidth * this._dpr;\r\n const deviceHeight = cssHeight * this._dpr;\r\n\r\n if (\r\n cssWidth === this._cssWidth &&\r\n cssHeight === this._cssHeight &&\r\n deviceWidth === this._deviceWidth &&\r\n deviceHeight === this._deviceHeight\r\n ) {\r\n return;\r\n }\r\n\r\n this._cssWidth = cssWidth;\r\n this._cssHeight = cssHeight;\r\n this._deviceWidth = deviceWidth;\r\n this._deviceHeight = deviceHeight;\r\n\r\n this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n }\r\n\r\n private _handleLegacyResize = () => {\r\n const cssWidth = this._canvas.clientWidth;\r\n const cssHeight = this._canvas.clientHeight;\r\n const dpr = window.devicePixelRatio || 1;\r\n const deviceWidth = Math.round(cssWidth * dpr);\r\n const deviceHeight = Math.round(cssHeight * dpr);\r\n\r\n if (\r\n cssWidth === this._cssWidth &&\r\n cssHeight === this._cssHeight &&\r\n deviceWidth === this._deviceWidth &&\r\n deviceHeight === this._deviceHeight\r\n ) {\r\n return;\r\n }\r\n\r\n this._cssWidth = cssWidth;\r\n this._cssHeight = cssHeight;\r\n this._deviceWidth = deviceWidth;\r\n this._deviceHeight = deviceHeight;\r\n\r\n this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n };\r\n\r\n public dispose() {\r\n if (this._resizeObserver) {\r\n this._resizeObserver.disconnect();\r\n }\r\n if (this._mutationObserver) {\r\n this._mutationObserver.disconnect();\r\n }\r\n window.removeEventListener('resize', this._handleLegacyResize);\r\n }\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 _dpr: number;\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: Nullable<ITimer>;\r\n protected _runningLoop: Nullable<number>;\r\n protected _fpsCounter: { time: number; frame: number };\r\n protected _runLoopFunc: Nullable<(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 _resizer: ResizeHandler;\r\n private readonly _stateStack: DeviceState[];\r\n constructor(cvs: HTMLCanvasElement, backend: DeviceBackend, dpr?: number) {\r\n super();\r\n this._dpr = dpr ?? window.devicePixelRatio ?? 1;\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 this._resizer = new ResizeHandler(\r\n this._canvas,\r\n (cssWidth, cssHeight, deviceWidth, deviceHeight) => {\r\n this.dispatchEvent('resize', cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n },\r\n this._dpr\r\n );\r\n }\r\n getScaleX() {\r\n return this._canvas.width / this._canvas.clientWidth;\r\n }\r\n getScaleY() {\r\n return this._canvas.height / this._canvas.clientHeight;\r\n }\r\n abstract getAdapterInfo(): any;\r\n abstract getFrameBufferSampleCount(): number;\r\n abstract isContextLost(): boolean;\r\n abstract getDrawingBufferWidth(): number;\r\n abstract getDrawingBufferHeight(): number;\r\n abstract getBackBufferWidth(): number;\r\n abstract getBackBufferHeight(): number;\r\n abstract getDeviceCaps(): Immutable<DeviceCaps>;\r\n abstract initContext(): Promise<void>;\r\n abstract clearFrameBuffer(\r\n clearColor: Nullable<Vector4>,\r\n clearDepth: Nullable<number>,\r\n clearStencil: Nullable<number>\r\n ): void;\r\n abstract createGPUTimer(): Nullable<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 ): Nullable<T>;\r\n abstract createTexture2D(\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<Texture2D>;\r\n abstract createTexture2DFromImage(\r\n element: TextureImageElement,\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<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 ): Nullable<Texture2DArray>;\r\n abstract createTexture2DArrayFromImages(\r\n elements: TextureImageElement[],\r\n sRGB: boolean,\r\n options?: TextureCreationOptions\r\n ): Nullable<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 ): Nullable<Texture3D>;\r\n abstract createCubeTexture(\r\n format: TextureFormat,\r\n size: number,\r\n options?: TextureCreationOptions\r\n ): Nullable<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): void;\r\n abstract copyFramebufferToTexture2D(src: FrameBuffer, index: number, dst: Texture2D, level: number): void;\r\n // program\r\n abstract createGPUProgram(params: GPUProgramConstructParams): GPUProgram;\r\n abstract createBindGroup(layout: Immutable<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 ): void;\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: Nullable<BaseTexture>,\r\n options?: Nullable<FrameBufferOptions>\r\n ): FrameBuffer;\r\n // render related\r\n abstract setViewport(vp: Nullable<Immutable<number[] | DeviceViewport>>): void;\r\n abstract getViewport(): Immutable<DeviceViewport>;\r\n abstract setScissor(scissor: Nullable<Immutable<number[] | DeviceViewport>>): void;\r\n abstract getScissor(): Immutable<DeviceViewport>;\r\n abstract setProgram(program: Nullable<GPUProgram>): void;\r\n abstract getProgram(): Nullable<GPUProgram>;\r\n abstract setVertexLayout(vertexData: Nullable<VertexLayout>): void;\r\n abstract getVertexLayout(): Nullable<VertexLayout>;\r\n abstract setRenderStates(renderStates: Nullable<RenderStateSet>): void;\r\n abstract getRenderStates(): Nullable<RenderStateSet>;\r\n abstract getFramebuffer(): Nullable<FrameBuffer>;\r\n abstract setBindGroup(\r\n index: number,\r\n bindGroup: BindGroup,\r\n dynamicOffsets?: Nullable<Iterable<number>>\r\n ): void;\r\n abstract getBindGroup(index: number): [BindGroup, Nullable<Iterable<number>>];\r\n abstract flush(): void;\r\n abstract nextFrame(callback: () => void): number;\r\n abstract cancelNextFrame(handle: number): void;\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() {\r\n return this._backend;\r\n }\r\n get videoMemoryUsage() {\r\n return this._gpuMemCost;\r\n }\r\n get frameInfo() {\r\n return this._frameInfo;\r\n }\r\n get isRendering() {\r\n return this._runningLoop !== null;\r\n }\r\n get canvas() {\r\n return this._canvas;\r\n }\r\n get type() {\r\n return this._backend.typeName();\r\n }\r\n get vSync() {\r\n return this._vSync;\r\n }\r\n set vSync(val) {\r\n this._vSync = !!val;\r\n }\r\n get pool() {\r\n return this._poolMap.get(this._defaultPoolKey)!;\r\n }\r\n get runLoopFunction() {\r\n return this._runLoopFunc;\r\n }\r\n get programBuilder() {\r\n return this._programBuilder;\r\n }\r\n poolExists(key: string | symbol) {\r\n return this._poolMap.has(key);\r\n }\r\n getPool(key: string | symbol) {\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, viewport?: Immutable<number[]>) {\r\n DrawText.drawText(this, text, color, x, y, viewport);\r\n }\r\n setFramebuffer(rt: Nullable<FrameBuffer>): void;\r\n setFramebuffer(color: BaseTexture[], depth?: BaseTexture, sampleCount?: number): void;\r\n setFramebuffer(\r\n colorOrRT: BaseTexture[] | Nullable<FrameBuffer>,\r\n depth?: BaseTexture,\r\n sampleCount?: number\r\n ) {\r\n let newRT: Nullable<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 && currentRT) {\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() {\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() {\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(semantic: VertexSemantic, dataType: DataType, componentCount: number) {\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 ) {\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 if (!vertexBufferType) {\r\n console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');\r\n return null;\r\n }\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(attribFormat: VertexAttribFormat, data: TypedArray, options?: BufferCreationOptions) {\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 if (!vertexBufferType) {\r\n console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');\r\n return null;\r\n }\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) {\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) {\r\n this._frameInfo.drawCalls++;\r\n this._drawInstanced(primitiveType, first, count, numInstances);\r\n }\r\n executeRenderBundle(renderBundle: RenderBundle): void {\r\n this._frameInfo.drawCalls += this._executeRenderBundle(renderBundle);\r\n }\r\n compute(workgroupCountX: number, workgroupCountY: number, workgroupCountZ: number) {\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>) {\r\n return new Promise<void>((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() {\r\n return this._gpuObjectList;\r\n }\r\n getGPUObjectById(uid: number) {\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 screenXToDevice(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScaleX());\r\n }\r\n deviceXToScreen(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScaleX());\r\n }\r\n screenYToDevice(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val * this.getScaleY());\r\n }\r\n deviceYToScreen(val: number) {\r\n return this.getFramebuffer() ? val : Math.round(val / this.getScaleY());\r\n }\r\n buildRenderProgram(options: PBRenderOptions) {\r\n return this._programBuilder.buildRenderProgram(options);\r\n }\r\n buildComputeProgram(options: PBComputeOptions) {\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: Nullable<FrameBuffer>): void;\r\n protected abstract _handleResize(\r\n cssWidth: number,\r\n cssHeight: number,\r\n deviceWidth: number,\r\n deviceHeight: number\r\n ): void;\r\n protected async initResizer() {\r\n return new Promise<void>((resolve) => {\r\n this.once(\r\n 'resize',\r\n (cssWidth: number, cssHeight: number, deviceWidth: number, deviceHeight: number) => {\r\n this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n this.on(\r\n 'resize',\r\n (cssWidth: number, cssHeight: number, deviceWidth: number, deviceHeight: number) => {\r\n this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);\r\n }\r\n );\r\n resolve();\r\n }\r\n );\r\n this._resizer.init();\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) {\r\n let list: Nullable<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() {\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) {\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) {\r\n options = options ?? {};\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":["ResizeHandler","_canvas","_dpr","_cssWidth","_cssHeight","_deviceWidth","_deviceHeight","_resizeObserver","_mutationObserver","_onResizeCallback","canvas","onResize","dpr","init","window","ResizeObserver","entries","entry","_handleResizeEntry","observe","box","MutationObserver","mutations","length","_handleLegacyResize","attributes","attributeFilter","addEventListener","_entry","cssWidth","clientWidth","cssHeight","clientHeight","deviceWidth","deviceHeight","devicePixelRatio","Math","round","dispose","disconnect","removeEventListener","BaseDevice","Observable","_canvasClientWidth","_canvasClientHeight","_gpuObjectList","_gpuMemCost","_disposeObjectList","_beginFrameTime","_endFrameTime","_frameInfo","_cpuTimer","_gpuTimer","_runningLoop","_fpsCounter","_runLoopFunc","_backend","_beginFrameCounter","_programBuilder","_poolMap","_defaultPoolKey","_temporalFramebuffer","_vSync","_resizer","_stateStack","cvs","backend","textures","samplers","buffers","programs","framebuffers","vertexArrayObjects","bindGroups","setAttribute","frameCounter","frameTimestamp","elapsedTimeCPU","elapsedTimeGPU","elapsedFrame","elapsedOverall","FPS","drawCalls","computeCalls","nextFrameCall","nextFrameCallNext","ProgramBuilder","CPUTimer","time","frame","Map","Symbol","set","Pool","dispatchEvent","getScaleX","width","getScaleY","height","videoMemoryUsage","frameInfo","isRendering","type","typeName","vSync","val","pool","get","runLoopFunction","programBuilder","poolExists","key","has","getPool","setFont","fontName","DrawText","drawText","text","x","y","color","viewport","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","requestAnimationFrame","nextFrame","pushDeviceStates","windowOrderReversed","isWindingOrderReversed","framebuffer","getViewport","scissor","getScissor","program","getProgram","renderStateSet","getRenderStates","vertexLayout","getVertexLayout","getBindGroup","popDeviceStates","top","pop","setViewport","setScissor","setProgram","setRenderStates","setVertexLayout","setBindGroup","reverseVertexWindingOrder","getGPUObjects","getGPUObjectById","uid","list","screenXToDevice","deviceXToScreen","screenYToDevice","deviceYToScreen","buildRenderProgram","buildComputeProgram","addGPUObject","getGPUObjectList","indexOf","index","splice","updateVideoMemoryCost","delta","initResizer","once","_handleResize","on","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
@@ -1979,7 +1979,7 @@ const vertexAttribNameRevMap = {
1979
1979
  * Get vertex attribute index by semantic
1980
1980
  * @public
1981
1981
  */ function getVertexAttribByName(name) {
1982
- return vertexAttribNameMap[name];
1982
+ return name ? vertexAttribNameMap[name] : undefined;
1983
1983
  }
1984
1984
  /**
1985
1985
  * Get vertex semantic by attribute index
@@ -2012,6 +2012,7 @@ const vertexAttribNameRevMap = {
2012
2012
  } else {
2013
2013
  return buffer.structure.structMembers[0].name === name;
2014
2014
  }
2015
+ return false;
2015
2016
  }
2016
2017
  /**
2017
2018
  * Get vertex attribute type of specified vertex format