@zephyr3d/device 0.2.5 → 0.2.7

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 +148 -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,113 @@ 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
+ } catch {
37
+ this._resizeObserver.observe(canvas);
38
+ }
39
+ } else {
40
+ if (window.MutationObserver) {
41
+ this._mutationObserver = new MutationObserver((mutations)=>{
42
+ if (mutations.length > 0) {
43
+ this._handleLegacyResize();
44
+ }
45
+ });
46
+ this._mutationObserver.observe(canvas, {
47
+ attributes: true,
48
+ attributeFilter: [
49
+ 'style'
50
+ ]
51
+ });
52
+ }
53
+ window.addEventListener('resize', this._handleLegacyResize);
54
+ this._handleLegacyResize();
55
+ }
56
+ }
57
+ _handleResizeEntry(_entry) {
58
+ // CSS pixel
59
+ const cssWidth = _entry.contentBoxSize[0].inlineSize;
60
+ const cssHeight = _entry.contentBoxSize[0].blockSize;
61
+ // Device pixel
62
+ /*
63
+ let deviceWidth: number;
64
+ let deviceHeight: number;
65
+
66
+ const dpBox = (entry as any).devicePixelContentBoxSize?.[0];
67
+ if (dpBox) {
68
+ deviceWidth = dpBox.inlineSize;
69
+ deviceHeight = dpBox.blockSize;
70
+ } else {
71
+ deviceWidth = Math.round(cssWidth * this._dpr);
72
+ deviceHeight = Math.round(cssHeight * this._dpr);
73
+ }
74
+ */ const deviceWidth = cssWidth * this._dpr;
75
+ const deviceHeight = cssHeight * this._dpr;
76
+ if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
77
+ return;
78
+ }
79
+ this._cssWidth = cssWidth;
80
+ this._cssHeight = cssHeight;
81
+ this._deviceWidth = deviceWidth;
82
+ this._deviceHeight = deviceHeight;
83
+ this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
84
+ }
85
+ _handleLegacyResize = ()=>{
86
+ const cssWidth = this._canvas.clientWidth;
87
+ const cssHeight = this._canvas.clientHeight;
88
+ const dpr = window.devicePixelRatio || 1;
89
+ const deviceWidth = Math.round(cssWidth * dpr);
90
+ const deviceHeight = Math.round(cssHeight * dpr);
91
+ if (cssWidth === this._cssWidth && cssHeight === this._cssHeight && deviceWidth === this._deviceWidth && deviceHeight === this._deviceHeight) {
92
+ return;
93
+ }
94
+ this._cssWidth = cssWidth;
95
+ this._cssHeight = cssHeight;
96
+ this._deviceWidth = deviceWidth;
97
+ this._deviceHeight = deviceHeight;
98
+ this._onResizeCallback(cssWidth, cssHeight, deviceWidth, deviceHeight);
99
+ };
100
+ dispose() {
101
+ if (this._resizeObserver) {
102
+ this._resizeObserver.disconnect();
103
+ }
104
+ if (this._mutationObserver) {
105
+ this._mutationObserver.disconnect();
106
+ }
107
+ window.removeEventListener('resize', this._handleLegacyResize);
108
+ }
109
+ }
8
110
  /**
9
111
  * Base class for rendering device
10
112
  * @public
11
113
  */ class BaseDevice extends Observable {
114
+ _dpr;
12
115
  _canvas;
13
116
  _canvasClientWidth;
14
117
  _canvasClientHeight;
@@ -30,9 +133,11 @@ import { DrawText } from './helpers/drawtext.js';
30
133
  _defaultPoolKey;
31
134
  _temporalFramebuffer;
32
135
  _vSync;
136
+ _resizer;
33
137
  _stateStack;
34
- constructor(cvs, backend){
138
+ constructor(cvs, backend, dpr){
35
139
  super();
140
+ this._dpr = dpr ?? window.devicePixelRatio ?? 1;
36
141
  this._backend = backend;
37
142
  this._gpuObjectList = {
38
143
  textures: [],
@@ -81,7 +186,16 @@ import { DrawText } from './helpers/drawtext.js';
81
186
  this._temporalFramebuffer = false;
82
187
  this._temporalFramebuffer = false;
83
188
  this._vSync = true;
84
- this._registerEventHandlers();
189
+ //this._registerEventHandlers();
190
+ this._resizer = new ResizeHandler(this._canvas, (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
191
+ this.dispatchEvent('resize', cssWidth, cssHeight, deviceWidth, deviceHeight);
192
+ }, this._dpr);
193
+ }
194
+ getScaleX() {
195
+ return this._canvas.width / this._canvas.clientWidth;
196
+ }
197
+ getScaleY() {
198
+ return this._canvas.height / this._canvas.clientHeight;
85
199
  }
86
200
  get backend() {
87
201
  return this._backend;
@@ -130,8 +244,8 @@ import { DrawText } from './helpers/drawtext.js';
130
244
  setFont(fontName) {
131
245
  DrawText.setFont(this, fontName);
132
246
  }
133
- drawText(text, x, y, color) {
134
- DrawText.drawText(this, text, color, x, y);
247
+ drawText(text, x, y, color, viewport) {
248
+ DrawText.drawText(this, text, color, x, y, viewport);
135
249
  }
136
250
  setFramebuffer(colorOrRT, depth, sampleCount) {
137
251
  let newRT = null;
@@ -144,7 +258,7 @@ import { DrawText } from './helpers/drawtext.js';
144
258
  }
145
259
  const currentRT = this.getFramebuffer();
146
260
  if (currentRT !== newRT) {
147
- if (this._temporalFramebuffer) {
261
+ if (this._temporalFramebuffer && currentRT) {
148
262
  this.pool.releaseFrameBuffer(currentRT);
149
263
  }
150
264
  this._temporalFramebuffer = temporal;
@@ -213,6 +327,10 @@ import { DrawText } from './helpers/drawtext.js';
213
327
  size += getVertexFormatSize(format);
214
328
  }
215
329
  const vertexBufferType = makeVertexBufferType(data.byteLength / size >> 0, ...attribFormats);
330
+ if (!vertexBufferType) {
331
+ console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
332
+ return null;
333
+ }
216
334
  const opt = Object.assign({
217
335
  usage: 'vertex',
218
336
  dynamic: false,
@@ -235,6 +353,10 @@ import { DrawText } from './helpers/drawtext.js';
235
353
  }
236
354
  const count = getVertexFormatSize(attribFormat);
237
355
  const vertexBufferType = makeVertexBufferType(data.byteLength / count >> 0, attribFormat);
356
+ if (!vertexBufferType) {
357
+ console.error('createInterleavedVertexBuffer() failed: Cannot determine vertex buffer type');
358
+ return null;
359
+ }
238
360
  const opt = Object.assign({
239
361
  usage: 'vertex',
240
362
  dynamic: false,
@@ -378,11 +500,17 @@ import { DrawText } from './helpers/drawtext.js';
378
500
  }
379
501
  return null;
380
502
  }
381
- screenToDevice(val) {
382
- return this.getFramebuffer() ? val : Math.round(val * this.getScale());
503
+ screenXToDevice(val) {
504
+ return this.getFramebuffer() ? val : Math.round(val * this.getScaleX());
505
+ }
506
+ deviceXToScreen(val) {
507
+ return this.getFramebuffer() ? val : Math.round(val / this.getScaleX());
508
+ }
509
+ screenYToDevice(val) {
510
+ return this.getFramebuffer() ? val : Math.round(val * this.getScaleY());
383
511
  }
384
- deviceToScreen(val) {
385
- return this.getFramebuffer() ? val : Math.round(val / this.getScale());
512
+ deviceYToScreen(val) {
513
+ return this.getFramebuffer() ? val : Math.round(val / this.getScaleY());
386
514
  }
387
515
  buildRenderProgram(options) {
388
516
  return this._programBuilder.buildRenderProgram(options);
@@ -410,37 +538,17 @@ import { DrawText } from './helpers/drawtext.js';
410
538
  updateVideoMemoryCost(delta) {
411
539
  this._gpuMemCost += delta;
412
540
  }
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
- ]
541
+ async initResizer() {
542
+ return new Promise((resolve)=>{
543
+ this.once('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
544
+ this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
545
+ this.on('resize', (cssWidth, cssHeight, deviceWidth, deviceHeight)=>{
546
+ this._handleResize(cssWidth, cssHeight, deviceWidth, deviceHeight);
438
547
  });
439
- }
440
- window.addEventListener('resize', ()=>{
441
- this._onresize();
548
+ resolve();
442
549
  });
443
- }
550
+ this._resizer.init();
551
+ });
444
552
  }
445
553
  updateFrameInfo() {
446
554
  this._frameInfo.drawCalls = 0;
@@ -551,7 +659,8 @@ import { DrawText } from './helpers/drawtext.js';
551
659
  return noMipmapFlag | writableFlag | dynamicFlag;
552
660
  }
553
661
  parseBufferOptions(options, defaultUsage) {
554
- const usage = options?.usage || defaultUsage;
662
+ options = options ?? {};
663
+ const usage = options.usage ?? defaultUsage;
555
664
  let usageFlag;
556
665
  switch(usage){
557
666
  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);\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 = _entry.contentBoxSize[0].inlineSize;\r\n const cssHeight = _entry.contentBoxSize[0].blockSize;\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","MutationObserver","mutations","length","_handleLegacyResize","attributes","attributeFilter","addEventListener","_entry","cssWidth","contentBoxSize","inlineSize","cssHeight","blockSize","deviceWidth","deviceHeight","clientWidth","clientHeight","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