@zephyr3d/editor 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -0
- package/dist/assets/{index-BaUzUcND.js → index-IISR7uQv.js} +1 -1
- package/dist/assistant/zephyr-types-index.json +1 -1
- package/dist/index.html +2 -2
- package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
- package/dist/modules/zephyr3d_imgui.js +3 -3
- package/dist/modules/zephyr3d_imgui.js.map +1 -1
- package/dist/modules/zephyr3d_scene.js +1439 -1439
- package/dist/modules/zephyr3d_scene.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/bindgroup_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/buffer_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/uploadringbuffer.js.map +1 -1
- package/dist/vendor/zephyr3d/imgui/dist/imgui_impl.js.map +1 -1
- package/dist/vendor/zephyr3d/imgui/dist/renderer.js +3 -3
- package/dist/vendor/zephyr3d/imgui/dist/renderer.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js +135 -135
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/controller.js +146 -146
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/spring/spring_system.js +75 -75
- package/dist/vendor/zephyr3d/scene/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/camera/camera.js +184 -184
- package/dist/vendor/zephyr3d/scene/dist/camera/camera.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/material/material.js +288 -288
- package/dist/vendor/zephyr3d/scene/dist/material/material.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resource_manager.js +93 -93
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resources.js +3 -3
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js +22 -22
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/blueprint/material/ir.js +489 -489
- package/dist/vendor/zephyr3d/scene/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/types.js +4 -4
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bindgroup_webgpu.js","sources":["../src/bindgroup_webgpu.ts"],"sourcesContent":["import type {\r\n BufferCreationOptions,\r\n StructuredValue,\r\n TextureVideo,\r\n PBStructTypeInfo,\r\n BindGroupLayout,\r\n BaseTexture,\r\n TextureSampler,\r\n BindGroup,\r\n BindGroupLayoutEntry,\r\n GPUDataBuffer\r\n} from '@zephyr3d/device';\r\nimport { GPUResourceUsageFlags } from '@zephyr3d/device';\r\nimport { WebGPUStructuredBuffer } from './structuredbuffer_webgpu';\r\nimport type { WebGPUBaseTexture } from './basetexture_webgpu';\r\nimport type { WebGPUTextureVideo } from './texturevideo_webgpu';\r\nimport type { WebGPUTextureSampler } from './sampler_webgpu';\r\nimport { WebGPUObject } from './gpuobject_webgpu';\nimport type { Immutable, Nullable, TypedArray } from '@zephyr3d/base';\nimport type { WebGPUDevice } from './device';\nimport type { WebGPUBuffer } from './buffer_webgpu';\n\nexport class WebGPUBindGroup extends WebGPUObject<unknown> implements BindGroup {\n private readonly _layout: Immutable<BindGroupLayout>;\r\n private _layoutDesc: Nullable<GPUBindGroupLayoutDescriptor>;\r\n private _entries: Nullable<GPUBindGroupEntry[]>;\r\n private _bindGroup: Nullable<GPUBindGroup>;\r\n private _buffers: WebGPUBuffer[];\r\n private _textures: WebGPUBaseTexture[];\r\n private _createdBuffers: WebGPUBuffer[];\n private _gpuId: number;\n private _videoTextures: Nullable<WebGPUTextureVideo[]>;\n private _dynamicOffsets: Nullable<number[]>;\n private _resources: {\n [name: string]:\r\n | [WebGPUBuffer, number, number]\r\n | WebGPUTextureVideo\r\n | [WebGPUBaseTexture, Nullable<GPUTextureView>]\r\n | GPUSampler;\r\n };\r\n constructor(device: WebGPUDevice, layout: Immutable<BindGroupLayout>) {\r\n super(device);\r\n this._device = device;\r\n this._layout = layout;\r\n this._layoutDesc = null;\r\n this._entries = null;\r\n this._bindGroup = null;\r\n this._dynamicOffsets = null;\r\n this._gpuId = 0;\r\n this._resources = {};\n this._buffers = [];\n this._textures = [];\n this._createdBuffers = [];\n this._videoTextures = null;\n for (const entry of this._layout.entries) {\n if (entry.buffer && entry.buffer.hasDynamicOffset) {\r\n if (!this._dynamicOffsets) {\r\n this._dynamicOffsets = [];\r\n }\r\n this._dynamicOffsets[entry.buffer.dynamicOffsetIndex] = 0;\r\n }\r\n }\r\n }\r\n get bindGroup() {\r\n if (!this._bindGroup) {\r\n this._bindGroup = this._create();\r\n }\r\n return this._bindGroup;\r\n }\r\n get layoutDescriptor() {\r\n if (!this._bindGroup) {\r\n this._bindGroup = this._create();\r\n }\r\n return this._layoutDesc;\r\n }\r\n get entries() {\r\n if (!this._bindGroup) {\r\n this._bindGroup = this._create();\r\n }\r\n return this._entries;\r\n }\r\n getGPUId() {\r\n return `${this._uid}:${this._gpuId}`;\r\n }\r\n get bufferList() {\r\n return this._buffers;\r\n }\r\n get textureList() {\n return this._textures;\n }\n invalidate() {\n this._bindGroup = null;\r\n this._gpuId++;\r\n }\r\n getLayout(): Immutable<BindGroupLayout> {\r\n return this._layout;\r\n }\r\n getDynamicOffsets(): Nullable<Immutable<number[]>> {\r\n return this._dynamicOffsets;\r\n }\r\n getBuffer(name: string, nocreate = true) {\r\n return this._getBuffer(\r\n name,\r\n GPUResourceUsageFlags.BF_UNIFORM | GPUResourceUsageFlags.BF_STORAGE,\r\n nocreate\r\n );\r\n }\r\n setBuffer(name: string, buffer: GPUDataBuffer, offset?: number, bindOffset?: number, bindSize?: number) {\r\n const bindName = this._layout.nameMap?.[name] ?? name;\r\n for (const entry of this._layout.entries) {\r\n if (entry.name === bindName) {\r\n if (!entry.buffer) {\r\n console.error(`setBuffer() failed: resource '${name}' is not buffer`);\r\n } else {\r\n bindOffset = bindOffset ?? 0;\r\n bindSize = bindSize ?? (buffer ? Math.max(0, buffer.byteLength - bindOffset) : 0);\r\n const info = this._resources[entry.name] as [WebGPUBuffer, number, number];\r\n const bufferUsage =\r\n entry.buffer.type === 'uniform'\r\n ? GPUResourceUsageFlags.BF_UNIFORM\r\n : GPUResourceUsageFlags.BF_STORAGE;\r\n if (!buffer || !(buffer.usage & bufferUsage)) {\n console.error(\n `setBuffer() failed: buffer resource '${name}' must be type '${entry.buffer.type}'`\n );\n } else if (buffer !== info?.[0] || bindOffset !== info?.[1] || bindSize !== info?.[2]) {\n this._resources[entry.name] = [buffer as WebGPUBuffer, bindOffset, bindSize];\n this.invalidate();\n }\n if (entry.buffer.hasDynamicOffset) {\n this._dynamicOffsets![entry.buffer.dynamicOffsetIndex] = offset ?? 0;\n }\n }\n return;\r\n }\r\n }\r\n console.error(`setBuffer() failed: no buffer resource named '${name}'`);\r\n }\r\n setValue(name: string, value: StructuredValue) {\r\n const mappedName = this._layout.nameMap?.[name];\r\n if (mappedName) {\r\n this.setValue(mappedName, { [name]: value });\r\n } else {\r\n const buffer = this._getBuffer(\r\n name,\r\n GPUResourceUsageFlags.BF_UNIFORM | GPUResourceUsageFlags.BF_STORAGE,\r\n false\r\n );\r\n if (buffer) {\r\n if (!(buffer instanceof WebGPUStructuredBuffer)) {\r\n throw new Error(`BindGroup.setValue() failed: '${name}' is not structured buffer`);\r\n }\r\n if (typeof value === 'number') {\r\n throw new Error(`BindGroup.setValue() failed: cannot set ${value} to '${name}'`);\r\n }\r\n if ('BYTES_PER_ELEMENT' in value) {\r\n buffer.bufferSubData(0, value as TypedArray);\r\n } else {\r\n for (const k in value) {\r\n buffer.set(k, value[k]);\r\n }\r\n }\r\n } else {\r\n console.error(`setValue() failed: no uniform buffer named '${name}'`);\r\n }\r\n }\r\n }\r\n setRawData(name: string, byteOffset: number, data: TypedArray, srcPos?: number, srcLength?: number) {\r\n const mappedName = this._layout.nameMap?.[name];\r\n if (mappedName) {\r\n this.setRawData(mappedName, byteOffset, data, srcPos, srcLength);\r\n } else {\r\n const buffer = this._getBuffer(\r\n name,\r\n GPUResourceUsageFlags.BF_UNIFORM | GPUResourceUsageFlags.BF_STORAGE,\r\n false\r\n );\r\n if (buffer) {\r\n buffer.bufferSubData(byteOffset, data, srcPos, srcLength);\r\n } else {\r\n console.error(`set(): no uniform buffer named '${name}'`);\r\n }\r\n }\r\n }\r\n getTexture(name: string) {\r\n const entry = this._findTextureLayout(name);\r\n if (entry) {\r\n const t = this._resources[name] as [WebGPUBaseTexture, GPUTextureView];\r\n return t ? t[0] : null;\r\n } else {\r\n throw new Error(`getTexture() failed:${name} is not a texture`);\r\n }\r\n }\r\n setTextureView(\r\n name: string,\r\n value: BaseTexture,\r\n level?: number,\r\n face?: number,\r\n mipCount?: number,\r\n sampler?: Nullable<TextureSampler>\r\n ) {\r\n if (!value) {\r\n throw new Error(`WebGPUBindGroup.setTextureView() failed: invalid texture uniform value: ${value}`);\r\n } else {\r\n const entry = this._findTextureLayout(name);\r\n if (entry) {\r\n if (entry.externalTexture) {\r\n throw new Error(`WebGPUBindGroup.setTextureView() failed: video texture does not have view`);\r\n } else if (value.isTextureVideo()) {\r\n throw new Error(`WebGPUBindGroup.setTextureView() failed: invalid texture type`);\r\n }\r\n const t = this._resources[name] as [WebGPUBaseTexture, GPUTextureView];\n const view = (value as WebGPUBaseTexture).getView(level, face, mipCount);\n if (!t || t[1] !== view) {\n this._resources[name] = [value as WebGPUBaseTexture, view];\n this.invalidate();\n }\n if (entry.texture?.autoBindSampler) {\r\n const samplerEntry = this._findSamplerLayout(entry.texture.autoBindSampler);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTextureView() failed: sampler entry not found: ${entry.texture.autoBindSampler}`\r\n );\r\n }\r\n const s = (\r\n !sampler || sampler.compare ? value.getDefaultSampler(false) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[entry.texture.autoBindSampler]) {\r\n this._resources[entry.texture.autoBindSampler] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n if (entry.texture?.autoBindSamplerComparison) {\r\n const samplerEntry = this._findSamplerLayout(entry.texture.autoBindSamplerComparison);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTextureView() failed: sampler entry not found: ${entry.texture.autoBindSamplerComparison}`\r\n );\r\n }\r\n const s = (\r\n !sampler || !sampler.compare ? value.getDefaultSampler(true) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[entry.texture.autoBindSamplerComparison]) {\r\n this._resources[entry.texture.autoBindSamplerComparison] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n } else {\r\n throw new Error(`WebGPUBindGroup.setView() failed: no texture uniform named '${name}'`);\r\n }\r\n }\r\n }\r\n setTexture(name: string, value: BaseTexture | TextureVideo, sampler?: Nullable<TextureSampler>) {\r\n if (!value) {\r\n throw new Error(`WebGPUBindGroup.setTexture() failed: invalid texture uniform value: ${value}`);\r\n } else {\r\n const entry = this._findTextureLayout(name);\r\n if (entry) {\r\n const t = this._resources[name];\r\n if (entry.externalTexture) {\r\n if (!value.isTextureVideo()) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: invalid texture type of resource '${name}'`\r\n );\r\n }\r\n if (!t || t !== value) {\n if (t) {\n (t as WebGPUTextureVideo).removeBindGroupReference(this);\n }\n if (value) {\n (value as WebGPUTextureVideo).addBindGroupReference(this);\n }\n this._resources[name] = value as WebGPUTextureVideo;\n this.invalidate();\n this._videoTextures = [];\n for (const entry of this._layout.entries) {\n if (entry.externalTexture) {\n const tex = this._resources[entry.name] as WebGPUTextureVideo;\n if (tex && this._videoTextures.indexOf(tex) < 0) {\r\n this._videoTextures.push(tex);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (value.isTextureVideo()) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: invalid texture type of resource '${name}'`\r\n );\r\n }\r\n const view = (value as WebGPUBaseTexture).getDefaultView();\n if (!entry.externalTexture && !view) {\n throw new Error('WebGPUBindGroup.setTexture() failed: create texture view failed');\n }\n if (!t || (t as [WebGPUBaseTexture, Nullable<GPUTextureView>])[0] !== value) {\n this._resources[name] = [value as WebGPUBaseTexture, view];\n this.invalidate();\n }\n }\n const autoBindSampler = entry.texture?.autoBindSampler || entry.externalTexture?.autoBindSampler;\r\n if (autoBindSampler) {\r\n const samplerEntry = this._findSamplerLayout(autoBindSampler);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: sampler entry not found: ${autoBindSampler}`\r\n );\r\n }\r\n const s = (\r\n !sampler || sampler.compare ? value.getDefaultSampler(false) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[autoBindSampler]) {\r\n this._resources[autoBindSampler] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n const autoBindSamplerComparison = entry.texture?.autoBindSamplerComparison;\r\n if (autoBindSamplerComparison) {\r\n const samplerEntry = this._findSamplerLayout(autoBindSamplerComparison);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: sampler entry not found: ${autoBindSamplerComparison}`\r\n );\r\n }\r\n const s = (\r\n !sampler || !sampler.compare ? value.getDefaultSampler(true) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[autoBindSamplerComparison]) {\r\n this._resources[autoBindSamplerComparison] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n } else {\r\n throw new Error(`WebGPUBindGroup.setTexture() failed: no texture uniform named '${name}'`);\r\n }\r\n }\r\n }\r\n setSampler(name: string, value: TextureSampler) {\r\n const sampler = (value as WebGPUTextureSampler)?.object;\r\n if (!sampler) {\r\n console.error(`WebGPUBindGroup.setSampler() failed: invalid sampler uniform value: ${value}`);\r\n } else if (this._resources[name] !== sampler) {\r\n if (!this._findSamplerLayout(name)) {\r\n console.error(`WebGPUBindGroup.setSampler() failed: no sampler uniform named '${name}'`);\r\n } else {\r\n this._resources[name] = sampler;\r\n this.invalidate();\r\n }\r\n }\r\n }\r\n destroy() {\n this.invalidate();\n this._resources = {};\n this._buffers = [];\n this._textures = [];\n this._videoTextures = null;\n this._object = null;\n for (const buffer of this._createdBuffers) {\r\n buffer.dispose();\r\n }\r\n this._createdBuffers = [];\r\n }\r\n restore() {\r\n this.invalidate();\r\n this._object = {};\r\n }\r\n isBindGroup(): this is BindGroup {\r\n return true;\r\n }\r\n /** @internal */\r\n updateVideoTextures() {\r\n this._videoTextures?.forEach((t) => {\r\n if (t.updateVideoFrame()) {\r\n this.invalidate();\r\n }\r\n });\r\n }\r\n /** @internal */\r\n private _findTextureLayout(name: string): Nullable<Immutable<BindGroupLayoutEntry>> {\r\n for (const entry of this._layout.entries) {\r\n if ((entry.texture || entry.storageTexture || entry.externalTexture) && entry.name === name) {\r\n return entry;\r\n }\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n private _findSamplerLayout(name: string): Nullable<Immutable<BindGroupLayoutEntry>> {\r\n for (const entry of this._layout.entries) {\r\n if (entry.sampler && entry.name === name) {\r\n return entry;\r\n }\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n private _getBuffer(name: string, usage: number, nocreate = false) {\r\n const info = this._getBufferInfo(name, usage, nocreate);\r\n return info?.[0] ?? null;\r\n }\r\n /** @internal */\r\n private _getBufferInfo(name: string, usage: number, nocreate = false) {\r\n const bindName = this._layout.nameMap?.[name] ?? name;\r\n for (const entry of this._layout.entries) {\r\n if (entry.buffer && entry.name === bindName) {\r\n const bufferUsage =\r\n entry.buffer.type === 'uniform'\r\n ? GPUResourceUsageFlags.BF_UNIFORM\r\n : GPUResourceUsageFlags.BF_STORAGE;\r\n if (!(usage & bufferUsage)) {\r\n return null;\r\n }\r\n let buffer = this._resources[entry.name] as [Nullable<WebGPUBuffer>, number, number];\n if (!nocreate && buffer?.[0]?.disposed) {\n buffer[0] = null;\n this.invalidate();\n }\n if ((!buffer || !buffer[0]) && !nocreate) {\n const options: BufferCreationOptions = {\n usage: bufferUsage === GPUResourceUsageFlags.BF_UNIFORM ? 'uniform' : undefined,\n storage: bufferUsage === GPUResourceUsageFlags.BF_STORAGE,\r\n dynamic: true\r\n };\r\n const gpuBuffer = this._device.createStructuredBuffer(\r\n entry.type as PBStructTypeInfo,\r\n options\r\n ) as WebGPUStructuredBuffer;\n buffer = [gpuBuffer, 0, gpuBuffer.byteLength];\n this._resources[entry.name] = buffer as [WebGPUBuffer, number, number];\n this._createdBuffers.push(gpuBuffer);\n }\n return buffer as [WebGPUBuffer, number, number];\n }\n }\n return null;\n }\n /** @internal */\n private _create() {\n let bindGroup: Nullable<GPUBindGroup> = null;\r\n this._layoutDesc = null;\r\n this._entries = null;\r\n this._textures = [];\r\n this._buffers = [];\r\n const entries = [] as GPUBindGroupEntry[];\r\n let resourceOk = true;\r\n for (const entry of this._layout.entries) {\r\n const ge = { binding: entry.binding } as GPUBindGroupEntry;\r\n if (entry.buffer) {\r\n const buffer = this._getBufferInfo(\r\n entry.name,\r\n entry.buffer.type === 'uniform'\r\n ? GPUResourceUsageFlags.BF_UNIFORM\r\n : GPUResourceUsageFlags.BF_STORAGE,\r\n true\r\n );\r\n if (!buffer) {\r\n throw new Error(\r\n `Uniform buffer '${entry.name}' not exists, maybe you forgot settings some uniform values`\r\n );\r\n }\r\n if (this._buffers.indexOf(buffer[0]) < 0) {\r\n this._buffers.push(buffer[0]);\r\n }\r\n ge.resource = {\r\n buffer: buffer[0].object!,\r\n offset: buffer[1],\r\n size: buffer[2]\r\n };\r\n resourceOk = resourceOk && !!buffer[0].object;\r\n } else if (entry.texture || entry.storageTexture) {\r\n const t = this._resources[entry.name] as [WebGPUBaseTexture, GPUTextureView];\r\n if (!t) {\r\n console.error(`Missing texture in bind group: ${entry.name}`);\r\n resourceOk = false;\r\n } else {\r\n if (this._textures.indexOf(t[0]) < 0) {\r\n this._textures.push(t[0]);\r\n }\r\n ge.resource = t[1];\r\n resourceOk = resourceOk && !!t[1];\r\n }\r\n } else if (entry.externalTexture) {\r\n const t = this._resources[entry.name] as WebGPUTextureVideo;\r\n ge.resource = t.object!;\r\n resourceOk = resourceOk && !!t.object;\r\n } else if (entry.sampler) {\r\n const sampler = this._resources[entry.name] as GPUSampler;\r\n ge.resource = sampler;\r\n resourceOk = resourceOk && !!sampler;\r\n }\r\n entries.push(ge);\r\n }\r\n if (!resourceOk) {\r\n return null;\r\n }\r\n const [desc, layout] = this._device.fetchBindGroupLayout(this._layout);\r\n const descriptor: GPUBindGroupDescriptor = {\r\n layout: layout,\r\n entries\r\n };\r\n if (layout.label) {\r\n descriptor.label = `${layout.label}.bindgroup`;\r\n }\r\n bindGroup = this._device.gpuCreateBindGroup(descriptor);\r\n if (!bindGroup) {\r\n console.error('Create bindgroup failed');\r\n }\r\n this._layoutDesc = desc;\r\n this._entries = entries;\r\n return bindGroup;\r\n }\r\n}\r\n"],"names":["WebGPUBindGroup","WebGPUObject","_layout","_layoutDesc","_entries","_bindGroup","_buffers","_textures","_createdBuffers","_gpuId","_videoTextures","_dynamicOffsets","_resources","device","layout","_device","entry","entries","buffer","hasDynamicOffset","dynamicOffsetIndex","bindGroup","_create","layoutDescriptor","getGPUId","_uid","bufferList","textureList","invalidate","getLayout","getDynamicOffsets","getBuffer","name","nocreate","_getBuffer","GPUResourceUsageFlags","BF_UNIFORM","BF_STORAGE","setBuffer","offset","bindOffset","bindSize","bindName","nameMap","console","error","Math","max","byteLength","info","bufferUsage","type","usage","setValue","value","mappedName","WebGPUStructuredBuffer","Error","bufferSubData","k","set","setRawData","byteOffset","data","srcPos","srcLength","getTexture","_findTextureLayout","t","setTextureView","level","face","mipCount","sampler","externalTexture","isTextureVideo","view","getView","texture","autoBindSampler","samplerEntry","_findSamplerLayout","s","compare","getDefaultSampler","object","autoBindSamplerComparison","setTexture","removeBindGroupReference","addBindGroupReference","tex","indexOf","push","getDefaultView","setSampler","destroy","_object","dispose","restore","isBindGroup","updateVideoTextures","forEach","updateVideoFrame","storageTexture","_getBufferInfo","disposed","options","undefined","storage","dynamic","gpuBuffer","createStructuredBuffer","resourceOk","ge","binding","resource","size","desc","fetchBindGroupLayout","descriptor","label","gpuCreateBindGroup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bindgroup_webgpu.js","sources":["../src/bindgroup_webgpu.ts"],"sourcesContent":["import type {\r\n BufferCreationOptions,\r\n StructuredValue,\r\n TextureVideo,\r\n PBStructTypeInfo,\r\n BindGroupLayout,\r\n BaseTexture,\r\n TextureSampler,\r\n BindGroup,\r\n BindGroupLayoutEntry,\r\n GPUDataBuffer\r\n} from '@zephyr3d/device';\r\nimport { GPUResourceUsageFlags } from '@zephyr3d/device';\r\nimport { WebGPUStructuredBuffer } from './structuredbuffer_webgpu';\r\nimport type { WebGPUBaseTexture } from './basetexture_webgpu';\r\nimport type { WebGPUTextureVideo } from './texturevideo_webgpu';\r\nimport type { WebGPUTextureSampler } from './sampler_webgpu';\r\nimport { WebGPUObject } from './gpuobject_webgpu';\r\nimport type { Immutable, Nullable, TypedArray } from '@zephyr3d/base';\r\nimport type { WebGPUDevice } from './device';\r\nimport type { WebGPUBuffer } from './buffer_webgpu';\r\n\r\nexport class WebGPUBindGroup extends WebGPUObject<unknown> implements BindGroup {\r\n private readonly _layout: Immutable<BindGroupLayout>;\r\n private _layoutDesc: Nullable<GPUBindGroupLayoutDescriptor>;\r\n private _entries: Nullable<GPUBindGroupEntry[]>;\r\n private _bindGroup: Nullable<GPUBindGroup>;\r\n private _buffers: WebGPUBuffer[];\r\n private _textures: WebGPUBaseTexture[];\r\n private _createdBuffers: WebGPUBuffer[];\r\n private _gpuId: number;\r\n private _videoTextures: Nullable<WebGPUTextureVideo[]>;\r\n private _dynamicOffsets: Nullable<number[]>;\r\n private _resources: {\r\n [name: string]:\r\n | [WebGPUBuffer, number, number]\r\n | WebGPUTextureVideo\r\n | [WebGPUBaseTexture, Nullable<GPUTextureView>]\r\n | GPUSampler;\r\n };\r\n constructor(device: WebGPUDevice, layout: Immutable<BindGroupLayout>) {\r\n super(device);\r\n this._device = device;\r\n this._layout = layout;\r\n this._layoutDesc = null;\r\n this._entries = null;\r\n this._bindGroup = null;\r\n this._dynamicOffsets = null;\r\n this._gpuId = 0;\r\n this._resources = {};\r\n this._buffers = [];\r\n this._textures = [];\r\n this._createdBuffers = [];\r\n this._videoTextures = null;\r\n for (const entry of this._layout.entries) {\r\n if (entry.buffer && entry.buffer.hasDynamicOffset) {\r\n if (!this._dynamicOffsets) {\r\n this._dynamicOffsets = [];\r\n }\r\n this._dynamicOffsets[entry.buffer.dynamicOffsetIndex] = 0;\r\n }\r\n }\r\n }\r\n get bindGroup() {\r\n if (!this._bindGroup) {\r\n this._bindGroup = this._create();\r\n }\r\n return this._bindGroup;\r\n }\r\n get layoutDescriptor() {\r\n if (!this._bindGroup) {\r\n this._bindGroup = this._create();\r\n }\r\n return this._layoutDesc;\r\n }\r\n get entries() {\r\n if (!this._bindGroup) {\r\n this._bindGroup = this._create();\r\n }\r\n return this._entries;\r\n }\r\n getGPUId() {\r\n return `${this._uid}:${this._gpuId}`;\r\n }\r\n get bufferList() {\r\n return this._buffers;\r\n }\r\n get textureList() {\r\n return this._textures;\r\n }\r\n invalidate() {\r\n this._bindGroup = null;\r\n this._gpuId++;\r\n }\r\n getLayout(): Immutable<BindGroupLayout> {\r\n return this._layout;\r\n }\r\n getDynamicOffsets(): Nullable<Immutable<number[]>> {\r\n return this._dynamicOffsets;\r\n }\r\n getBuffer(name: string, nocreate = true) {\r\n return this._getBuffer(\r\n name,\r\n GPUResourceUsageFlags.BF_UNIFORM | GPUResourceUsageFlags.BF_STORAGE,\r\n nocreate\r\n );\r\n }\r\n setBuffer(name: string, buffer: GPUDataBuffer, offset?: number, bindOffset?: number, bindSize?: number) {\r\n const bindName = this._layout.nameMap?.[name] ?? name;\r\n for (const entry of this._layout.entries) {\r\n if (entry.name === bindName) {\r\n if (!entry.buffer) {\r\n console.error(`setBuffer() failed: resource '${name}' is not buffer`);\r\n } else {\r\n bindOffset = bindOffset ?? 0;\r\n bindSize = bindSize ?? (buffer ? Math.max(0, buffer.byteLength - bindOffset) : 0);\r\n const info = this._resources[entry.name] as [WebGPUBuffer, number, number];\r\n const bufferUsage =\r\n entry.buffer.type === 'uniform'\r\n ? GPUResourceUsageFlags.BF_UNIFORM\r\n : GPUResourceUsageFlags.BF_STORAGE;\r\n if (!buffer || !(buffer.usage & bufferUsage)) {\r\n console.error(\r\n `setBuffer() failed: buffer resource '${name}' must be type '${entry.buffer.type}'`\r\n );\r\n } else if (buffer !== info?.[0] || bindOffset !== info?.[1] || bindSize !== info?.[2]) {\r\n this._resources[entry.name] = [buffer as WebGPUBuffer, bindOffset, bindSize];\r\n this.invalidate();\r\n }\r\n if (entry.buffer.hasDynamicOffset) {\r\n this._dynamicOffsets![entry.buffer.dynamicOffsetIndex] = offset ?? 0;\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n console.error(`setBuffer() failed: no buffer resource named '${name}'`);\r\n }\r\n setValue(name: string, value: StructuredValue) {\r\n const mappedName = this._layout.nameMap?.[name];\r\n if (mappedName) {\r\n this.setValue(mappedName, { [name]: value });\r\n } else {\r\n const buffer = this._getBuffer(\r\n name,\r\n GPUResourceUsageFlags.BF_UNIFORM | GPUResourceUsageFlags.BF_STORAGE,\r\n false\r\n );\r\n if (buffer) {\r\n if (!(buffer instanceof WebGPUStructuredBuffer)) {\r\n throw new Error(`BindGroup.setValue() failed: '${name}' is not structured buffer`);\r\n }\r\n if (typeof value === 'number') {\r\n throw new Error(`BindGroup.setValue() failed: cannot set ${value} to '${name}'`);\r\n }\r\n if ('BYTES_PER_ELEMENT' in value) {\r\n buffer.bufferSubData(0, value as TypedArray);\r\n } else {\r\n for (const k in value) {\r\n buffer.set(k, value[k]);\r\n }\r\n }\r\n } else {\r\n console.error(`setValue() failed: no uniform buffer named '${name}'`);\r\n }\r\n }\r\n }\r\n setRawData(name: string, byteOffset: number, data: TypedArray, srcPos?: number, srcLength?: number) {\r\n const mappedName = this._layout.nameMap?.[name];\r\n if (mappedName) {\r\n this.setRawData(mappedName, byteOffset, data, srcPos, srcLength);\r\n } else {\r\n const buffer = this._getBuffer(\r\n name,\r\n GPUResourceUsageFlags.BF_UNIFORM | GPUResourceUsageFlags.BF_STORAGE,\r\n false\r\n );\r\n if (buffer) {\r\n buffer.bufferSubData(byteOffset, data, srcPos, srcLength);\r\n } else {\r\n console.error(`set(): no uniform buffer named '${name}'`);\r\n }\r\n }\r\n }\r\n getTexture(name: string) {\r\n const entry = this._findTextureLayout(name);\r\n if (entry) {\r\n const t = this._resources[name] as [WebGPUBaseTexture, GPUTextureView];\r\n return t ? t[0] : null;\r\n } else {\r\n throw new Error(`getTexture() failed:${name} is not a texture`);\r\n }\r\n }\r\n setTextureView(\r\n name: string,\r\n value: BaseTexture,\r\n level?: number,\r\n face?: number,\r\n mipCount?: number,\r\n sampler?: Nullable<TextureSampler>\r\n ) {\r\n if (!value) {\r\n throw new Error(`WebGPUBindGroup.setTextureView() failed: invalid texture uniform value: ${value}`);\r\n } else {\r\n const entry = this._findTextureLayout(name);\r\n if (entry) {\r\n if (entry.externalTexture) {\r\n throw new Error(`WebGPUBindGroup.setTextureView() failed: video texture does not have view`);\r\n } else if (value.isTextureVideo()) {\r\n throw new Error(`WebGPUBindGroup.setTextureView() failed: invalid texture type`);\r\n }\r\n const t = this._resources[name] as [WebGPUBaseTexture, GPUTextureView];\r\n const view = (value as WebGPUBaseTexture).getView(level, face, mipCount);\r\n if (!t || t[1] !== view) {\r\n this._resources[name] = [value as WebGPUBaseTexture, view];\r\n this.invalidate();\r\n }\r\n if (entry.texture?.autoBindSampler) {\r\n const samplerEntry = this._findSamplerLayout(entry.texture.autoBindSampler);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTextureView() failed: sampler entry not found: ${entry.texture.autoBindSampler}`\r\n );\r\n }\r\n const s = (\r\n !sampler || sampler.compare ? value.getDefaultSampler(false) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[entry.texture.autoBindSampler]) {\r\n this._resources[entry.texture.autoBindSampler] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n if (entry.texture?.autoBindSamplerComparison) {\r\n const samplerEntry = this._findSamplerLayout(entry.texture.autoBindSamplerComparison);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTextureView() failed: sampler entry not found: ${entry.texture.autoBindSamplerComparison}`\r\n );\r\n }\r\n const s = (\r\n !sampler || !sampler.compare ? value.getDefaultSampler(true) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[entry.texture.autoBindSamplerComparison]) {\r\n this._resources[entry.texture.autoBindSamplerComparison] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n } else {\r\n throw new Error(`WebGPUBindGroup.setView() failed: no texture uniform named '${name}'`);\r\n }\r\n }\r\n }\r\n setTexture(name: string, value: BaseTexture | TextureVideo, sampler?: Nullable<TextureSampler>) {\r\n if (!value) {\r\n throw new Error(`WebGPUBindGroup.setTexture() failed: invalid texture uniform value: ${value}`);\r\n } else {\r\n const entry = this._findTextureLayout(name);\r\n if (entry) {\r\n const t = this._resources[name];\r\n if (entry.externalTexture) {\r\n if (!value.isTextureVideo()) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: invalid texture type of resource '${name}'`\r\n );\r\n }\r\n if (!t || t !== value) {\r\n if (t) {\r\n (t as WebGPUTextureVideo).removeBindGroupReference(this);\r\n }\r\n if (value) {\r\n (value as WebGPUTextureVideo).addBindGroupReference(this);\r\n }\r\n this._resources[name] = value as WebGPUTextureVideo;\r\n this.invalidate();\r\n this._videoTextures = [];\r\n for (const entry of this._layout.entries) {\r\n if (entry.externalTexture) {\r\n const tex = this._resources[entry.name] as WebGPUTextureVideo;\r\n if (tex && this._videoTextures.indexOf(tex) < 0) {\r\n this._videoTextures.push(tex);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n if (value.isTextureVideo()) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: invalid texture type of resource '${name}'`\r\n );\r\n }\r\n const view = (value as WebGPUBaseTexture).getDefaultView();\r\n if (!entry.externalTexture && !view) {\r\n throw new Error('WebGPUBindGroup.setTexture() failed: create texture view failed');\r\n }\r\n if (!t || (t as [WebGPUBaseTexture, Nullable<GPUTextureView>])[0] !== value) {\r\n this._resources[name] = [value as WebGPUBaseTexture, view];\r\n this.invalidate();\r\n }\r\n }\r\n const autoBindSampler = entry.texture?.autoBindSampler || entry.externalTexture?.autoBindSampler;\r\n if (autoBindSampler) {\r\n const samplerEntry = this._findSamplerLayout(autoBindSampler);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: sampler entry not found: ${autoBindSampler}`\r\n );\r\n }\r\n const s = (\r\n !sampler || sampler.compare ? value.getDefaultSampler(false) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[autoBindSampler]) {\r\n this._resources[autoBindSampler] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n const autoBindSamplerComparison = entry.texture?.autoBindSamplerComparison;\r\n if (autoBindSamplerComparison) {\r\n const samplerEntry = this._findSamplerLayout(autoBindSamplerComparison);\r\n if (!samplerEntry || !samplerEntry.sampler) {\r\n throw new Error(\r\n `WebGPUBindGroup.setTexture() failed: sampler entry not found: ${autoBindSamplerComparison}`\r\n );\r\n }\r\n const s = (\r\n !sampler || !sampler.compare ? value.getDefaultSampler(true) : sampler\r\n ) as WebGPUTextureSampler;\r\n if (s.object !== this._resources[autoBindSamplerComparison]) {\r\n this._resources[autoBindSamplerComparison] = s.object!;\r\n this.invalidate();\r\n }\r\n }\r\n } else {\r\n throw new Error(`WebGPUBindGroup.setTexture() failed: no texture uniform named '${name}'`);\r\n }\r\n }\r\n }\r\n setSampler(name: string, value: TextureSampler) {\r\n const sampler = (value as WebGPUTextureSampler)?.object;\r\n if (!sampler) {\r\n console.error(`WebGPUBindGroup.setSampler() failed: invalid sampler uniform value: ${value}`);\r\n } else if (this._resources[name] !== sampler) {\r\n if (!this._findSamplerLayout(name)) {\r\n console.error(`WebGPUBindGroup.setSampler() failed: no sampler uniform named '${name}'`);\r\n } else {\r\n this._resources[name] = sampler;\r\n this.invalidate();\r\n }\r\n }\r\n }\r\n destroy() {\r\n this.invalidate();\r\n this._resources = {};\r\n this._buffers = [];\r\n this._textures = [];\r\n this._videoTextures = null;\r\n this._object = null;\r\n for (const buffer of this._createdBuffers) {\r\n buffer.dispose();\r\n }\r\n this._createdBuffers = [];\r\n }\r\n restore() {\r\n this.invalidate();\r\n this._object = {};\r\n }\r\n isBindGroup(): this is BindGroup {\r\n return true;\r\n }\r\n /** @internal */\r\n updateVideoTextures() {\r\n this._videoTextures?.forEach((t) => {\r\n if (t.updateVideoFrame()) {\r\n this.invalidate();\r\n }\r\n });\r\n }\r\n /** @internal */\r\n private _findTextureLayout(name: string): Nullable<Immutable<BindGroupLayoutEntry>> {\r\n for (const entry of this._layout.entries) {\r\n if ((entry.texture || entry.storageTexture || entry.externalTexture) && entry.name === name) {\r\n return entry;\r\n }\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n private _findSamplerLayout(name: string): Nullable<Immutable<BindGroupLayoutEntry>> {\r\n for (const entry of this._layout.entries) {\r\n if (entry.sampler && entry.name === name) {\r\n return entry;\r\n }\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n private _getBuffer(name: string, usage: number, nocreate = false) {\r\n const info = this._getBufferInfo(name, usage, nocreate);\r\n return info?.[0] ?? null;\r\n }\r\n /** @internal */\r\n private _getBufferInfo(name: string, usage: number, nocreate = false) {\r\n const bindName = this._layout.nameMap?.[name] ?? name;\r\n for (const entry of this._layout.entries) {\r\n if (entry.buffer && entry.name === bindName) {\r\n const bufferUsage =\r\n entry.buffer.type === 'uniform'\r\n ? GPUResourceUsageFlags.BF_UNIFORM\r\n : GPUResourceUsageFlags.BF_STORAGE;\r\n if (!(usage & bufferUsage)) {\r\n return null;\r\n }\r\n let buffer = this._resources[entry.name] as [Nullable<WebGPUBuffer>, number, number];\r\n if (!nocreate && buffer?.[0]?.disposed) {\r\n buffer[0] = null;\r\n this.invalidate();\r\n }\r\n if ((!buffer || !buffer[0]) && !nocreate) {\r\n const options: BufferCreationOptions = {\r\n usage: bufferUsage === GPUResourceUsageFlags.BF_UNIFORM ? 'uniform' : undefined,\r\n storage: bufferUsage === GPUResourceUsageFlags.BF_STORAGE,\r\n dynamic: true\r\n };\r\n const gpuBuffer = this._device.createStructuredBuffer(\r\n entry.type as PBStructTypeInfo,\r\n options\r\n ) as WebGPUStructuredBuffer;\r\n buffer = [gpuBuffer, 0, gpuBuffer.byteLength];\r\n this._resources[entry.name] = buffer as [WebGPUBuffer, number, number];\r\n this._createdBuffers.push(gpuBuffer);\r\n }\r\n return buffer as [WebGPUBuffer, number, number];\r\n }\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n private _create() {\r\n let bindGroup: Nullable<GPUBindGroup> = null;\r\n this._layoutDesc = null;\r\n this._entries = null;\r\n this._textures = [];\r\n this._buffers = [];\r\n const entries = [] as GPUBindGroupEntry[];\r\n let resourceOk = true;\r\n for (const entry of this._layout.entries) {\r\n const ge = { binding: entry.binding } as GPUBindGroupEntry;\r\n if (entry.buffer) {\r\n const buffer = this._getBufferInfo(\r\n entry.name,\r\n entry.buffer.type === 'uniform'\r\n ? GPUResourceUsageFlags.BF_UNIFORM\r\n : GPUResourceUsageFlags.BF_STORAGE,\r\n true\r\n );\r\n if (!buffer) {\r\n throw new Error(\r\n `Uniform buffer '${entry.name}' not exists, maybe you forgot settings some uniform values`\r\n );\r\n }\r\n if (this._buffers.indexOf(buffer[0]) < 0) {\r\n this._buffers.push(buffer[0]);\r\n }\r\n ge.resource = {\r\n buffer: buffer[0].object!,\r\n offset: buffer[1],\r\n size: buffer[2]\r\n };\r\n resourceOk = resourceOk && !!buffer[0].object;\r\n } else if (entry.texture || entry.storageTexture) {\r\n const t = this._resources[entry.name] as [WebGPUBaseTexture, GPUTextureView];\r\n if (!t) {\r\n console.error(`Missing texture in bind group: ${entry.name}`);\r\n resourceOk = false;\r\n } else {\r\n if (this._textures.indexOf(t[0]) < 0) {\r\n this._textures.push(t[0]);\r\n }\r\n ge.resource = t[1];\r\n resourceOk = resourceOk && !!t[1];\r\n }\r\n } else if (entry.externalTexture) {\r\n const t = this._resources[entry.name] as WebGPUTextureVideo;\r\n ge.resource = t.object!;\r\n resourceOk = resourceOk && !!t.object;\r\n } else if (entry.sampler) {\r\n const sampler = this._resources[entry.name] as GPUSampler;\r\n ge.resource = sampler;\r\n resourceOk = resourceOk && !!sampler;\r\n }\r\n entries.push(ge);\r\n }\r\n if (!resourceOk) {\r\n return null;\r\n }\r\n const [desc, layout] = this._device.fetchBindGroupLayout(this._layout);\r\n const descriptor: GPUBindGroupDescriptor = {\r\n layout: layout,\r\n entries\r\n };\r\n if (layout.label) {\r\n descriptor.label = `${layout.label}.bindgroup`;\r\n }\r\n bindGroup = this._device.gpuCreateBindGroup(descriptor);\r\n if (!bindGroup) {\r\n console.error('Create bindgroup failed');\r\n }\r\n this._layoutDesc = desc;\r\n this._entries = entries;\r\n return bindGroup;\r\n }\r\n}\r\n"],"names":["WebGPUBindGroup","WebGPUObject","_layout","_layoutDesc","_entries","_bindGroup","_buffers","_textures","_createdBuffers","_gpuId","_videoTextures","_dynamicOffsets","_resources","device","layout","_device","entry","entries","buffer","hasDynamicOffset","dynamicOffsetIndex","bindGroup","_create","layoutDescriptor","getGPUId","_uid","bufferList","textureList","invalidate","getLayout","getDynamicOffsets","getBuffer","name","nocreate","_getBuffer","GPUResourceUsageFlags","BF_UNIFORM","BF_STORAGE","setBuffer","offset","bindOffset","bindSize","bindName","nameMap","console","error","Math","max","byteLength","info","bufferUsage","type","usage","setValue","value","mappedName","WebGPUStructuredBuffer","Error","bufferSubData","k","set","setRawData","byteOffset","data","srcPos","srcLength","getTexture","_findTextureLayout","t","setTextureView","level","face","mipCount","sampler","externalTexture","isTextureVideo","view","getView","texture","autoBindSampler","samplerEntry","_findSamplerLayout","s","compare","getDefaultSampler","object","autoBindSamplerComparison","setTexture","removeBindGroupReference","addBindGroupReference","tex","indexOf","push","getDefaultView","setSampler","destroy","_object","dispose","restore","isBindGroup","updateVideoTextures","forEach","updateVideoFrame","storageTexture","_getBufferInfo","disposed","options","undefined","storage","dynamic","gpuBuffer","createStructuredBuffer","resourceOk","ge","binding","resource","size","desc","fetchBindGroupLayout","descriptor","label","gpuCreateBindGroup"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buffer_webgpu.js","sources":["../src/buffer_webgpu.ts"],"sourcesContent":["import type { GPUDataBuffer } from '@zephyr3d/device';\nimport { GPUResourceUsageFlags } from '@zephyr3d/device';\nimport { WebGPUObject } from './gpuobject_webgpu';\nimport { UploadRingBuffer } from './uploadringbuffer';\nimport type { Nullable, TypedArray, TypedArrayConstructor } from '@zephyr3d/base';\nimport type { WebGPUDevice } from './device';\nimport type { MappedBuffer } from './uploadringbuffer';\n\ntype PendingUploadRange = {\n offset: number;\n size: number;\n};\n\nexport class WebGPUBuffer extends WebGPUObject<GPUBuffer> implements GPUDataBuffer<GPUBuffer> {\n private readonly _size: number;\n private readonly _usage: number;\n private _gpuUsage: number;\n private _memCost: number;\n private readonly _ringBuffer: UploadRingBuffer;\n protected _pendingUploads: PendingUploadRange[];\n private _pendingUploadBuffer: Nullable<MappedBuffer>;\n constructor(device: WebGPUDevice, usage: number, data: TypedArray | number) {\n super(device);\n this._object = null;\n this._memCost = 0;\n this._usage = usage;\n this._gpuUsage = 0;\n this._size = typeof data === 'number' ? data : data.byteLength;\n if (this._size <= 0) {\n throw new Error('can not create buffer with zero size');\n }\n this._ringBuffer = new UploadRingBuffer(device, (this._size + 15) & ~15);\n this._pendingUploads = [];\n this._pendingUploadBuffer = null;\n this.load(typeof data === 'number' ? null : data);\n }\n get hash() {\n return this._object ? this._device.gpuGetObjectHash(this._object) : 0;\n }\n get byteLength() {\n return this._size;\n }\n get usage() {\n return this._usage;\n }\n get gpuUsage() {\n return this._gpuUsage;\n }\n private mergePendingUpload(offset: number, size: number) {\n let start = offset;\n let end = offset + size;\n let insertIndex = this._pendingUploads.length;\n for (let i = 0; i < this._pendingUploads.length; i++) {\n const pending = this._pendingUploads[i];\n const pendingEnd = pending.offset + pending.size;\n if (pending.offset > end) {\n insertIndex = i;\n break;\n }\n if (pendingEnd >= start && pending.offset <= end) {\n start = Math.min(start, pending.offset);\n end = Math.max(end, pendingEnd);\n this._pendingUploads.splice(i, 1);\n i--;\n insertIndex = i + 1;\n }\n }\n this._pendingUploads.splice(insertIndex, 0, {\n offset: start,\n size: end - start\n });\n }\n bufferSubData(dstByteOffset: number, data: TypedArray, srcOffset?: number, srcLength?: number) {\n srcOffset = Number(srcOffset) || 0;\n dstByteOffset = Number(dstByteOffset) || 0;\n srcLength = Number(srcLength) || data.length - srcOffset;\n if (srcOffset + srcLength > data.length) {\n throw new Error('bufferSubData() failed: source buffer is too small');\n }\n if (dstByteOffset + srcLength * data.BYTES_PER_ELEMENT > this.byteLength) {\n throw new Error('bufferSubData() failed: dest buffer is too small');\n }\n const uploadSize = srcLength * data.BYTES_PER_ELEMENT;\n if ((dstByteOffset & 3) !== 0 || (uploadSize & 3) !== 0) {\n throw new Error(\n 'bufferSubData() failed: destination byte offset or upload size must be 4 bytes aligned'\n );\n }\n const uploadOffset = data.byteOffset + srcOffset * data.BYTES_PER_ELEMENT;\n // Resolve segment ownership before mutating the shared staging page. If this\n // upload has to start a new segment, the previous segment must snapshot its\n // pending uploads against the old staging contents first.\n this._device.bufferUpload(this, dstByteOffset, uploadSize);\n this._pendingUploadBuffer ??= this._ringBuffer.fetchBufferMapped((this.byteLength + 15) & ~15);\n new Uint8Array(this._pendingUploadBuffer.mappedRange!, dstByteOffset, uploadSize).set(\n new Uint8Array(data.buffer, uploadOffset, uploadSize)\n );\n this.mergePendingUpload(dstByteOffset, uploadSize);\n }\n async getBufferSubData(\n dstBuffer?: Nullable<Uint8Array<ArrayBuffer>>,\n offsetInBytes?: number,\n sizeInBytes?: number\n ) {\n let sourceBuffer: GPUDataBuffer = this;\n offsetInBytes = Number(offsetInBytes) || 0;\n sizeInBytes = Number(sizeInBytes) || this.byteLength - offsetInBytes;\n if (offsetInBytes < 0 || offsetInBytes + sizeInBytes > this.byteLength) {\n throw new Error('data query range out of bounds');\n }\n if (dstBuffer && dstBuffer.byteLength < sizeInBytes) {\n throw new Error('no enough space for querying buffer data');\n }\n let readOffsetInBytes = offsetInBytes;\n if (!(this._usage & (GPUResourceUsageFlags.BF_READ | GPUResourceUsageFlags.BF_PACK_PIXEL))) {\n if (this._gpuUsage & GPUBufferUsage.COPY_SRC) {\n const copyOffsetInBytes = offsetInBytes & ~3;\n readOffsetInBytes = offsetInBytes - copyOffsetInBytes;\n const copySizeInBytes = (readOffsetInBytes + sizeInBytes + 3) & ~3;\n sourceBuffer = this._device.createBuffer(copySizeInBytes, { usage: 'read' });\n this._device.copyBuffer(this, sourceBuffer, copyOffsetInBytes, 0, copySizeInBytes);\n this._device.flush();\n } else {\n throw new Error('getBufferSubData() failed: buffer does not have BF_READ or BF_PACK_PIXEL flag set');\n }\n } else {\n this.sync();\n }\n const buffer = sourceBuffer.object as GPUBuffer;\n await buffer.mapAsync(GPUMapMode.READ);\n const range = buffer.getMappedRange();\n dstBuffer = dstBuffer || new Uint8Array(sizeInBytes);\n dstBuffer.set(new Uint8Array(range, readOffsetInBytes, sizeInBytes));\n buffer.unmap();\n\n if (sourceBuffer !== this) {\n sourceBuffer.dispose();\n }\n\n return dstBuffer;\n }\n restore() {\n if (!this._device.isContextLost()) {\n this.load();\n }\n }\n destroy() {\n if (this._object) {\n this._object.destroy();\n this._object = null;\n this._gpuUsage = 0;\n this._memCost = 0;\n this._pendingUploadBuffer = null;\n this._pendingUploads.length = 0;\n }\n }\n isBuffer(): this is GPUDataBuffer {\n return true;\n }\n beginSyncChanges(encoder: GPUCommandEncoder) {\n if (this._pendingUploads.length > 0) {\n if (!this._object || !this._pendingUploadBuffer) {\n this._pendingUploads.length = 0;\n this._pendingUploadBuffer = null;\n this._ringBuffer.beginUploads();\n return;\n }\n const cmdEncoder = encoder || this._device.device.createCommandEncoder();\n for (const upload of this._pendingUploads) {\n cmdEncoder.copyBufferToBuffer(\n this._pendingUploadBuffer.buffer,\n upload.offset,\n this._object!,\n upload.offset,\n upload.size\n );\n }\n if (!encoder) {\n this._device.device.queue.submit([cmdEncoder.finish()]);\n }\n this._pendingUploads.length = 0;\n this._pendingUploadBuffer = null;\n this._ringBuffer.beginUploads();\n }\n }\n endSyncChanges() {\n if (this._usage & GPUResourceUsageFlags.DYNAMIC) {\n this._ringBuffer.endUploads();\n } else {\n this._ringBuffer.purge();\n }\n }\n private load(data?: Nullable<TypedArray>) {\n if (this._device.isContextLost()) {\n return;\n }\n this._memCost = 0;\n if (!this._device.isContextLost()) {\n if (!this._object) {\n this._gpuUsage = 0;\n let label = '';\n if (this._usage & GPUResourceUsageFlags.BF_VERTEX) {\n this._gpuUsage |= GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n label += '[vertex]';\n }\n if (this._usage & GPUResourceUsageFlags.BF_INDEX) {\n this._gpuUsage |= GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n label += '[index]';\n }\n if (this._usage & GPUResourceUsageFlags.BF_UNIFORM) {\n this._gpuUsage |= GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n label += '[uniform]';\n }\n if (this._usage & GPUResourceUsageFlags.BF_STORAGE) {\n this._gpuUsage |= GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n label += '[storage]';\n }\n if (this._usage & (GPUResourceUsageFlags.BF_READ | GPUResourceUsageFlags.BF_PACK_PIXEL)) {\n this._gpuUsage |= GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;\n label += '[mapRead]';\n }\n if (this._usage & (GPUResourceUsageFlags.BF_WRITE | GPUResourceUsageFlags.BF_UNPACK_PIXEL)) {\n this._gpuUsage |= GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;\n label += '[mapWrite]';\n }\n if (data) {\n this._object = this._device.gpuCreateBuffer({\n label: label,\n size: (data.byteLength + 15) & ~15,\n usage: this._gpuUsage,\n mappedAtCreation: true\n });\n const range = this._object.getMappedRange();\n new (data.constructor as TypedArrayConstructor)(range).set(data);\n this._object.unmap();\n } else {\n this._object = this._device.gpuCreateBuffer({\n label: label,\n size: (this.byteLength + 15) & ~15,\n usage: this._gpuUsage\n });\n }\n const memCost = this.byteLength;\n this._device.updateVideoMemoryCost(memCost - this._memCost);\n this._memCost = memCost;\n }\n }\n }\n private sync() {\n if (this._pendingUploads.length > 0) {\n this._device.flush();\n }\n }\n}\n"],"names":["WebGPUBuffer","WebGPUObject","_size","_usage","_gpuUsage","_memCost","_ringBuffer","_pendingUploads","_pendingUploadBuffer","device","usage","data","_object","byteLength","Error","UploadRingBuffer","load","hash","_device","gpuGetObjectHash","gpuUsage","mergePendingUpload","offset","size","start","end","insertIndex","length","i","pending","pendingEnd","Math","min","max","splice","bufferSubData","dstByteOffset","srcOffset","srcLength","Number","BYTES_PER_ELEMENT","uploadSize","uploadOffset","byteOffset","bufferUpload","fetchBufferMapped","Uint8Array","mappedRange","set","buffer","getBufferSubData","dstBuffer","offsetInBytes","sizeInBytes","sourceBuffer","readOffsetInBytes","GPUResourceUsageFlags","BF_READ","BF_PACK_PIXEL","GPUBufferUsage","COPY_SRC","copyOffsetInBytes","copySizeInBytes","createBuffer","copyBuffer","flush","sync","object","mapAsync","GPUMapMode","READ","range","getMappedRange","unmap","dispose","restore","isContextLost","destroy","isBuffer","beginSyncChanges","encoder","beginUploads","cmdEncoder","createCommandEncoder","upload","copyBufferToBuffer","queue","submit","finish","endSyncChanges","DYNAMIC","endUploads","purge","label","BF_VERTEX","VERTEX","COPY_DST","BF_INDEX","INDEX","BF_UNIFORM","UNIFORM","BF_STORAGE","STORAGE","MAP_READ","BF_WRITE","BF_UNPACK_PIXEL","MAP_WRITE","gpuCreateBuffer","mappedAtCreation","memCost","updateVideoMemoryCost"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buffer_webgpu.js","sources":["../src/buffer_webgpu.ts"],"sourcesContent":["import type { GPUDataBuffer } from '@zephyr3d/device';\r\nimport { GPUResourceUsageFlags } from '@zephyr3d/device';\r\nimport { WebGPUObject } from './gpuobject_webgpu';\r\nimport { UploadRingBuffer } from './uploadringbuffer';\r\nimport type { Nullable, TypedArray, TypedArrayConstructor } from '@zephyr3d/base';\r\nimport type { WebGPUDevice } from './device';\r\nimport type { MappedBuffer } from './uploadringbuffer';\r\n\r\ntype PendingUploadRange = {\r\n offset: number;\r\n size: number;\r\n};\r\n\r\nexport class WebGPUBuffer extends WebGPUObject<GPUBuffer> implements GPUDataBuffer<GPUBuffer> {\r\n private readonly _size: number;\r\n private readonly _usage: number;\r\n private _gpuUsage: number;\r\n private _memCost: number;\r\n private readonly _ringBuffer: UploadRingBuffer;\r\n protected _pendingUploads: PendingUploadRange[];\r\n private _pendingUploadBuffer: Nullable<MappedBuffer>;\r\n constructor(device: WebGPUDevice, usage: number, data: TypedArray | number) {\r\n super(device);\r\n this._object = null;\r\n this._memCost = 0;\r\n this._usage = usage;\r\n this._gpuUsage = 0;\r\n this._size = typeof data === 'number' ? data : data.byteLength;\r\n if (this._size <= 0) {\r\n throw new Error('can not create buffer with zero size');\r\n }\r\n this._ringBuffer = new UploadRingBuffer(device, (this._size + 15) & ~15);\r\n this._pendingUploads = [];\r\n this._pendingUploadBuffer = null;\r\n this.load(typeof data === 'number' ? null : data);\r\n }\r\n get hash() {\r\n return this._object ? this._device.gpuGetObjectHash(this._object) : 0;\r\n }\r\n get byteLength() {\r\n return this._size;\r\n }\r\n get usage() {\r\n return this._usage;\r\n }\r\n get gpuUsage() {\r\n return this._gpuUsage;\r\n }\r\n private mergePendingUpload(offset: number, size: number) {\r\n let start = offset;\r\n let end = offset + size;\r\n let insertIndex = this._pendingUploads.length;\r\n for (let i = 0; i < this._pendingUploads.length; i++) {\r\n const pending = this._pendingUploads[i];\r\n const pendingEnd = pending.offset + pending.size;\r\n if (pending.offset > end) {\r\n insertIndex = i;\r\n break;\r\n }\r\n if (pendingEnd >= start && pending.offset <= end) {\r\n start = Math.min(start, pending.offset);\r\n end = Math.max(end, pendingEnd);\r\n this._pendingUploads.splice(i, 1);\r\n i--;\r\n insertIndex = i + 1;\r\n }\r\n }\r\n this._pendingUploads.splice(insertIndex, 0, {\r\n offset: start,\r\n size: end - start\r\n });\r\n }\r\n bufferSubData(dstByteOffset: number, data: TypedArray, srcOffset?: number, srcLength?: number) {\r\n srcOffset = Number(srcOffset) || 0;\r\n dstByteOffset = Number(dstByteOffset) || 0;\r\n srcLength = Number(srcLength) || data.length - srcOffset;\r\n if (srcOffset + srcLength > data.length) {\r\n throw new Error('bufferSubData() failed: source buffer is too small');\r\n }\r\n if (dstByteOffset + srcLength * data.BYTES_PER_ELEMENT > this.byteLength) {\r\n throw new Error('bufferSubData() failed: dest buffer is too small');\r\n }\r\n const uploadSize = srcLength * data.BYTES_PER_ELEMENT;\r\n if ((dstByteOffset & 3) !== 0 || (uploadSize & 3) !== 0) {\r\n throw new Error(\r\n 'bufferSubData() failed: destination byte offset or upload size must be 4 bytes aligned'\r\n );\r\n }\r\n const uploadOffset = data.byteOffset + srcOffset * data.BYTES_PER_ELEMENT;\r\n // Resolve segment ownership before mutating the shared staging page. If this\r\n // upload has to start a new segment, the previous segment must snapshot its\r\n // pending uploads against the old staging contents first.\r\n this._device.bufferUpload(this, dstByteOffset, uploadSize);\r\n this._pendingUploadBuffer ??= this._ringBuffer.fetchBufferMapped((this.byteLength + 15) & ~15);\r\n new Uint8Array(this._pendingUploadBuffer.mappedRange!, dstByteOffset, uploadSize).set(\r\n new Uint8Array(data.buffer, uploadOffset, uploadSize)\r\n );\r\n this.mergePendingUpload(dstByteOffset, uploadSize);\r\n }\r\n async getBufferSubData(\r\n dstBuffer?: Nullable<Uint8Array<ArrayBuffer>>,\r\n offsetInBytes?: number,\r\n sizeInBytes?: number\r\n ) {\r\n let sourceBuffer: GPUDataBuffer = this;\r\n offsetInBytes = Number(offsetInBytes) || 0;\r\n sizeInBytes = Number(sizeInBytes) || this.byteLength - offsetInBytes;\r\n if (offsetInBytes < 0 || offsetInBytes + sizeInBytes > this.byteLength) {\r\n throw new Error('data query range out of bounds');\r\n }\r\n if (dstBuffer && dstBuffer.byteLength < sizeInBytes) {\r\n throw new Error('no enough space for querying buffer data');\r\n }\r\n let readOffsetInBytes = offsetInBytes;\r\n if (!(this._usage & (GPUResourceUsageFlags.BF_READ | GPUResourceUsageFlags.BF_PACK_PIXEL))) {\r\n if (this._gpuUsage & GPUBufferUsage.COPY_SRC) {\r\n const copyOffsetInBytes = offsetInBytes & ~3;\r\n readOffsetInBytes = offsetInBytes - copyOffsetInBytes;\r\n const copySizeInBytes = (readOffsetInBytes + sizeInBytes + 3) & ~3;\r\n sourceBuffer = this._device.createBuffer(copySizeInBytes, { usage: 'read' });\r\n this._device.copyBuffer(this, sourceBuffer, copyOffsetInBytes, 0, copySizeInBytes);\r\n this._device.flush();\r\n } else {\r\n throw new Error('getBufferSubData() failed: buffer does not have BF_READ or BF_PACK_PIXEL flag set');\r\n }\r\n } else {\r\n this.sync();\r\n }\r\n const buffer = sourceBuffer.object as GPUBuffer;\r\n await buffer.mapAsync(GPUMapMode.READ);\r\n const range = buffer.getMappedRange();\r\n dstBuffer = dstBuffer || new Uint8Array(sizeInBytes);\r\n dstBuffer.set(new Uint8Array(range, readOffsetInBytes, sizeInBytes));\r\n buffer.unmap();\r\n\r\n if (sourceBuffer !== this) {\r\n sourceBuffer.dispose();\r\n }\r\n\r\n return dstBuffer;\r\n }\r\n restore() {\r\n if (!this._device.isContextLost()) {\r\n this.load();\r\n }\r\n }\r\n destroy() {\r\n if (this._object) {\r\n this._object.destroy();\r\n this._object = null;\r\n this._gpuUsage = 0;\r\n this._memCost = 0;\r\n this._pendingUploadBuffer = null;\r\n this._pendingUploads.length = 0;\r\n }\r\n }\r\n isBuffer(): this is GPUDataBuffer {\r\n return true;\r\n }\r\n beginSyncChanges(encoder: GPUCommandEncoder) {\r\n if (this._pendingUploads.length > 0) {\r\n if (!this._object || !this._pendingUploadBuffer) {\r\n this._pendingUploads.length = 0;\r\n this._pendingUploadBuffer = null;\r\n this._ringBuffer.beginUploads();\r\n return;\r\n }\r\n const cmdEncoder = encoder || this._device.device.createCommandEncoder();\r\n for (const upload of this._pendingUploads) {\r\n cmdEncoder.copyBufferToBuffer(\r\n this._pendingUploadBuffer.buffer,\r\n upload.offset,\r\n this._object!,\r\n upload.offset,\r\n upload.size\r\n );\r\n }\r\n if (!encoder) {\r\n this._device.device.queue.submit([cmdEncoder.finish()]);\r\n }\r\n this._pendingUploads.length = 0;\r\n this._pendingUploadBuffer = null;\r\n this._ringBuffer.beginUploads();\r\n }\r\n }\r\n endSyncChanges() {\r\n if (this._usage & GPUResourceUsageFlags.DYNAMIC) {\r\n this._ringBuffer.endUploads();\r\n } else {\r\n this._ringBuffer.purge();\r\n }\r\n }\r\n private load(data?: Nullable<TypedArray>) {\r\n if (this._device.isContextLost()) {\r\n return;\r\n }\r\n this._memCost = 0;\r\n if (!this._device.isContextLost()) {\r\n if (!this._object) {\r\n this._gpuUsage = 0;\r\n let label = '';\r\n if (this._usage & GPUResourceUsageFlags.BF_VERTEX) {\r\n this._gpuUsage |= GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\r\n label += '[vertex]';\r\n }\r\n if (this._usage & GPUResourceUsageFlags.BF_INDEX) {\r\n this._gpuUsage |= GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\r\n label += '[index]';\r\n }\r\n if (this._usage & GPUResourceUsageFlags.BF_UNIFORM) {\r\n this._gpuUsage |= GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\r\n label += '[uniform]';\r\n }\r\n if (this._usage & GPUResourceUsageFlags.BF_STORAGE) {\r\n this._gpuUsage |= GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\r\n label += '[storage]';\r\n }\r\n if (this._usage & (GPUResourceUsageFlags.BF_READ | GPUResourceUsageFlags.BF_PACK_PIXEL)) {\r\n this._gpuUsage |= GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;\r\n label += '[mapRead]';\r\n }\r\n if (this._usage & (GPUResourceUsageFlags.BF_WRITE | GPUResourceUsageFlags.BF_UNPACK_PIXEL)) {\r\n this._gpuUsage |= GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;\r\n label += '[mapWrite]';\r\n }\r\n if (data) {\r\n this._object = this._device.gpuCreateBuffer({\r\n label: label,\r\n size: (data.byteLength + 15) & ~15,\r\n usage: this._gpuUsage,\r\n mappedAtCreation: true\r\n });\r\n const range = this._object.getMappedRange();\r\n new (data.constructor as TypedArrayConstructor)(range).set(data);\r\n this._object.unmap();\r\n } else {\r\n this._object = this._device.gpuCreateBuffer({\r\n label: label,\r\n size: (this.byteLength + 15) & ~15,\r\n usage: this._gpuUsage\r\n });\r\n }\r\n const memCost = this.byteLength;\r\n this._device.updateVideoMemoryCost(memCost - this._memCost);\r\n this._memCost = memCost;\r\n }\r\n }\r\n }\r\n private sync() {\r\n if (this._pendingUploads.length > 0) {\r\n this._device.flush();\r\n }\r\n }\r\n}\r\n"],"names":["WebGPUBuffer","WebGPUObject","_size","_usage","_gpuUsage","_memCost","_ringBuffer","_pendingUploads","_pendingUploadBuffer","device","usage","data","_object","byteLength","Error","UploadRingBuffer","load","hash","_device","gpuGetObjectHash","gpuUsage","mergePendingUpload","offset","size","start","end","insertIndex","length","i","pending","pendingEnd","Math","min","max","splice","bufferSubData","dstByteOffset","srcOffset","srcLength","Number","BYTES_PER_ELEMENT","uploadSize","uploadOffset","byteOffset","bufferUpload","fetchBufferMapped","Uint8Array","mappedRange","set","buffer","getBufferSubData","dstBuffer","offsetInBytes","sizeInBytes","sourceBuffer","readOffsetInBytes","GPUResourceUsageFlags","BF_READ","BF_PACK_PIXEL","GPUBufferUsage","COPY_SRC","copyOffsetInBytes","copySizeInBytes","createBuffer","copyBuffer","flush","sync","object","mapAsync","GPUMapMode","READ","range","getMappedRange","unmap","dispose","restore","isContextLost","destroy","isBuffer","beginSyncChanges","encoder","beginUploads","cmdEncoder","createCommandEncoder","upload","copyBufferToBuffer","queue","submit","finish","endSyncChanges","DYNAMIC","endUploads","purge","label","BF_VERTEX","VERTEX","COPY_DST","BF_INDEX","INDEX","BF_UNIFORM","UNIFORM","BF_STORAGE","STORAGE","MAP_READ","BF_WRITE","BF_UNPACK_PIXEL","MAP_WRITE","gpuCreateBuffer","mappedAtCreation","memCost","updateVideoMemoryCost"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandqueue.js","sources":["../src/commandqueue.ts"],"sourcesContent":["import type { Immutable, Nullable, Vector4 } from '@zephyr3d/base';\nimport { WebGPURenderPass } from './renderpass_webgpu';\nimport { WebGPUComputePass } from './computepass_webgpu';\nimport type { PrimitiveType, DeviceViewport } from '@zephyr3d/device';\nimport type { WebGPUDevice } from './device';\nimport type { WebGPUProgram } from './gpuprogram_webgpu';\nimport type { WebGPUVertexLayout } from './vertexlayout_webgpu';\nimport type { WebGPURenderStateSet } from './renderstates_webgpu';\nimport type { WebGPUBindGroup } from './bindgroup_webgpu';\nimport type { WebGPUFrameBuffer } from './framebuffer_webgpu';\nimport type { WebGPUBuffer } from './buffer_webgpu';\nimport type { WebGPUBaseTexture } from './basetexture_webgpu';\nimport { WebGPUMipmapGenerator } from './utils_webgpu';\n\ntype LogicalSegment = {\n uploadEncoder: Nullable<GPUCommandEncoder>;\n bodyEncoder: Nullable<GPUCommandEncoder>;\n hasUploadCommands: boolean;\n hasBodyCommands: boolean;\n buffersWithPendingUploads: WebGPUBuffer[];\n texturesWithPendingUploads: WebGPUBaseTexture[];\n};\n\nexport class CommandQueueImmediate {\n protected _renderPass: WebGPURenderPass;\n protected _computePass: WebGPUComputePass;\n private _segments: LogicalSegment[];\n private _buffersAwaitingSyncEnd: WebGPUBuffer[];\n private _texturesAwaitingSyncEnd: WebGPUBaseTexture[];\n private readonly _device: WebGPUDevice;\n private _drawcallCounter: number;\n constructor(device: WebGPUDevice) {\n this._device = device;\n this._segments = [];\n this._buffersAwaitingSyncEnd = [];\n this._texturesAwaitingSyncEnd = [];\n this._renderPass = new WebGPURenderPass(device);\n this._computePass = new WebGPUComputePass(device);\n this._drawcallCounter = 0;\n }\n isBufferUploading(_buffer: WebGPUBuffer) {\n return false;\n }\n isTextureUploading(_tex: WebGPUBaseTexture) {\n return false;\n }\n hasActiveWork() {\n return (\n this._segments.length > 0 ||\n this._renderPass.active ||\n this._computePass.active ||\n this._drawcallCounter > 0\n );\n }\n getDrawcallCounter() {\n return this._drawcallCounter;\n }\n getEncoder() {\n const segment = this.getOrCreateCurrentSegment();\n segment.hasBodyCommands = true;\n if (!segment.bodyEncoder) {\n segment.bodyEncoder = this._device.device.createCommandEncoder();\n }\n return segment.bodyEncoder;\n }\n flushUploads() {\n this.finalizeCurrentSegmentUploads();\n }\n get currentPass(): Nullable<WebGPURenderPass | WebGPUComputePass> {\n return this._renderPass.active ? this._renderPass : this._computePass.active ? this._computePass : null;\n }\n beginFrame() {}\n endFrame() {\n this.submit();\n }\n flush() {\n this.submit();\n }\n setFramebuffer(fb: WebGPUFrameBuffer) {\n this._renderPass.setFramebuffer(fb);\n }\n getFramebuffer() {\n return this._renderPass.getFramebuffer();\n }\n getFramebufferInfo() {\n return this._renderPass.getFrameBufferInfo();\n }\n executeRenderBundle(renderBundle: GPURenderBundle) {\n this.ensureRenderBodyReady();\n this._drawcallCounter++;\n this._renderPass.executeRenderBundle(renderBundle);\n const segment = this.getOrCreateCurrentSegment();\n segment.hasBodyCommands = true;\n }\n bufferUpload(buffer: WebGPUBuffer, _offset: number, _size: number) {\n const segment = this.getSegmentForUpload();\n if (segment.buffersWithPendingUploads.indexOf(buffer) < 0) {\n segment.buffersWithPendingUploads.push(buffer);\n }\n }\n textureUpload(tex: WebGPUBaseTexture) {\n const segment = this.getSegmentForUpload();\n if (segment.texturesWithPendingUploads.indexOf(tex) < 0) {\n segment.texturesWithPendingUploads.push(tex);\n }\n }\n copyBuffer(\n srcBuffer: WebGPUBuffer,\n dstBuffer: WebGPUBuffer,\n srcOffset: number,\n dstOffset: number,\n bytes: number\n ) {\n this.endAllBodyPasses();\n const segment = this.getOrCreateCurrentSegment();\n segment.hasBodyCommands = true;\n const encoder = this.getEncoder();\n encoder.copyBufferToBuffer(srcBuffer.object!, srcOffset, dstBuffer.object!, dstOffset, bytes);\n }\n copyTexture(\n srcTexture: GPUTexture,\n dstTexture: GPUTexture,\n srcLevel: number,\n dstLevel: number,\n width: number,\n height: number,\n depthOrArrayLayers: number\n ) {\n this.endAllBodyPasses();\n const segment = this.getOrCreateCurrentSegment();\n segment.hasBodyCommands = true;\n const encoder = this.getEncoder();\n encoder.copyTextureToTexture(\n {\n texture: srcTexture,\n mipLevel: srcLevel,\n origin: { x: 0, y: 0, z: 0 }\n },\n {\n texture: dstTexture,\n mipLevel: dstLevel,\n origin: { x: 0, y: 0, z: 0 }\n },\n {\n width,\n height,\n depthOrArrayLayers\n }\n );\n }\n compute(\n program: WebGPUProgram,\n bindGroups: WebGPUBindGroup[],\n bindGroupOffsets: Nullable<Iterable<number>>[],\n workgroupCountX: number,\n workgroupCountY: number,\n workgroupCountZ: number\n ) {\n this._drawcallCounter++;\n this.ensureComputeBodyReady();\n this._computePass.compute(\n program,\n bindGroups,\n bindGroupOffsets,\n workgroupCountX,\n workgroupCountY,\n workgroupCountZ\n );\n const segment = this.getOrCreateCurrentSegment();\n segment.hasBodyCommands = true;\n }\n draw(\n program: WebGPUProgram,\n vertexData: Nullable<WebGPUVertexLayout>,\n stateSet: WebGPURenderStateSet,\n bindGroups: WebGPUBindGroup[],\n bindGroupOffsets: Nullable<Nullable<Iterable<number>>[]>,\n primitiveType: PrimitiveType,\n first: number,\n count: number,\n numInstances: number\n ) {\n this.ensureRenderBodyReady();\n this._drawcallCounter++;\n this._renderPass.draw(\n program,\n vertexData,\n stateSet,\n bindGroups,\n bindGroupOffsets,\n primitiveType,\n first,\n count,\n numInstances\n );\n const segment = this.getOrCreateCurrentSegment();\n segment.hasBodyCommands = true;\n }\n capture(\n renderBundleEncoder: GPURenderBundleEncoder,\n program: WebGPUProgram,\n vertexData: WebGPUVertexLayout,\n stateSet: WebGPURenderStateSet,\n bindGroups: WebGPUBindGroup[],\n bindGroupOffsets: Nullable<Iterable<number>>[],\n primitiveType: PrimitiveType,\n first: number,\n count: number,\n numInstances: number\n ) {\n this.ensureRenderBodyReady();\n this._renderPass.capture(\n renderBundleEncoder,\n program,\n vertexData,\n stateSet,\n bindGroups,\n bindGroupOffsets,\n primitiveType,\n first,\n count,\n numInstances\n );\n }\n setViewport(vp: Nullable<Immutable<number[] | DeviceViewport>>) {\n this._renderPass.setViewport(vp);\n }\n getViewport() {\n return this._renderPass.getViewport();\n }\n setScissor(scissor: Nullable<Immutable<number[] | DeviceViewport>>) {\n this._renderPass.setScissor(scissor);\n }\n getScissor() {\n return this._renderPass.getScissor();\n }\n clear(color: Nullable<Vector4>, depth: Nullable<number>, stencil: Nullable<number>) {\n this.ensureRenderBodyReady();\n this._renderPass.clear(color, depth, stencil);\n const segment = this.getOrCreateCurrentSegment();\n segment.hasBodyCommands = true;\n }\n finish() {\n this.submit();\n return this._device.device.queue.onSubmittedWorkDone();\n }\n private createSegment(): LogicalSegment {\n const segment: LogicalSegment = {\n uploadEncoder: null,\n bodyEncoder: null,\n hasUploadCommands: false,\n hasBodyCommands: false,\n buffersWithPendingUploads: [],\n texturesWithPendingUploads: []\n };\n this._segments.push(segment);\n return segment;\n }\n private getCurrentSegment() {\n return this._segments.length > 0 ? this._segments[this._segments.length - 1] : null;\n }\n private getOrCreateCurrentSegment() {\n return this.getCurrentSegment() ?? this.createSegment();\n }\n private getOrCreateUploadEncoder(segment: LogicalSegment) {\n if (!segment.uploadEncoder) {\n segment.uploadEncoder = this._device.device.createCommandEncoder();\n }\n return segment.uploadEncoder;\n }\n private ensureRenderBodyReady() {\n if (this._computePass.active) {\n this._computePass.end();\n }\n }\n private ensureComputeBodyReady() {\n if (this._renderPass.active) {\n this._renderPass.end();\n }\n }\n private endAllBodyPasses() {\n if (this._renderPass.active) {\n this._renderPass.end();\n }\n if (this._computePass.active) {\n this._computePass.end();\n }\n }\n private submit() {\n this.endAllBodyPasses();\n this.finalizeCurrentSegmentUploads();\n if (this._segments.length > 0) {\n const commandBuffers: GPUCommandBuffer[] = [];\n for (const segment of this._segments) {\n if (segment.uploadEncoder && segment.hasUploadCommands) {\n commandBuffers.push(segment.uploadEncoder.finish());\n }\n if (segment.bodyEncoder && segment.hasBodyCommands) {\n commandBuffers.push(segment.bodyEncoder.finish());\n }\n }\n if (commandBuffers.length > 0) {\n this._device.device.queue.submit(commandBuffers);\n }\n }\n for (const buffer of this._buffersAwaitingSyncEnd) {\n buffer.endSyncChanges();\n }\n this._buffersAwaitingSyncEnd.length = 0;\n for (const texture of this._texturesAwaitingSyncEnd) {\n texture.endSyncChanges();\n }\n this._texturesAwaitingSyncEnd.length = 0;\n this._segments.length = 0;\n this._drawcallCounter = 0;\n }\n private markBufferAwaitingSyncEnd(buffer: WebGPUBuffer) {\n if (this._buffersAwaitingSyncEnd.indexOf(buffer) < 0) {\n this._buffersAwaitingSyncEnd.push(buffer);\n }\n }\n private markTextureAwaitingSyncEnd(texture: WebGPUBaseTexture) {\n if (this._texturesAwaitingSyncEnd.indexOf(texture) < 0) {\n this._texturesAwaitingSyncEnd.push(texture);\n }\n }\n private getSegmentForUpload() {\n let segment = this.getOrCreateCurrentSegment();\n if (segment.hasBodyCommands) {\n this.endAllBodyPasses();\n this.finalizeCurrentSegmentUploads();\n segment = this.createSegment();\n }\n return segment;\n }\n private finalizeCurrentSegmentUploads() {\n const segment = this.getCurrentSegment();\n if (!segment) {\n return;\n }\n if (segment.buffersWithPendingUploads.length > 0) {\n const encoder = this.getOrCreateUploadEncoder(segment);\n for (const buffer of segment.buffersWithPendingUploads) {\n buffer.beginSyncChanges(encoder);\n segment.hasUploadCommands = true;\n this.markBufferAwaitingSyncEnd(buffer);\n }\n segment.buffersWithPendingUploads.length = 0;\n }\n if (segment.texturesWithPendingUploads.length > 0) {\n const encoder = this.getOrCreateUploadEncoder(segment);\n for (const texture of segment.texturesWithPendingUploads) {\n texture.beginSyncChanges(encoder);\n if (!texture.disposed && texture.isMipmapDirty()) {\n WebGPUMipmapGenerator.generateMipmap(this._device, texture, encoder);\n }\n segment.hasUploadCommands = true;\n this.markTextureAwaitingSyncEnd(texture);\n }\n segment.texturesWithPendingUploads.length = 0;\n }\n }\n}\n"],"names":["CommandQueueImmediate","_renderPass","_computePass","_segments","_buffersAwaitingSyncEnd","_texturesAwaitingSyncEnd","_device","_drawcallCounter","device","WebGPURenderPass","WebGPUComputePass","isBufferUploading","_buffer","isTextureUploading","_tex","hasActiveWork","length","active","getDrawcallCounter","getEncoder","segment","getOrCreateCurrentSegment","hasBodyCommands","bodyEncoder","createCommandEncoder","flushUploads","finalizeCurrentSegmentUploads","currentPass","beginFrame","endFrame","submit","flush","setFramebuffer","fb","getFramebuffer","getFramebufferInfo","getFrameBufferInfo","executeRenderBundle","renderBundle","ensureRenderBodyReady","bufferUpload","buffer","_offset","_size","getSegmentForUpload","buffersWithPendingUploads","indexOf","push","textureUpload","tex","texturesWithPendingUploads","copyBuffer","srcBuffer","dstBuffer","srcOffset","dstOffset","bytes","endAllBodyPasses","encoder","copyBufferToBuffer","object","copyTexture","srcTexture","dstTexture","srcLevel","dstLevel","width","height","depthOrArrayLayers","copyTextureToTexture","texture","mipLevel","origin","x","y","z","compute","program","bindGroups","bindGroupOffsets","workgroupCountX","workgroupCountY","workgroupCountZ","ensureComputeBodyReady","draw","vertexData","stateSet","primitiveType","first","count","numInstances","capture","renderBundleEncoder","setViewport","vp","getViewport","setScissor","scissor","getScissor","clear","color","depth","stencil","finish","queue","onSubmittedWorkDone","createSegment","uploadEncoder","hasUploadCommands","getCurrentSegment","getOrCreateUploadEncoder","end","commandBuffers","endSyncChanges","markBufferAwaitingSyncEnd","markTextureAwaitingSyncEnd","beginSyncChanges","disposed","isMipmapDirty","WebGPUMipmapGenerator","generateMipmap"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commandqueue.js","sources":["../src/commandqueue.ts"],"sourcesContent":["import type { Immutable, Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { WebGPURenderPass } from './renderpass_webgpu';\r\nimport { WebGPUComputePass } from './computepass_webgpu';\r\nimport type { PrimitiveType, DeviceViewport } from '@zephyr3d/device';\r\nimport type { WebGPUDevice } from './device';\r\nimport type { WebGPUProgram } from './gpuprogram_webgpu';\r\nimport type { WebGPUVertexLayout } from './vertexlayout_webgpu';\r\nimport type { WebGPURenderStateSet } from './renderstates_webgpu';\r\nimport type { WebGPUBindGroup } from './bindgroup_webgpu';\r\nimport type { WebGPUFrameBuffer } from './framebuffer_webgpu';\r\nimport type { WebGPUBuffer } from './buffer_webgpu';\r\nimport type { WebGPUBaseTexture } from './basetexture_webgpu';\r\nimport { WebGPUMipmapGenerator } from './utils_webgpu';\r\n\r\ntype LogicalSegment = {\r\n uploadEncoder: Nullable<GPUCommandEncoder>;\r\n bodyEncoder: Nullable<GPUCommandEncoder>;\r\n hasUploadCommands: boolean;\r\n hasBodyCommands: boolean;\r\n buffersWithPendingUploads: WebGPUBuffer[];\r\n texturesWithPendingUploads: WebGPUBaseTexture[];\r\n};\r\n\r\nexport class CommandQueueImmediate {\r\n protected _renderPass: WebGPURenderPass;\r\n protected _computePass: WebGPUComputePass;\r\n private _segments: LogicalSegment[];\r\n private _buffersAwaitingSyncEnd: WebGPUBuffer[];\r\n private _texturesAwaitingSyncEnd: WebGPUBaseTexture[];\r\n private readonly _device: WebGPUDevice;\r\n private _drawcallCounter: number;\r\n constructor(device: WebGPUDevice) {\r\n this._device = device;\r\n this._segments = [];\r\n this._buffersAwaitingSyncEnd = [];\r\n this._texturesAwaitingSyncEnd = [];\r\n this._renderPass = new WebGPURenderPass(device);\r\n this._computePass = new WebGPUComputePass(device);\r\n this._drawcallCounter = 0;\r\n }\r\n isBufferUploading(_buffer: WebGPUBuffer) {\r\n return false;\r\n }\r\n isTextureUploading(_tex: WebGPUBaseTexture) {\r\n return false;\r\n }\r\n hasActiveWork() {\r\n return (\r\n this._segments.length > 0 ||\r\n this._renderPass.active ||\r\n this._computePass.active ||\r\n this._drawcallCounter > 0\r\n );\r\n }\r\n getDrawcallCounter() {\r\n return this._drawcallCounter;\r\n }\r\n getEncoder() {\r\n const segment = this.getOrCreateCurrentSegment();\r\n segment.hasBodyCommands = true;\r\n if (!segment.bodyEncoder) {\r\n segment.bodyEncoder = this._device.device.createCommandEncoder();\r\n }\r\n return segment.bodyEncoder;\r\n }\r\n flushUploads() {\r\n this.finalizeCurrentSegmentUploads();\r\n }\r\n get currentPass(): Nullable<WebGPURenderPass | WebGPUComputePass> {\r\n return this._renderPass.active ? this._renderPass : this._computePass.active ? this._computePass : null;\r\n }\r\n beginFrame() {}\r\n endFrame() {\r\n this.submit();\r\n }\r\n flush() {\r\n this.submit();\r\n }\r\n setFramebuffer(fb: WebGPUFrameBuffer) {\r\n this._renderPass.setFramebuffer(fb);\r\n }\r\n getFramebuffer() {\r\n return this._renderPass.getFramebuffer();\r\n }\r\n getFramebufferInfo() {\r\n return this._renderPass.getFrameBufferInfo();\r\n }\r\n executeRenderBundle(renderBundle: GPURenderBundle) {\r\n this.ensureRenderBodyReady();\r\n this._drawcallCounter++;\r\n this._renderPass.executeRenderBundle(renderBundle);\r\n const segment = this.getOrCreateCurrentSegment();\r\n segment.hasBodyCommands = true;\r\n }\r\n bufferUpload(buffer: WebGPUBuffer, _offset: number, _size: number) {\r\n const segment = this.getSegmentForUpload();\r\n if (segment.buffersWithPendingUploads.indexOf(buffer) < 0) {\r\n segment.buffersWithPendingUploads.push(buffer);\r\n }\r\n }\r\n textureUpload(tex: WebGPUBaseTexture) {\r\n const segment = this.getSegmentForUpload();\r\n if (segment.texturesWithPendingUploads.indexOf(tex) < 0) {\r\n segment.texturesWithPendingUploads.push(tex);\r\n }\r\n }\r\n copyBuffer(\r\n srcBuffer: WebGPUBuffer,\r\n dstBuffer: WebGPUBuffer,\r\n srcOffset: number,\r\n dstOffset: number,\r\n bytes: number\r\n ) {\r\n this.endAllBodyPasses();\r\n const segment = this.getOrCreateCurrentSegment();\r\n segment.hasBodyCommands = true;\r\n const encoder = this.getEncoder();\r\n encoder.copyBufferToBuffer(srcBuffer.object!, srcOffset, dstBuffer.object!, dstOffset, bytes);\r\n }\r\n copyTexture(\r\n srcTexture: GPUTexture,\r\n dstTexture: GPUTexture,\r\n srcLevel: number,\r\n dstLevel: number,\r\n width: number,\r\n height: number,\r\n depthOrArrayLayers: number\r\n ) {\r\n this.endAllBodyPasses();\r\n const segment = this.getOrCreateCurrentSegment();\r\n segment.hasBodyCommands = true;\r\n const encoder = this.getEncoder();\r\n encoder.copyTextureToTexture(\r\n {\r\n texture: srcTexture,\r\n mipLevel: srcLevel,\r\n origin: { x: 0, y: 0, z: 0 }\r\n },\r\n {\r\n texture: dstTexture,\r\n mipLevel: dstLevel,\r\n origin: { x: 0, y: 0, z: 0 }\r\n },\r\n {\r\n width,\r\n height,\r\n depthOrArrayLayers\r\n }\r\n );\r\n }\r\n compute(\r\n program: WebGPUProgram,\r\n bindGroups: WebGPUBindGroup[],\r\n bindGroupOffsets: Nullable<Iterable<number>>[],\r\n workgroupCountX: number,\r\n workgroupCountY: number,\r\n workgroupCountZ: number\r\n ) {\r\n this._drawcallCounter++;\r\n this.ensureComputeBodyReady();\r\n this._computePass.compute(\r\n program,\r\n bindGroups,\r\n bindGroupOffsets,\r\n workgroupCountX,\r\n workgroupCountY,\r\n workgroupCountZ\r\n );\r\n const segment = this.getOrCreateCurrentSegment();\r\n segment.hasBodyCommands = true;\r\n }\r\n draw(\r\n program: WebGPUProgram,\r\n vertexData: Nullable<WebGPUVertexLayout>,\r\n stateSet: WebGPURenderStateSet,\r\n bindGroups: WebGPUBindGroup[],\r\n bindGroupOffsets: Nullable<Nullable<Iterable<number>>[]>,\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ) {\r\n this.ensureRenderBodyReady();\r\n this._drawcallCounter++;\r\n this._renderPass.draw(\r\n program,\r\n vertexData,\r\n stateSet,\r\n bindGroups,\r\n bindGroupOffsets,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances\r\n );\r\n const segment = this.getOrCreateCurrentSegment();\r\n segment.hasBodyCommands = true;\r\n }\r\n capture(\r\n renderBundleEncoder: GPURenderBundleEncoder,\r\n program: WebGPUProgram,\r\n vertexData: WebGPUVertexLayout,\r\n stateSet: WebGPURenderStateSet,\r\n bindGroups: WebGPUBindGroup[],\r\n bindGroupOffsets: Nullable<Iterable<number>>[],\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ) {\r\n this.ensureRenderBodyReady();\r\n this._renderPass.capture(\r\n renderBundleEncoder,\r\n program,\r\n vertexData,\r\n stateSet,\r\n bindGroups,\r\n bindGroupOffsets,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances\r\n );\r\n }\r\n setViewport(vp: Nullable<Immutable<number[] | DeviceViewport>>) {\r\n this._renderPass.setViewport(vp);\r\n }\r\n getViewport() {\r\n return this._renderPass.getViewport();\r\n }\r\n setScissor(scissor: Nullable<Immutable<number[] | DeviceViewport>>) {\r\n this._renderPass.setScissor(scissor);\r\n }\r\n getScissor() {\r\n return this._renderPass.getScissor();\r\n }\r\n clear(color: Nullable<Vector4>, depth: Nullable<number>, stencil: Nullable<number>) {\r\n this.ensureRenderBodyReady();\r\n this._renderPass.clear(color, depth, stencil);\r\n const segment = this.getOrCreateCurrentSegment();\r\n segment.hasBodyCommands = true;\r\n }\r\n finish() {\r\n this.submit();\r\n return this._device.device.queue.onSubmittedWorkDone();\r\n }\r\n private createSegment(): LogicalSegment {\r\n const segment: LogicalSegment = {\r\n uploadEncoder: null,\r\n bodyEncoder: null,\r\n hasUploadCommands: false,\r\n hasBodyCommands: false,\r\n buffersWithPendingUploads: [],\r\n texturesWithPendingUploads: []\r\n };\r\n this._segments.push(segment);\r\n return segment;\r\n }\r\n private getCurrentSegment() {\r\n return this._segments.length > 0 ? this._segments[this._segments.length - 1] : null;\r\n }\r\n private getOrCreateCurrentSegment() {\r\n return this.getCurrentSegment() ?? this.createSegment();\r\n }\r\n private getOrCreateUploadEncoder(segment: LogicalSegment) {\r\n if (!segment.uploadEncoder) {\r\n segment.uploadEncoder = this._device.device.createCommandEncoder();\r\n }\r\n return segment.uploadEncoder;\r\n }\r\n private ensureRenderBodyReady() {\r\n if (this._computePass.active) {\r\n this._computePass.end();\r\n }\r\n }\r\n private ensureComputeBodyReady() {\r\n if (this._renderPass.active) {\r\n this._renderPass.end();\r\n }\r\n }\r\n private endAllBodyPasses() {\r\n if (this._renderPass.active) {\r\n this._renderPass.end();\r\n }\r\n if (this._computePass.active) {\r\n this._computePass.end();\r\n }\r\n }\r\n private submit() {\r\n this.endAllBodyPasses();\r\n this.finalizeCurrentSegmentUploads();\r\n if (this._segments.length > 0) {\r\n const commandBuffers: GPUCommandBuffer[] = [];\r\n for (const segment of this._segments) {\r\n if (segment.uploadEncoder && segment.hasUploadCommands) {\r\n commandBuffers.push(segment.uploadEncoder.finish());\r\n }\r\n if (segment.bodyEncoder && segment.hasBodyCommands) {\r\n commandBuffers.push(segment.bodyEncoder.finish());\r\n }\r\n }\r\n if (commandBuffers.length > 0) {\r\n this._device.device.queue.submit(commandBuffers);\r\n }\r\n }\r\n for (const buffer of this._buffersAwaitingSyncEnd) {\r\n buffer.endSyncChanges();\r\n }\r\n this._buffersAwaitingSyncEnd.length = 0;\r\n for (const texture of this._texturesAwaitingSyncEnd) {\r\n texture.endSyncChanges();\r\n }\r\n this._texturesAwaitingSyncEnd.length = 0;\r\n this._segments.length = 0;\r\n this._drawcallCounter = 0;\r\n }\r\n private markBufferAwaitingSyncEnd(buffer: WebGPUBuffer) {\r\n if (this._buffersAwaitingSyncEnd.indexOf(buffer) < 0) {\r\n this._buffersAwaitingSyncEnd.push(buffer);\r\n }\r\n }\r\n private markTextureAwaitingSyncEnd(texture: WebGPUBaseTexture) {\r\n if (this._texturesAwaitingSyncEnd.indexOf(texture) < 0) {\r\n this._texturesAwaitingSyncEnd.push(texture);\r\n }\r\n }\r\n private getSegmentForUpload() {\r\n let segment = this.getOrCreateCurrentSegment();\r\n if (segment.hasBodyCommands) {\r\n this.endAllBodyPasses();\r\n this.finalizeCurrentSegmentUploads();\r\n segment = this.createSegment();\r\n }\r\n return segment;\r\n }\r\n private finalizeCurrentSegmentUploads() {\r\n const segment = this.getCurrentSegment();\r\n if (!segment) {\r\n return;\r\n }\r\n if (segment.buffersWithPendingUploads.length > 0) {\r\n const encoder = this.getOrCreateUploadEncoder(segment);\r\n for (const buffer of segment.buffersWithPendingUploads) {\r\n buffer.beginSyncChanges(encoder);\r\n segment.hasUploadCommands = true;\r\n this.markBufferAwaitingSyncEnd(buffer);\r\n }\r\n segment.buffersWithPendingUploads.length = 0;\r\n }\r\n if (segment.texturesWithPendingUploads.length > 0) {\r\n const encoder = this.getOrCreateUploadEncoder(segment);\r\n for (const texture of segment.texturesWithPendingUploads) {\r\n texture.beginSyncChanges(encoder);\r\n if (!texture.disposed && texture.isMipmapDirty()) {\r\n WebGPUMipmapGenerator.generateMipmap(this._device, texture, encoder);\r\n }\r\n segment.hasUploadCommands = true;\r\n this.markTextureAwaitingSyncEnd(texture);\r\n }\r\n segment.texturesWithPendingUploads.length = 0;\r\n }\r\n }\r\n}\r\n"],"names":["CommandQueueImmediate","_renderPass","_computePass","_segments","_buffersAwaitingSyncEnd","_texturesAwaitingSyncEnd","_device","_drawcallCounter","device","WebGPURenderPass","WebGPUComputePass","isBufferUploading","_buffer","isTextureUploading","_tex","hasActiveWork","length","active","getDrawcallCounter","getEncoder","segment","getOrCreateCurrentSegment","hasBodyCommands","bodyEncoder","createCommandEncoder","flushUploads","finalizeCurrentSegmentUploads","currentPass","beginFrame","endFrame","submit","flush","setFramebuffer","fb","getFramebuffer","getFramebufferInfo","getFrameBufferInfo","executeRenderBundle","renderBundle","ensureRenderBodyReady","bufferUpload","buffer","_offset","_size","getSegmentForUpload","buffersWithPendingUploads","indexOf","push","textureUpload","tex","texturesWithPendingUploads","copyBuffer","srcBuffer","dstBuffer","srcOffset","dstOffset","bytes","endAllBodyPasses","encoder","copyBufferToBuffer","object","copyTexture","srcTexture","dstTexture","srcLevel","dstLevel","width","height","depthOrArrayLayers","copyTextureToTexture","texture","mipLevel","origin","x","y","z","compute","program","bindGroups","bindGroupOffsets","workgroupCountX","workgroupCountY","workgroupCountZ","ensureComputeBodyReady","draw","vertexData","stateSet","primitiveType","first","count","numInstances","capture","renderBundleEncoder","setViewport","vp","getViewport","setScissor","scissor","getScissor","clear","color","depth","stencil","finish","queue","onSubmittedWorkDone","createSegment","uploadEncoder","hasUploadCommands","getCurrentSegment","getOrCreateUploadEncoder","end","commandBuffers","endSyncChanges","markBufferAwaitingSyncEnd","markTextureAwaitingSyncEnd","beginSyncChanges","disposed","isMipmapDirty","WebGPUMipmapGenerator","generateMipmap"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadringbuffer.js","sources":["../src/uploadringbuffer.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\nimport type { WebGPUDevice } from './device';\n\nexport interface MappedBuffer {\n buffer: GPUBuffer;\n size: number;\n offset: number;\n used: boolean;\n mappedRange: Nullable<ArrayBuffer>;\n}\n\nexport interface UploadBuffer {\n mappedBuffer: MappedBuffer;\n uploadSize: number;\n uploadBuffer: Nullable<GPUBuffer>;\n uploadOffset: number;\n}\n\nexport interface UploadImage {\n offsetX: number;\n offsetY: number;\n offsetZ: number;\n srcX: number;\n srcY: number;\n srcZ: number;\n width: number;\n height: number;\n depth: number;\n mipLevel: number;\n image: ImageBitmap | HTMLCanvasElement | OffscreenCanvas;\n}\n\nexport interface UploadTexture {\n mappedBuffer: MappedBuffer;\n uploadOffsetX: number;\n uploadOffsetY: number;\n uploadOffsetZ: number;\n uploadWidth: number;\n uploadHeight: number;\n uploadDepth: number;\n bufferStride: number;\n mipLevel: number;\n}\n\nexport class UploadRingBuffer {\n private readonly _device: WebGPUDevice;\n private _bufferList: MappedBuffer[];\n private readonly _defaultSize: number;\n private _unmappedBufferList: MappedBuffer[];\n constructor(device: WebGPUDevice, defaultSize = 64 * 1024) {\n this._device = device;\n this._bufferList = [];\n this._defaultSize = defaultSize;\n this._unmappedBufferList = [];\n }\n uploadBuffer(\n src: Nullable<ArrayBuffer>,\n dst: Nullable<GPUBuffer>,\n srcOffset: number,\n dstOffset: number,\n uploadSize: number\n ) {\n const size = (uploadSize + 3) & ~3;\n const mappedBuffer = this.fetchBufferMapped(size);\n if (src) {\n const mappedRange = mappedBuffer.mappedRange; //mappedBuffer.buffer.getMappedRange(mappedBuffer.offset, size);\n new Uint8Array(mappedRange!, mappedBuffer.offset, size).set(new Uint8Array(src, srcOffset, uploadSize));\n }\n const upload = {\n mappedBuffer: { ...mappedBuffer },\n uploadSize: size,\n uploadBuffer: dst,\n uploadOffset: dstOffset\n };\n mappedBuffer.offset += size;\n mappedBuffer.offset = (mappedBuffer.offset + 7) & ~7;\n return upload;\n }\n beginUploads() {\n for (let i = this._bufferList.length - 1; i >= 0; i--) {\n const buffer = this._bufferList[i];\n if (buffer.used) {\n buffer.buffer.unmap();\n this._unmappedBufferList.push(buffer);\n this._bufferList.splice(i, 1);\n buffer.mappedRange = null;\n }\n }\n return this._unmappedBufferList.length;\n }\n endUploads() {\n for (const buffer of this._unmappedBufferList) {\n buffer.buffer.mapAsync(GPUMapMode.WRITE).then(() => {\n buffer.offset = 0;\n buffer.used = false;\n buffer.mappedRange = buffer.buffer.getMappedRange();\n this._bufferList.push(buffer);\n });\n }\n this._unmappedBufferList = [];\n }\n purge() {\n for (let i = this._bufferList.length - 1; i >= 0; i--) {\n const buffer = this._bufferList[i];\n if (buffer.mappedRange) {\n buffer.buffer.unmap();\n buffer.buffer.destroy();\n }\n }\n this._bufferList = [];\n for (const buffer of this._unmappedBufferList) {\n buffer.buffer.destroy();\n }\n this._unmappedBufferList = [];\n }\n fetchBufferMapped(size: number) {\n for (const buffer of this._bufferList) {\n if (buffer.size - buffer.offset >= size) {\n buffer.used = true;\n return buffer;\n }\n }\n const bufferSize = (Math.max(size, this._defaultSize) + 3) & ~3;\n const buf = this._device.device.createBuffer({\n label: `StagingRingBuffer${this._bufferList.length}:${bufferSize}`,\n size: bufferSize,\n usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC,\n mappedAtCreation: true\n });\n this._bufferList.push({\n buffer: buf,\n size: bufferSize,\n offset: 0,\n used: true,\n mappedRange: buf.getMappedRange()\n });\n return this._bufferList[this._bufferList.length - 1];\n }\n}\n"],"names":["UploadRingBuffer","_device","_bufferList","_defaultSize","_unmappedBufferList","device","defaultSize","uploadBuffer","src","dst","srcOffset","dstOffset","uploadSize","size","mappedBuffer","fetchBufferMapped","mappedRange","Uint8Array","offset","set","upload","uploadOffset","beginUploads","i","length","buffer","used","unmap","push","splice","endUploads","mapAsync","GPUMapMode","WRITE","then","getMappedRange","purge","destroy","bufferSize","Math","max","buf","createBuffer","label","usage","GPUBufferUsage","MAP_WRITE","COPY_SRC","mappedAtCreation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploadringbuffer.js","sources":["../src/uploadringbuffer.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { WebGPUDevice } from './device';\r\n\r\nexport interface MappedBuffer {\r\n buffer: GPUBuffer;\r\n size: number;\r\n offset: number;\r\n used: boolean;\r\n mappedRange: Nullable<ArrayBuffer>;\r\n}\r\n\r\nexport interface UploadBuffer {\r\n mappedBuffer: MappedBuffer;\r\n uploadSize: number;\r\n uploadBuffer: Nullable<GPUBuffer>;\r\n uploadOffset: number;\r\n}\r\n\r\nexport interface UploadImage {\r\n offsetX: number;\r\n offsetY: number;\r\n offsetZ: number;\r\n srcX: number;\r\n srcY: number;\r\n srcZ: number;\r\n width: number;\r\n height: number;\r\n depth: number;\r\n mipLevel: number;\r\n image: ImageBitmap | HTMLCanvasElement | OffscreenCanvas;\r\n}\r\n\r\nexport interface UploadTexture {\r\n mappedBuffer: MappedBuffer;\r\n uploadOffsetX: number;\r\n uploadOffsetY: number;\r\n uploadOffsetZ: number;\r\n uploadWidth: number;\r\n uploadHeight: number;\r\n uploadDepth: number;\r\n bufferStride: number;\r\n mipLevel: number;\r\n}\r\n\r\nexport class UploadRingBuffer {\r\n private readonly _device: WebGPUDevice;\r\n private _bufferList: MappedBuffer[];\r\n private readonly _defaultSize: number;\r\n private _unmappedBufferList: MappedBuffer[];\r\n constructor(device: WebGPUDevice, defaultSize = 64 * 1024) {\r\n this._device = device;\r\n this._bufferList = [];\r\n this._defaultSize = defaultSize;\r\n this._unmappedBufferList = [];\r\n }\r\n uploadBuffer(\r\n src: Nullable<ArrayBuffer>,\r\n dst: Nullable<GPUBuffer>,\r\n srcOffset: number,\r\n dstOffset: number,\r\n uploadSize: number\r\n ) {\r\n const size = (uploadSize + 3) & ~3;\r\n const mappedBuffer = this.fetchBufferMapped(size);\r\n if (src) {\r\n const mappedRange = mappedBuffer.mappedRange; //mappedBuffer.buffer.getMappedRange(mappedBuffer.offset, size);\r\n new Uint8Array(mappedRange!, mappedBuffer.offset, size).set(new Uint8Array(src, srcOffset, uploadSize));\r\n }\r\n const upload = {\r\n mappedBuffer: { ...mappedBuffer },\r\n uploadSize: size,\r\n uploadBuffer: dst,\r\n uploadOffset: dstOffset\r\n };\r\n mappedBuffer.offset += size;\r\n mappedBuffer.offset = (mappedBuffer.offset + 7) & ~7;\r\n return upload;\r\n }\r\n beginUploads() {\r\n for (let i = this._bufferList.length - 1; i >= 0; i--) {\r\n const buffer = this._bufferList[i];\r\n if (buffer.used) {\r\n buffer.buffer.unmap();\r\n this._unmappedBufferList.push(buffer);\r\n this._bufferList.splice(i, 1);\r\n buffer.mappedRange = null;\r\n }\r\n }\r\n return this._unmappedBufferList.length;\r\n }\r\n endUploads() {\r\n for (const buffer of this._unmappedBufferList) {\r\n buffer.buffer.mapAsync(GPUMapMode.WRITE).then(() => {\r\n buffer.offset = 0;\r\n buffer.used = false;\r\n buffer.mappedRange = buffer.buffer.getMappedRange();\r\n this._bufferList.push(buffer);\r\n });\r\n }\r\n this._unmappedBufferList = [];\r\n }\r\n purge() {\r\n for (let i = this._bufferList.length - 1; i >= 0; i--) {\r\n const buffer = this._bufferList[i];\r\n if (buffer.mappedRange) {\r\n buffer.buffer.unmap();\r\n buffer.buffer.destroy();\r\n }\r\n }\r\n this._bufferList = [];\r\n for (const buffer of this._unmappedBufferList) {\r\n buffer.buffer.destroy();\r\n }\r\n this._unmappedBufferList = [];\r\n }\r\n fetchBufferMapped(size: number) {\r\n for (const buffer of this._bufferList) {\r\n if (buffer.size - buffer.offset >= size) {\r\n buffer.used = true;\r\n return buffer;\r\n }\r\n }\r\n const bufferSize = (Math.max(size, this._defaultSize) + 3) & ~3;\r\n const buf = this._device.device.createBuffer({\r\n label: `StagingRingBuffer${this._bufferList.length}:${bufferSize}`,\r\n size: bufferSize,\r\n usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC,\r\n mappedAtCreation: true\r\n });\r\n this._bufferList.push({\r\n buffer: buf,\r\n size: bufferSize,\r\n offset: 0,\r\n used: true,\r\n mappedRange: buf.getMappedRange()\r\n });\r\n return this._bufferList[this._bufferList.length - 1];\r\n }\r\n}\r\n"],"names":["UploadRingBuffer","_device","_bufferList","_defaultSize","_unmappedBufferList","device","defaultSize","uploadBuffer","src","dst","srcOffset","dstOffset","uploadSize","size","mappedBuffer","fetchBufferMapped","mappedRange","Uint8Array","offset","set","upload","uploadOffset","beginUploads","i","length","buffer","used","unmap","push","splice","endUploads","mapAsync","GPUMapMode","WRITE","then","getMappedRange","purge","destroy","bufferSize","Math","max","buf","createBuffer","label","usage","GPUBufferUsage","MAP_WRITE","COPY_SRC","mappedAtCreation"],"mappings":"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"}
|