@zephyr3d/device 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/device.js
CHANGED
|
@@ -194,10 +194,10 @@ class ResizeHandler {
|
|
|
194
194
|
}, this._dpr);
|
|
195
195
|
}
|
|
196
196
|
getScaleX() {
|
|
197
|
-
return this._canvas.width / this._canvas.clientWidth;
|
|
197
|
+
return this._canvas.clientWidth === 0 ? 0 : this._canvas.width / this._canvas.clientWidth;
|
|
198
198
|
}
|
|
199
199
|
getScaleY() {
|
|
200
|
-
return this._canvas.height / this._canvas.clientHeight;
|
|
200
|
+
return this._canvas.clientHeight === 0 ? 0 : this._canvas.height / this._canvas.clientHeight;
|
|
201
201
|
}
|
|
202
202
|
get backend() {
|
|
203
203
|
return this._backend;
|
package/dist/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sources":["../src/device.ts"],"sourcesContent":["import type { Immutable, Nullable, Rect, Vector3 } 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 DrawTextLayoutOptions\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 boxSize = Array.isArray(_entry.contentBoxSize) ? _entry.contentBoxSize[0] : _entry.contentBoxSize;\r\n const cssWidth = boxSize?.inlineSize ?? this._canvas.clientWidth;\r\n const cssHeight = boxSize?.blockSize ?? 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 stacks: new Map(),\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: Nullable<string>) {\r\n DrawText.setFont(this, fontName);\r\n }\r\n setTextRenderStates(renderStates: Nullable<RenderStateSet>) {\r\n DrawText.setRenderStates(renderStates);\r\n }\r\n drawText(text: string, x: number, y: number, color: string | Vector3 | Vector4): void;\r\n drawText(\r\n text: string,\r\n rect: Immutable<Rect>,\r\n color: string | Vector3 | Vector4,\r\n options?: DrawTextLayoutOptions\r\n ): void;\r\n drawText(\r\n text: string,\r\n xOrRect: number | Immutable<Rect>,\r\n yOrColor: number | string | Vector3 | Vector4,\r\n colorOrOptions?: string | Vector3 | Vector4 | DrawTextLayoutOptions,\r\n options?: DrawTextLayoutOptions\r\n ) {\r\n if (typeof xOrRect === 'number') {\r\n DrawText.drawText(\r\n this,\r\n text,\r\n colorOrOptions as string | Vector3 | Vector4,\r\n xOrRect,\r\n yOrColor as number\r\n );\r\n } else {\r\n DrawText.drawText(\r\n this,\r\n text,\r\n yOrColor as string | Vector3 | Vector4,\r\n xOrRect,\r\n options ?? (colorOrOptions as DrawTextLayoutOptions)\r\n );\r\n }\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 getGPUObjectStack(obj: GPUObject): string {\r\n return this._gpuObjectList.stacks.get(obj) ?? '';\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._gpuObjectList.stacks.set(obj, new Error().stack ?? '');\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._gpuObjectList.stacks.delete(obj);\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","boxSize","Array","isArray","contentBoxSize","cssWidth","inlineSize","clientWidth","cssHeight","blockSize","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","stacks","Map","textures","samplers","buffers","programs","framebuffers","vertexArrayObjects","bindGroups","setAttribute","frameCounter","frameTimestamp","elapsedTimeCPU","elapsedTimeGPU","elapsedFrame","elapsedOverall","FPS","drawCalls","computeCalls","nextFrameCall","nextFrameCallNext","ProgramBuilder","CPUTimer","time","frame","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","setTextRenderStates","renderStates","setRenderStates","drawText","text","xOrRect","yOrColor","colorOrOptions","options","setFramebuffer","colorOrRT","depth","sampleCount","newRT","temporal","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","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","viewport","getViewport","scissor","getScissor","program","getProgram","renderStateSet","getRenderStates","vertexLayout","getVertexLayout","getBindGroup","popDeviceStates","top","pop","setViewport","setScissor","setProgram","setVertexLayout","setBindGroup","reverseVertexWindingOrder","getGPUObjects","getGPUObjectById","uid","list","screenXToDevice","deviceXToScreen","screenYToDevice","deviceYToScreen","buildRenderProgram","buildComputeProgram","getGPUObjectStack","addGPUObject","getGPUObjectList","indexOf","Error","stack","index","splice","delete","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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"}
|
|
1
|
+
{"version":3,"file":"device.js","sources":["../src/device.ts"],"sourcesContent":["import type { Immutable, Nullable, Rect, Vector3 } 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 DrawTextLayoutOptions\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 boxSize = Array.isArray(_entry.contentBoxSize) ? _entry.contentBoxSize[0] : _entry.contentBoxSize;\r\n const cssWidth = boxSize?.inlineSize ?? this._canvas.clientWidth;\r\n const cssHeight = boxSize?.blockSize ?? 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 stacks: new Map(),\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.clientWidth === 0 ? 0 : this._canvas.width / this._canvas.clientWidth;\r\n }\r\n getScaleY() {\r\n return this._canvas.clientHeight === 0 ? 0 : 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: Nullable<string>) {\r\n DrawText.setFont(this, fontName);\r\n }\r\n setTextRenderStates(renderStates: Nullable<RenderStateSet>) {\r\n DrawText.setRenderStates(renderStates);\r\n }\r\n drawText(text: string, x: number, y: number, color: string | Vector3 | Vector4): void;\r\n drawText(\r\n text: string,\r\n rect: Immutable<Rect>,\r\n color: string | Vector3 | Vector4,\r\n options?: DrawTextLayoutOptions\r\n ): void;\r\n drawText(\r\n text: string,\r\n xOrRect: number | Immutable<Rect>,\r\n yOrColor: number | string | Vector3 | Vector4,\r\n colorOrOptions?: string | Vector3 | Vector4 | DrawTextLayoutOptions,\r\n options?: DrawTextLayoutOptions\r\n ) {\r\n if (typeof xOrRect === 'number') {\r\n DrawText.drawText(\r\n this,\r\n text,\r\n colorOrOptions as string | Vector3 | Vector4,\r\n xOrRect,\r\n yOrColor as number\r\n );\r\n } else {\r\n DrawText.drawText(\r\n this,\r\n text,\r\n yOrColor as string | Vector3 | Vector4,\r\n xOrRect,\r\n options ?? (colorOrOptions as DrawTextLayoutOptions)\r\n );\r\n }\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 getGPUObjectStack(obj: GPUObject): string {\r\n return this._gpuObjectList.stacks.get(obj) ?? '';\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._gpuObjectList.stacks.set(obj, new Error().stack ?? '');\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._gpuObjectList.stacks.delete(obj);\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","boxSize","Array","isArray","contentBoxSize","cssWidth","inlineSize","clientWidth","cssHeight","blockSize","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","stacks","Map","textures","samplers","buffers","programs","framebuffers","vertexArrayObjects","bindGroups","setAttribute","frameCounter","frameTimestamp","elapsedTimeCPU","elapsedTimeGPU","elapsedFrame","elapsedOverall","FPS","drawCalls","computeCalls","nextFrameCall","nextFrameCallNext","ProgramBuilder","CPUTimer","time","frame","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","setTextRenderStates","renderStates","setRenderStates","drawText","text","xOrRect","yOrColor","colorOrOptions","options","setFramebuffer","colorOrRT","depth","sampleCount","newRT","temporal","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","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","viewport","getViewport","scissor","getScissor","program","getProgram","renderStateSet","getRenderStates","vertexLayout","getVertexLayout","getBindGroup","popDeviceStates","top","pop","setViewport","setScissor","setProgram","setVertexLayout","setBindGroup","reverseVertexWindingOrder","getGPUObjects","getGPUObjectById","uid","list","screenXToDevice","deviceXToScreen","screenYToDevice","deviceYToScreen","buildRenderProgram","buildComputeProgram","getGPUObjectStack","addGPUObject","getGPUObjectList","indexOf","Error","stack","index","splice","delete","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/index.d.ts
CHANGED
|
@@ -1572,7 +1572,7 @@ interface ProgramBuilder {
|
|
|
1572
1572
|
* @param options - The build options
|
|
1573
1573
|
* @returns a tuple made by vertex shader source, fragment shader source, bind group layouts and vertex attributes used, or null if build faild
|
|
1574
1574
|
*/
|
|
1575
|
-
buildRender(options: PBRenderOptions): readonly [string, string, BindGroupLayout[], number[]];
|
|
1575
|
+
buildRender(options: PBRenderOptions): readonly [string, string, BindGroupLayout[], number[], number];
|
|
1576
1576
|
/**
|
|
1577
1577
|
* Generates shader code for a compute program
|
|
1578
1578
|
* @param options - The build programs
|
|
@@ -3290,6 +3290,8 @@ interface RenderProgramConstructParams {
|
|
|
3290
3290
|
vs: string;
|
|
3291
3291
|
/** The fragment shader source code */
|
|
3292
3292
|
fs: string;
|
|
3293
|
+
/** Number of fragment color outputs declared by the shader */
|
|
3294
|
+
fragmentOutputCount?: number;
|
|
3293
3295
|
/** Bind group layouts for the program */
|
|
3294
3296
|
bindGroupLayouts: BindGroupLayout[];
|
|
3295
3297
|
/** Vertex attributes used in the program */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zephyr3d/device",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
4
|
"description": "Device API for zephyr3d",
|
|
5
5
|
"homepage": "https://github.com/gavinyork/zephyr3d#readme",
|
|
6
6
|
"type": "module",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"@rollup/plugin-commonjs": "~28.0.2",
|
|
69
69
|
"@types/node": "^22.12.0",
|
|
70
70
|
"@webgpu/types": "^0.1.65",
|
|
71
|
-
"@zephyr3d/base": "^0.2.
|
|
71
|
+
"@zephyr3d/base": "^0.2.8",
|
|
72
72
|
"rollup-plugin-import-css": "~3.5.8"
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|