@zephyr3d/editor 0.3.7 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{index-ySiLtSxz.js → index-BZ1L8ggE.js} +43 -3
- package/dist/assistant/zephyr-types-index.json +13230 -9488
- package/dist/images/icon1024.png +0 -0
- package/dist/index.html +1 -1
- package/dist/modules/zephyr3d_backend-webgl.js +2 -0
- package/dist/modules/zephyr3d_backend-webgl.js.map +1 -1
- package/dist/modules/zephyr3d_backend-webgpu.js +457 -16
- package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
- package/dist/modules/zephyr3d_device.js +27 -0
- package/dist/modules/zephyr3d_device.js.map +1 -1
- package/dist/modules/zephyr3d_loaders.js +208 -1
- package/dist/modules/zephyr3d_loaders.js.map +1 -1
- package/dist/modules/zephyr3d_scene.js +774 -80
- package/dist/modules/zephyr3d_scene.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js +2 -0
- package/dist/vendor/zephyr3d/backend-webgl/dist/capabilities_webgl.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js +2 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/capabilities_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js +55 -10
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js +4 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/computepass_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js +44 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/device.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +58 -5
- package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js +297 -0
- package/dist/vendor/zephyr3d/backend-webgpu/dist/timestamp_query.js.map +1 -0
- package/dist/vendor/zephyr3d/device/dist/base_types.js.map +1 -1
- package/dist/vendor/zephyr3d/device/dist/device.js +27 -0
- package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
- package/dist/vendor/zephyr3d/device/dist/index.d.ts +81 -1
- package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js +208 -1
- package/dist/vendor/zephyr3d/loaders/dist/gltf/gltf_importer.js.map +1 -1
- package/dist/vendor/zephyr3d/loaders/dist/index.d.ts +8 -0
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js +334 -63
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js +66 -0
- package/dist/vendor/zephyr3d/scene/dist/animation/morphtargetgrouptrack.js.map +1 -0
- package/dist/vendor/zephyr3d/scene/dist/asset/model.js +9 -0
- package/dist/vendor/zephyr3d/scene/dist/asset/model.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/index.d.ts +260 -4
- package/dist/vendor/zephyr3d/scene/dist/index.js +7 -0
- package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js +1 -1
- package/dist/vendor/zephyr3d/scene/dist/posteffect/sao.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js +270 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +19 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
- package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +2 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +70 -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/package.json +6 -6
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderpass_webgpu.js","sources":["../src/renderpass_webgpu.ts"],"sourcesContent":["import type { Immutable, Nullable, TypedArray, Vector4 } from '@zephyr3d/base';\r\nimport type { PrimitiveType, DeviceViewport } from '@zephyr3d/device';\r\nimport {\r\n hasStencilChannel,\r\n PBPrimitiveTypeInfo,\r\n PBPrimitiveType,\r\n isIntegerTextureFormat,\r\n isSignedTextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { WebGPUProgram } from './gpuprogram_webgpu';\r\nimport type { WebGPURenderStateSet } from './renderstates_webgpu';\r\nimport type { WebGPUBindGroup } from './bindgroup_webgpu';\r\nimport type { WebGPUBaseTexture } from './basetexture_webgpu';\r\nimport type { WebGPUDevice } from './device';\r\nimport type { WebGPUFrameBuffer } from './framebuffer_webgpu';\r\nimport type { WebGPUVertexLayout } from './vertexlayout_webgpu';\r\nimport type { WebGPUIndexBuffer } from './indexbuffer_webgpu';\r\nimport type { FrameBufferInfo } from './pipeline_cache';\r\nimport { textureFormatInvMap } from './constants_webgpu';\r\nimport { WebGPUClearQuad } from './utils_webgpu';\r\n\r\nconst VALIDATION_NEED_NEW_PASS = 1 << 0;\r\nconst VALIDATION_FAILED = 1 << 1;\r\n\r\nconst typeU16 = PBPrimitiveTypeInfo.getCachedTypeInfo(PBPrimitiveType.U16);\r\n\r\nexport class WebGPURenderPass {\r\n private readonly _device: WebGPUDevice;\r\n private _renderCommandEncoder: Nullable<GPUCommandEncoder>;\r\n private _renderPassEncoder: Nullable<GPURenderPassEncoder>;\r\n private _fbBindFlag: Nullable<number>;\r\n private _currentViewport: Nullable<DeviceViewport>;\r\n private _currentScissor: Nullable<DeviceViewport>;\r\n private _frameBufferInfo: FrameBufferInfo;\r\n constructor(device: WebGPUDevice) {\r\n this._device = device;\r\n this._renderCommandEncoder = null;\r\n this._renderPassEncoder = null;\r\n this._fbBindFlag = null;\r\n this._currentViewport = null;\r\n this._currentScissor = null;\r\n this._frameBufferInfo = this.createFrameBufferInfo(null);\r\n }\r\n get active() {\r\n return !!this._renderPassEncoder;\r\n }\r\n private createFrameBufferInfo(fb: Nullable<WebGPUFrameBuffer>) {\r\n const info: FrameBufferInfo = !fb\r\n ? {\r\n frameBuffer: null,\r\n colorFormats: [this._device.backbufferFormat],\r\n depthFormat: this._device.backbufferDepthFormat,\r\n sampleCount: this._device.sampleCount,\r\n hash: null,\r\n clearHash: 'f'\r\n }\r\n : {\r\n frameBuffer: fb,\r\n colorFormats: fb.getColorAttachments().map((val) => (val as WebGPUBaseTexture).gpuFormat!),\r\n depthFormat: (fb.getDepthAttachment() as WebGPUBaseTexture)?.gpuFormat!,\r\n sampleCount: fb.getOptions().sampleCount ?? 1,\r\n hash: null,\r\n clearHash: fb\r\n .getColorAttachments()\r\n .map((val) => {\r\n const fmt = textureFormatInvMap[(val as WebGPUBaseTexture).gpuFormat!];\r\n return isIntegerTextureFormat(fmt) ? (isSignedTextureFormat(fmt) ? 'i' : 'u') : 'f';\r\n })\r\n .join('')\r\n };\r\n info.hash = `${info.colorFormats.join('-')}:${info.depthFormat}:${info.sampleCount}`;\r\n return info;\r\n }\r\n setFramebuffer(fb: WebGPUFrameBuffer) {\r\n if (this._frameBufferInfo.frameBuffer !== fb) {\r\n this.end();\r\n this._frameBufferInfo = this.createFrameBufferInfo(fb);\r\n this.setViewport(null);\r\n this.setScissor(null);\r\n }\r\n }\r\n getFramebuffer() {\r\n return this._frameBufferInfo.frameBuffer;\r\n }\r\n setViewport(vp: Nullable<Immutable<number[] | DeviceViewport>>) {\r\n if (!vp || (!Array.isArray(vp) && (vp as DeviceViewport).default)) {\r\n this._currentViewport = {\r\n x: 0,\r\n y: 0,\r\n width: this._device.deviceXToScreen(this._device.drawingBufferWidth),\r\n height: this._device.deviceYToScreen(this._device.drawingBufferHeight),\r\n default: true\r\n };\r\n } else {\r\n if (Array.isArray(vp)) {\r\n this._currentViewport = {\r\n x: vp[0],\r\n y: vp[1],\r\n width: vp[2],\r\n height: vp[3],\r\n default: false\r\n };\r\n } else {\r\n this._currentViewport = Object.assign({ default: false }, vp as DeviceViewport);\r\n }\r\n }\r\n const vx = this._device.screenXToDevice(this._currentViewport.x);\r\n const vy = this._device.screenYToDevice(this._currentViewport.y);\r\n const vw = this._device.screenXToDevice(this._currentViewport.width);\r\n const vh = this._device.screenYToDevice(this._currentViewport.height);\r\n /*\r\n if (vx < 0 || vy < 0 || vw > this._device.drawingBufferWidth || vh > this._device.drawingBufferHeight) {\r\n console.error(\r\n `** VIEWPORT ERROR **: (${vx}, ${vy}, ${vw}, ${vh}) => (0, 0, ${this._device.drawingBufferWidth}, ${this._device.drawingBufferHeight})`\r\n );\r\n }\r\n */\r\n if (this._renderPassEncoder) {\r\n this._renderPassEncoder.setViewport(vx, this._device.drawingBufferHeight - vy - vh, vw, vh, 0, 1);\r\n }\r\n }\r\n getViewport() {\r\n return Object.assign({}, this._currentViewport);\r\n }\r\n setScissor(scissor: Nullable<Immutable<number[] | DeviceViewport>>) {\r\n const backBufferWidth = this._device.deviceXToScreen(this._device.drawingBufferWidth);\r\n const backBufferHeight = this._device.deviceYToScreen(this._device.drawingBufferHeight);\r\n if (\r\n scissor === null ||\r\n scissor === undefined ||\r\n (!Array.isArray(scissor) && (scissor as DeviceViewport).default)\r\n ) {\r\n this._currentScissor = {\r\n x: 0,\r\n y: 0,\r\n width: backBufferWidth,\r\n height: backBufferHeight,\r\n default: true\r\n };\r\n } else {\r\n if (Array.isArray(scissor)) {\r\n this._currentScissor = {\r\n x: scissor[0],\r\n y: scissor[1],\r\n width: scissor[2],\r\n height: scissor[3],\r\n default: false\r\n };\r\n } else {\r\n this._currentScissor = Object.assign({ default: false }, scissor as DeviceViewport);\r\n }\r\n }\r\n let vx = this._device.screenXToDevice(this._currentScissor.x);\r\n let vy = this._device.screenYToDevice(this._currentScissor.y);\r\n let vw = this._device.screenXToDevice(this._currentScissor.width);\r\n let vh = this._device.screenYToDevice(this._currentScissor.height);\r\n // Clip scissor region to screen\r\n if (vx < 0) {\r\n vw += vx;\r\n vx = 0;\r\n }\r\n if (vy < 0) {\r\n vh += vy;\r\n vy = 0;\r\n }\r\n vw = Math.min(this._device.screenXToDevice(backBufferWidth) - vx, vw);\r\n vh = Math.min(this._device.screenYToDevice(backBufferHeight) - vy, vh);\r\n if (vw < 0 || vh < 0) {\r\n vx = 0;\r\n vy = 0;\r\n vw = 0;\r\n vh = 0;\r\n }\r\n if (this._renderPassEncoder) {\r\n this._renderPassEncoder.setScissorRect(vx, this._device.drawingBufferHeight - vy - vh, vw, vh);\r\n }\r\n }\r\n getScissor() {\r\n return Object.assign({}, this._currentScissor);\r\n }\r\n executeRenderBundle(renderBundle: GPURenderBundle) {\r\n if (!this.active) {\r\n this.begin();\r\n }\r\n this._renderPassEncoder!.executeBundles([renderBundle]);\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 const validation = this.validateDraw(\r\n program,\r\n bindGroups,\r\n stateSet,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances\r\n );\r\n if (validation & VALIDATION_FAILED) {\r\n return;\r\n }\r\n if (validation & VALIDATION_NEED_NEW_PASS) {\r\n this.end();\r\n }\r\n if (!this.active) {\r\n this.begin();\r\n }\r\n this.drawInternal(\r\n this._renderPassEncoder!,\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 clear(color: Nullable<Vector4>, depth: Nullable<number>, stencil: Nullable<number>) {\r\n if (!this._currentScissor) {\r\n this.end();\r\n this.begin(color, depth, stencil);\r\n } else {\r\n if (!this._renderPassEncoder) {\r\n this.begin();\r\n }\r\n this._renderPassEncoder!.insertDebugMarker('clear');\r\n WebGPUClearQuad.drawClearQuad(this, color, depth, stencil);\r\n this._renderPassEncoder!.insertDebugMarker('end clear');\r\n }\r\n }\r\n getDevice() {\r\n return this._device;\r\n }\r\n getFrameBufferInfo() {\r\n return this._frameBufferInfo;\r\n }\r\n begin(color?: Nullable<TypedArray>, depth?: Nullable<number>, stencil?: Nullable<number>) {\r\n if (this.active) {\r\n console.error('WebGPURenderPass.begin() failed: begin() has already been called');\r\n return;\r\n }\r\n this._renderCommandEncoder = this._device.commandQueue.getEncoder();\r\n const frameBuffer = this._frameBufferInfo.frameBuffer;\r\n if (!frameBuffer) {\r\n const mainPassDesc = this._device.defaultRenderPassDesc;\r\n const colorAttachmentDesc = (\r\n this._device.defaultRenderPassDesc.colorAttachments as GPURenderPassColorAttachment[]\r\n )[0];\r\n if (this._frameBufferInfo.sampleCount > 1) {\r\n colorAttachmentDesc.resolveTarget = this._device.context!.getCurrentTexture().createView();\r\n } else {\r\n colorAttachmentDesc.view = this._device.context!.getCurrentTexture().createView();\r\n }\r\n colorAttachmentDesc.loadOp = color ? 'clear' : 'load';\r\n // TODO: GPUColor type in @webgpu/types conficts with lib.dom,use `any` type to make ts-server happy\r\n colorAttachmentDesc.clearValue = (color as any) ?? undefined;\r\n const depthAttachmentDesc = this._device.defaultRenderPassDesc.depthStencilAttachment;\r\n depthAttachmentDesc!.depthLoadOp = typeof depth === 'number' ? 'clear' : 'load';\r\n depthAttachmentDesc!.depthClearValue = depth ?? undefined;\r\n depthAttachmentDesc!.stencilLoadOp = typeof stencil === 'number' ? 'clear' : 'load';\r\n depthAttachmentDesc!.stencilClearValue = stencil ?? undefined;\r\n this._renderPassEncoder = this._renderCommandEncoder.beginRenderPass(mainPassDesc);\r\n } else {\r\n const depthAttachmentTexture = frameBuffer.getDepthAttachment() as WebGPUBaseTexture;\r\n let depthTextureView: GPUTextureView;\r\n if (depthAttachmentTexture) {\r\n depthAttachmentTexture._markAsCurrentFB(true);\r\n const attachment = frameBuffer.getOptions().depthAttachment;\r\n const layer =\r\n depthAttachmentTexture.isTexture2DArray() || depthAttachmentTexture.isTexture3D()\r\n ? attachment!.layer\r\n : depthAttachmentTexture.isTextureCube()\r\n ? attachment!.face\r\n : 0;\r\n depthTextureView = depthAttachmentTexture.getView(0, layer ?? 0, 1);\r\n }\r\n this._fbBindFlag = frameBuffer.bindFlag;\r\n\r\n const passDesc: GPURenderPassDescriptor = {\r\n label: `customRenderPass:${this._frameBufferInfo.hash}`,\r\n colorAttachments:\r\n frameBuffer.getOptions().colorAttachments?.map((attachment, index) => {\r\n const tex = attachment.texture as WebGPUBaseTexture;\r\n if (tex) {\r\n tex._markAsCurrentFB(true);\r\n const layer =\r\n tex.isTexture2DArray() || tex.isTexture3D()\r\n ? attachment.layer\r\n : tex.isTextureCube()\r\n ? attachment.face\r\n : 0;\r\n if (frameBuffer.getOptions().sampleCount === 1) {\r\n return {\r\n view: tex.getView(attachment.level ?? 0, layer ?? 0, 1),\r\n loadOp: color ? 'clear' : 'load',\r\n clearValue: color,\r\n storeOp: 'store'\r\n } as GPURenderPassColorAttachment;\r\n } else {\r\n const msaaTexture = frameBuffer.getMSAAColorAttacments()![index];\r\n const msaaView = this._device.gpuCreateTextureView(msaaTexture, {\r\n dimension: '2d',\r\n baseMipLevel: attachment.level ?? 0,\r\n mipLevelCount: 1,\r\n baseArrayLayer: 0,\r\n arrayLayerCount: 1\r\n });\r\n return {\r\n view: msaaView,\r\n resolveTarget: tex.getView(attachment.level ?? 0, layer ?? 0, 1),\r\n loadOp: color ? 'clear' : 'load',\r\n clearValue: color,\r\n storeOp: 'store'\r\n } as GPURenderPassColorAttachment;\r\n }\r\n } else {\r\n return null;\r\n }\r\n }) ?? [],\r\n depthStencilAttachment: depthAttachmentTexture\r\n ? frameBuffer.getOptions().sampleCount === 1\r\n ? {\r\n view: depthTextureView!,\r\n depthLoadOp: typeof depth === 'number' ? 'clear' : 'load',\r\n depthClearValue: depth ?? undefined,\r\n depthStoreOp: 'store',\r\n stencilLoadOp: hasStencilChannel(depthAttachmentTexture.format)\r\n ? typeof stencil === 'number'\r\n ? 'clear'\r\n : 'load'\r\n : undefined,\r\n stencilClearValue: stencil ?? undefined,\r\n stencilStoreOp: hasStencilChannel(depthAttachmentTexture.format) ? 'store' : undefined\r\n }\r\n : {\r\n view: frameBuffer.getMSAADepthAttachment()!.createView(),\r\n depthLoadOp: typeof depth === 'number' ? 'clear' : 'load',\r\n depthClearValue: depth ?? undefined,\r\n depthStoreOp: 'store',\r\n stencilLoadOp: hasStencilChannel(depthAttachmentTexture.format)\r\n ? typeof stencil === 'number'\r\n ? 'clear'\r\n : 'load'\r\n : undefined,\r\n stencilClearValue: stencil ?? undefined,\r\n stencilStoreOp: hasStencilChannel(depthAttachmentTexture.format) ? 'store' : undefined\r\n }\r\n : undefined\r\n };\r\n this._renderPassEncoder = this._renderCommandEncoder.beginRenderPass(passDesc);\r\n }\r\n this.setViewport(this._currentViewport);\r\n this.setScissor(this._currentScissor);\r\n }\r\n end() {\r\n if (!this.active) {\r\n return;\r\n }\r\n // finish current render pass command\r\n if (this._renderPassEncoder) {\r\n this._renderPassEncoder.end();\r\n this._renderPassEncoder = null;\r\n }\r\n this._renderCommandEncoder = null;\r\n // unmark render target flags and generate render target mipmaps if needed\r\n if (this._frameBufferInfo.frameBuffer) {\r\n const options = this._frameBufferInfo.frameBuffer.getOptions();\r\n if (options.colorAttachments) {\r\n for (const attachment of options.colorAttachments) {\r\n (attachment.texture as WebGPUBaseTexture)._markAsCurrentFB(false);\r\n if (attachment.generateMipmaps && attachment.texture.mipLevelCount > 1) {\r\n attachment.texture.generateMipmaps();\r\n }\r\n }\r\n }\r\n (options.depthAttachment?.texture as WebGPUBaseTexture)?._markAsCurrentFB(false);\r\n }\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 const validation = this.validateDraw(\r\n program,\r\n bindGroups,\r\n stateSet,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances\r\n );\r\n if (validation & VALIDATION_FAILED) {\r\n return;\r\n }\r\n this.drawInternal(\r\n this._renderPassEncoder!,\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 renderBundleEncoder\r\n );\r\n }\r\n private drawInternal(\r\n renderPassEncoder: GPURenderPassEncoder,\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 renderBundleEncoder?: GPURenderBundleEncoder\r\n ) {\r\n if (\r\n this.setBindGroupsForRender(\r\n renderPassEncoder,\r\n program,\r\n bindGroups,\r\n bindGroupOffsets,\r\n renderBundleEncoder\r\n )\r\n ) {\r\n const pipeline = this._device.pipelineCache.fetchRenderPipeline(\r\n program,\r\n vertexData,\r\n stateSet,\r\n primitiveType,\r\n this._frameBufferInfo\r\n );\r\n if (pipeline) {\r\n renderPassEncoder.setPipeline(pipeline);\r\n renderBundleEncoder?.setPipeline(pipeline);\r\n const stencilState = stateSet?.stencilState;\r\n if (stencilState) {\r\n renderPassEncoder.setStencilReference(stencilState.ref);\r\n }\r\n if (vertexData) {\r\n const vertexBuffers = vertexData.getLayouts(program.vertexAttributes)?.buffers;\r\n vertexBuffers?.forEach((val, index) => {\r\n renderPassEncoder.setVertexBuffer(index, val.buffer.object as GPUBuffer, val.drawOffset);\r\n renderBundleEncoder?.setVertexBuffer(index, val.buffer.object as GPUBuffer, val.drawOffset);\r\n });\r\n const indexBuffer = vertexData.getIndexBuffer() as unknown as WebGPUIndexBuffer;\r\n if (indexBuffer) {\r\n renderPassEncoder.setIndexBuffer(\r\n indexBuffer.object!,\r\n indexBuffer.indexType === typeU16 ? 'uint16' : 'uint32'\r\n );\r\n renderBundleEncoder?.setIndexBuffer(\r\n indexBuffer.object!,\r\n indexBuffer.indexType === typeU16 ? 'uint16' : 'uint32'\r\n );\r\n renderPassEncoder.drawIndexed(count, numInstances, first);\r\n renderBundleEncoder?.drawIndexed(count, numInstances, first);\r\n } else {\r\n renderPassEncoder.draw(count, numInstances, first);\r\n renderBundleEncoder?.draw(count, numInstances, first);\r\n }\r\n } else {\r\n renderPassEncoder.draw(count, numInstances, first);\r\n renderBundleEncoder?.draw(count, numInstances, first);\r\n }\r\n }\r\n }\r\n }\r\n private validateDraw(\r\n program: WebGPUProgram,\r\n bindGroups: WebGPUBindGroup[],\r\n stateSet: WebGPURenderStateSet,\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ) {\r\n let validation = 0;\r\n const colorTargetCount = this._frameBufferInfo.colorFormats.length;\r\n if (colorTargetCount !== 0 && program.fragmentOutputCount !== colorTargetCount) {\r\n if (\r\n !stateSet?.colorState ||\r\n stateSet.colorState.redMask ||\r\n stateSet.colorState.greenMask ||\r\n stateSet.colorState.blueMask ||\r\n stateSet.colorState.alphaMask\r\n ) {\r\n const framebuffer = this._frameBufferInfo.frameBuffer;\r\n const colorAttachments = framebuffer?.getColorAttachments().map((texture, index) => ({\r\n index,\r\n name: texture?.name,\r\n uid: texture?.uid,\r\n format: texture?.format\r\n })) ?? [{ index: 0, name: '<backbuffer>', uid: 0, format: this._frameBufferInfo.colorFormats[0] }];\r\n console.error('WebGPU draw validation failed: fragment color output count mismatch', {\r\n programName: program.name,\r\n programLabel: program.label,\r\n programHash: program.hash,\r\n fragmentOutputCount: program.fragmentOutputCount,\r\n colorTargetCount,\r\n colorFormats: this._frameBufferInfo.colorFormats,\r\n depthFormat: this._frameBufferInfo.depthFormat,\r\n framebufferName: framebuffer?.name ?? '<backbuffer>',\r\n framebufferHash: this._frameBufferInfo.hash,\r\n colorAttachments,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances,\r\n stack: new Error().stack\r\n });\r\n validation |= VALIDATION_FAILED;\r\n }\r\n }\r\n if (bindGroups) {\r\n for (let i = 0; i < program.bindGroupLayouts.length; i++) {\r\n const bindGroup = bindGroups[i];\r\n if (bindGroup) {\r\n if (bindGroup.bindGroup) {\r\n for (const ubo of bindGroup.bufferList) {\r\n if (ubo.disposed) {\r\n validation |= VALIDATION_FAILED;\r\n }\r\n }\r\n for (const tex of bindGroup.textureList) {\r\n if (tex.disposed) {\r\n validation |= VALIDATION_FAILED;\r\n }\r\n if (tex._isMarkedAsCurrentFB()) {\r\n console.error('bind resource texture can not be current render target');\r\n validation |= VALIDATION_FAILED;\r\n }\r\n }\r\n }\r\n } else {\r\n console.error(`Missing bind group (${i}) when drawing with program '${program.name}'`);\r\n return VALIDATION_FAILED;\r\n }\r\n }\r\n }\r\n if (\r\n this._frameBufferInfo.frameBuffer &&\r\n this._frameBufferInfo.frameBuffer.bindFlag !== this._fbBindFlag\r\n ) {\r\n validation |= VALIDATION_NEED_NEW_PASS;\r\n }\r\n return validation;\r\n }\r\n private setBindGroupsForRender(\r\n renderPassEncoder: GPURenderPassEncoder,\r\n program: WebGPUProgram,\r\n bindGroups: WebGPUBindGroup[],\r\n bindGroupOffsets: Nullable<Nullable<Iterable<number>>[]>,\r\n renderBundleEncoder?: GPURenderBundleEncoder\r\n ) {\r\n if (bindGroups) {\r\n for (let i = 0; i < 4; i++) {\r\n if (i < program.bindGroupLayouts.length) {\r\n const bindGroup = bindGroups[i].bindGroup;\r\n if (!bindGroup) {\r\n return false;\r\n }\r\n const bindGroupOffset = bindGroups[i].getDynamicOffsets() ?? bindGroupOffsets?.[i];\r\n if (bindGroupOffset) {\r\n renderPassEncoder.setBindGroup(i, bindGroup, bindGroupOffset);\r\n renderBundleEncoder?.setBindGroup(i, bindGroup, bindGroupOffset);\r\n } else {\r\n renderPassEncoder.setBindGroup(i, bindGroup);\r\n renderBundleEncoder?.setBindGroup(i, bindGroup);\r\n }\r\n } else {\r\n renderPassEncoder.setBindGroup(i, this._device.emptyBindGroup);\r\n renderBundleEncoder?.setBindGroup(i, this._device.emptyBindGroup);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n"],"names":["VALIDATION_NEED_NEW_PASS","VALIDATION_FAILED","typeU16","PBPrimitiveTypeInfo","getCachedTypeInfo","PBPrimitiveType","U16","WebGPURenderPass","_device","_renderCommandEncoder","_renderPassEncoder","_fbBindFlag","_currentViewport","_currentScissor","_frameBufferInfo","device","createFrameBufferInfo","active","fb","info","frameBuffer","colorFormats","backbufferFormat","depthFormat","backbufferDepthFormat","sampleCount","hash","clearHash","getColorAttachments","map","val","gpuFormat","getDepthAttachment","getOptions","fmt","textureFormatInvMap","isIntegerTextureFormat","isSignedTextureFormat","join","setFramebuffer","end","setViewport","setScissor","getFramebuffer","vp","Array","isArray","default","x","y","width","deviceXToScreen","drawingBufferWidth","height","deviceYToScreen","drawingBufferHeight","Object","assign","vx","screenXToDevice","vy","screenYToDevice","vw","vh","getViewport","scissor","backBufferWidth","backBufferHeight","undefined","Math","min","setScissorRect","getScissor","executeRenderBundle","renderBundle","begin","executeBundles","draw","program","vertexData","stateSet","bindGroups","bindGroupOffsets","primitiveType","first","count","numInstances","validation","validateDraw","drawInternal","clear","color","depth","stencil","insertDebugMarker","WebGPUClearQuad","drawClearQuad","getDevice","getFrameBufferInfo","console","error","commandQueue","getEncoder","mainPassDesc","defaultRenderPassDesc","colorAttachmentDesc","colorAttachments","resolveTarget","context","getCurrentTexture","createView","view","loadOp","clearValue","depthAttachmentDesc","depthStencilAttachment","depthLoadOp","depthClearValue","stencilLoadOp","stencilClearValue","beginRenderPass","depthAttachmentTexture","depthTextureView","_markAsCurrentFB","attachment","depthAttachment","layer","isTexture2DArray","isTexture3D","isTextureCube","face","getView","bindFlag","passDesc","label","index","tex","texture","level","storeOp","msaaTexture","getMSAAColorAttacments","msaaView","gpuCreateTextureView","dimension","baseMipLevel","mipLevelCount","baseArrayLayer","arrayLayerCount","depthStoreOp","hasStencilChannel","format","stencilStoreOp","getMSAADepthAttachment","options","generateMipmaps","capture","renderBundleEncoder","renderPassEncoder","setBindGroupsForRender","pipeline","pipelineCache","fetchRenderPipeline","setPipeline","stencilState","setStencilReference","ref","vertexBuffers","getLayouts","vertexAttributes","buffers","forEach","setVertexBuffer","buffer","object","drawOffset","indexBuffer","getIndexBuffer","setIndexBuffer","indexType","drawIndexed","colorTargetCount","length","fragmentOutputCount","colorState","redMask","greenMask","blueMask","alphaMask","framebuffer","name","uid","programName","programLabel","programHash","framebufferName","framebufferHash","stack","Error","i","bindGroupLayouts","bindGroup","ubo","bufferList","disposed","textureList","_isMarkedAsCurrentFB","bindGroupOffset","getDynamicOffsets","setBindGroup","emptyBindGroup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderpass_webgpu.js","sources":["../src/renderpass_webgpu.ts"],"sourcesContent":["import type { Immutable, Nullable, TypedArray, Vector4 } from '@zephyr3d/base';\r\nimport type { PrimitiveType, DeviceViewport } from '@zephyr3d/device';\r\nimport {\r\n hasStencilChannel,\r\n PBPrimitiveTypeInfo,\r\n PBPrimitiveType,\r\n isIntegerTextureFormat,\r\n isSignedTextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { WebGPUProgram } from './gpuprogram_webgpu';\r\nimport type { WebGPURenderStateSet } from './renderstates_webgpu';\r\nimport type { WebGPUBindGroup } from './bindgroup_webgpu';\r\nimport type { WebGPUBaseTexture } from './basetexture_webgpu';\r\nimport type { WebGPUDevice } from './device';\r\nimport type { WebGPUFrameBuffer } from './framebuffer_webgpu';\r\nimport type { WebGPUVertexLayout } from './vertexlayout_webgpu';\r\nimport type { WebGPUIndexBuffer } from './indexbuffer_webgpu';\r\nimport type { FrameBufferInfo } from './pipeline_cache';\r\nimport { textureFormatInvMap } from './constants_webgpu';\r\nimport { WebGPUClearQuad } from './utils_webgpu';\r\n\r\nconst VALIDATION_NEED_NEW_PASS = 1 << 0;\r\nconst VALIDATION_FAILED = 1 << 1;\r\n\r\nconst typeU16 = PBPrimitiveTypeInfo.getCachedTypeInfo(PBPrimitiveType.U16);\r\n\r\nexport class WebGPURenderPass {\r\n private readonly _device: WebGPUDevice;\r\n private _renderCommandEncoder: Nullable<GPUCommandEncoder>;\r\n private _renderPassEncoder: Nullable<GPURenderPassEncoder>;\r\n private _fbBindFlag: Nullable<number>;\r\n private _currentViewport: Nullable<DeviceViewport>;\r\n private _currentScissor: Nullable<DeviceViewport>;\r\n private _frameBufferInfo: FrameBufferInfo;\r\n private _deferredMipmapTextures: WebGPUBaseTexture[];\r\n constructor(device: WebGPUDevice) {\r\n this._device = device;\r\n this._renderCommandEncoder = null;\r\n this._renderPassEncoder = null;\r\n this._fbBindFlag = null;\r\n this._currentViewport = null;\r\n this._currentScissor = null;\r\n this._frameBufferInfo = this.createFrameBufferInfo(null);\r\n this._deferredMipmapTextures = [];\r\n }\r\n get active() {\r\n return !!this._renderPassEncoder;\r\n }\r\n private createFrameBufferInfo(fb: Nullable<WebGPUFrameBuffer>) {\r\n const info: FrameBufferInfo = !fb\r\n ? {\r\n frameBuffer: null,\r\n colorFormats: [this._device.backbufferFormat],\r\n depthFormat: this._device.backbufferDepthFormat,\r\n sampleCount: this._device.sampleCount,\r\n hash: null,\r\n clearHash: 'f'\r\n }\r\n : {\r\n frameBuffer: fb,\r\n colorFormats: fb.getColorAttachments().map((val) => (val as WebGPUBaseTexture).gpuFormat!),\r\n depthFormat: (fb.getDepthAttachment() as WebGPUBaseTexture)?.gpuFormat!,\r\n sampleCount: fb.getOptions().sampleCount ?? 1,\r\n hash: null,\r\n clearHash: fb\r\n .getColorAttachments()\r\n .map((val) => {\r\n const fmt = textureFormatInvMap[(val as WebGPUBaseTexture).gpuFormat!];\r\n return isIntegerTextureFormat(fmt) ? (isSignedTextureFormat(fmt) ? 'i' : 'u') : 'f';\r\n })\r\n .join('')\r\n };\r\n info.hash = `${info.colorFormats.join('-')}:${info.depthFormat}:${info.sampleCount}`;\r\n return info;\r\n }\r\n setFramebuffer(fb: WebGPUFrameBuffer) {\r\n if (this._frameBufferInfo.frameBuffer !== fb) {\r\n this.end();\r\n this._frameBufferInfo = this.createFrameBufferInfo(fb);\r\n this.setViewport(null);\r\n this.setScissor(null);\r\n }\r\n }\r\n getFramebuffer() {\r\n return this._frameBufferInfo.frameBuffer;\r\n }\r\n setViewport(vp: Nullable<Immutable<number[] | DeviceViewport>>) {\r\n if (!vp || (!Array.isArray(vp) && (vp as DeviceViewport).default)) {\r\n this._currentViewport = {\r\n x: 0,\r\n y: 0,\r\n width: this._device.deviceXToScreen(this._device.drawingBufferWidth),\r\n height: this._device.deviceYToScreen(this._device.drawingBufferHeight),\r\n default: true\r\n };\r\n } else {\r\n if (Array.isArray(vp)) {\r\n this._currentViewport = {\r\n x: vp[0],\r\n y: vp[1],\r\n width: vp[2],\r\n height: vp[3],\r\n default: false\r\n };\r\n } else {\r\n this._currentViewport = Object.assign({ default: false }, vp as DeviceViewport);\r\n }\r\n }\r\n const vx = this._device.screenXToDevice(this._currentViewport.x);\r\n const vy = this._device.screenYToDevice(this._currentViewport.y);\r\n const vw = this._device.screenXToDevice(this._currentViewport.width);\r\n const vh = this._device.screenYToDevice(this._currentViewport.height);\r\n /*\r\n if (vx < 0 || vy < 0 || vw > this._device.drawingBufferWidth || vh > this._device.drawingBufferHeight) {\r\n console.error(\r\n `** VIEWPORT ERROR **: (${vx}, ${vy}, ${vw}, ${vh}) => (0, 0, ${this._device.drawingBufferWidth}, ${this._device.drawingBufferHeight})`\r\n );\r\n }\r\n */\r\n if (this._renderPassEncoder) {\r\n this._renderPassEncoder.setViewport(vx, this._device.drawingBufferHeight - vy - vh, vw, vh, 0, 1);\r\n }\r\n }\r\n getViewport() {\r\n return Object.assign({}, this._currentViewport);\r\n }\r\n setScissor(scissor: Nullable<Immutable<number[] | DeviceViewport>>) {\r\n const backBufferWidth = this._device.deviceXToScreen(this._device.drawingBufferWidth);\r\n const backBufferHeight = this._device.deviceYToScreen(this._device.drawingBufferHeight);\r\n if (\r\n scissor === null ||\r\n scissor === undefined ||\r\n (!Array.isArray(scissor) && (scissor as DeviceViewport).default)\r\n ) {\r\n this._currentScissor = {\r\n x: 0,\r\n y: 0,\r\n width: backBufferWidth,\r\n height: backBufferHeight,\r\n default: true\r\n };\r\n } else {\r\n if (Array.isArray(scissor)) {\r\n this._currentScissor = {\r\n x: scissor[0],\r\n y: scissor[1],\r\n width: scissor[2],\r\n height: scissor[3],\r\n default: false\r\n };\r\n } else {\r\n this._currentScissor = Object.assign({ default: false }, scissor as DeviceViewport);\r\n }\r\n }\r\n let vx = this._device.screenXToDevice(this._currentScissor.x);\r\n let vy = this._device.screenYToDevice(this._currentScissor.y);\r\n let vw = this._device.screenXToDevice(this._currentScissor.width);\r\n let vh = this._device.screenYToDevice(this._currentScissor.height);\r\n // Clip scissor region to screen\r\n if (vx < 0) {\r\n vw += vx;\r\n vx = 0;\r\n }\r\n if (vy < 0) {\r\n vh += vy;\r\n vy = 0;\r\n }\r\n vw = Math.min(this._device.screenXToDevice(backBufferWidth) - vx, vw);\r\n vh = Math.min(this._device.screenYToDevice(backBufferHeight) - vy, vh);\r\n if (vw < 0 || vh < 0) {\r\n vx = 0;\r\n vy = 0;\r\n vw = 0;\r\n vh = 0;\r\n }\r\n if (this._renderPassEncoder) {\r\n this._renderPassEncoder.setScissorRect(vx, this._device.drawingBufferHeight - vy - vh, vw, vh);\r\n }\r\n }\r\n getScissor() {\r\n return Object.assign({}, this._currentScissor);\r\n }\r\n executeRenderBundle(renderBundle: GPURenderBundle) {\r\n if (!this.active) {\r\n this.begin();\r\n }\r\n this._renderPassEncoder!.executeBundles([renderBundle]);\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 const validation = this.validateDraw(\r\n program,\r\n bindGroups,\r\n stateSet,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances\r\n );\r\n if (validation & VALIDATION_FAILED) {\r\n return;\r\n }\r\n if (this.hasDeferredMipmapsForBindGroups(bindGroups)) {\r\n this.end();\r\n this.flushDeferredMipmapsForBindGroups(bindGroups);\r\n }\r\n if (validation & VALIDATION_NEED_NEW_PASS) {\r\n this.end();\r\n }\r\n if (!this.active) {\r\n this.begin();\r\n }\r\n this.drawInternal(\r\n this._renderPassEncoder!,\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 clear(color: Nullable<Vector4>, depth: Nullable<number>, stencil: Nullable<number>) {\r\n if (!this._currentScissor) {\r\n this.end();\r\n this.begin(color, depth, stencil);\r\n } else {\r\n if (!this._renderPassEncoder) {\r\n this.begin();\r\n }\r\n this._renderPassEncoder!.insertDebugMarker('clear');\r\n WebGPUClearQuad.drawClearQuad(this, color, depth, stencil);\r\n this._renderPassEncoder!.insertDebugMarker('end clear');\r\n }\r\n }\r\n getDevice() {\r\n return this._device;\r\n }\r\n getFrameBufferInfo() {\r\n return this._frameBufferInfo;\r\n }\r\n begin(color?: Nullable<TypedArray>, depth?: Nullable<number>, stencil?: Nullable<number>) {\r\n if (this.active) {\r\n console.error('WebGPURenderPass.begin() failed: begin() has already been called');\r\n return;\r\n }\r\n this._renderCommandEncoder = this._device.commandQueue.getEncoder();\r\n const frameBuffer = this._frameBufferInfo.frameBuffer;\r\n if (!frameBuffer) {\r\n const mainPassDesc = this._device.defaultRenderPassDesc;\r\n const colorAttachmentDesc = (\r\n this._device.defaultRenderPassDesc.colorAttachments as GPURenderPassColorAttachment[]\r\n )[0];\r\n if (this._frameBufferInfo.sampleCount > 1) {\r\n colorAttachmentDesc.resolveTarget = this._device.context!.getCurrentTexture().createView();\r\n } else {\r\n colorAttachmentDesc.view = this._device.context!.getCurrentTexture().createView();\r\n }\r\n colorAttachmentDesc.loadOp = color ? 'clear' : 'load';\r\n // TODO: GPUColor type in @webgpu/types conficts with lib.dom,use `any` type to make ts-server happy\r\n colorAttachmentDesc.clearValue = (color as any) ?? undefined;\r\n const depthAttachmentDesc = this._device.defaultRenderPassDesc.depthStencilAttachment;\r\n depthAttachmentDesc!.depthLoadOp = typeof depth === 'number' ? 'clear' : 'load';\r\n depthAttachmentDesc!.depthClearValue = depth ?? undefined;\r\n depthAttachmentDesc!.stencilLoadOp = typeof stencil === 'number' ? 'clear' : 'load';\r\n depthAttachmentDesc!.stencilClearValue = stencil ?? undefined;\r\n this._renderPassEncoder = this._renderCommandEncoder.beginRenderPass(mainPassDesc);\r\n } else {\r\n const depthAttachmentTexture = frameBuffer.getDepthAttachment() as WebGPUBaseTexture;\r\n let depthTextureView: GPUTextureView;\r\n if (depthAttachmentTexture) {\r\n depthAttachmentTexture._markAsCurrentFB(true);\r\n const attachment = frameBuffer.getOptions().depthAttachment;\r\n const layer =\r\n depthAttachmentTexture.isTexture2DArray() || depthAttachmentTexture.isTexture3D()\r\n ? attachment!.layer\r\n : depthAttachmentTexture.isTextureCube()\r\n ? attachment!.face\r\n : 0;\r\n depthTextureView = depthAttachmentTexture.getView(0, layer ?? 0, 1);\r\n }\r\n this._fbBindFlag = frameBuffer.bindFlag;\r\n\r\n const passDesc: GPURenderPassDescriptor = {\r\n label: `customRenderPass:${this._frameBufferInfo.hash}`,\r\n colorAttachments:\r\n frameBuffer.getOptions().colorAttachments?.map((attachment, index) => {\r\n const tex = attachment.texture as WebGPUBaseTexture;\r\n if (tex) {\r\n tex._markAsCurrentFB(true);\r\n const layer =\r\n tex.isTexture2DArray() || tex.isTexture3D()\r\n ? attachment.layer\r\n : tex.isTextureCube()\r\n ? attachment.face\r\n : 0;\r\n if (frameBuffer.getOptions().sampleCount === 1) {\r\n return {\r\n view: tex.getView(attachment.level ?? 0, layer ?? 0, 1),\r\n loadOp: color ? 'clear' : 'load',\r\n clearValue: color,\r\n storeOp: 'store'\r\n } as GPURenderPassColorAttachment;\r\n } else {\r\n const msaaTexture = frameBuffer.getMSAAColorAttacments()![index];\r\n const msaaView = this._device.gpuCreateTextureView(msaaTexture, {\r\n dimension: '2d',\r\n baseMipLevel: attachment.level ?? 0,\r\n mipLevelCount: 1,\r\n baseArrayLayer: 0,\r\n arrayLayerCount: 1\r\n });\r\n return {\r\n view: msaaView,\r\n resolveTarget: tex.getView(attachment.level ?? 0, layer ?? 0, 1),\r\n loadOp: color ? 'clear' : 'load',\r\n clearValue: color,\r\n storeOp: 'store'\r\n } as GPURenderPassColorAttachment;\r\n }\r\n } else {\r\n return null;\r\n }\r\n }) ?? [],\r\n depthStencilAttachment: depthAttachmentTexture\r\n ? frameBuffer.getOptions().sampleCount === 1\r\n ? {\r\n view: depthTextureView!,\r\n depthLoadOp: typeof depth === 'number' ? 'clear' : 'load',\r\n depthClearValue: depth ?? undefined,\r\n depthStoreOp: 'store',\r\n stencilLoadOp: hasStencilChannel(depthAttachmentTexture.format)\r\n ? typeof stencil === 'number'\r\n ? 'clear'\r\n : 'load'\r\n : undefined,\r\n stencilClearValue: stencil ?? undefined,\r\n stencilStoreOp: hasStencilChannel(depthAttachmentTexture.format) ? 'store' : undefined\r\n }\r\n : {\r\n view: frameBuffer.getMSAADepthAttachment()!.createView(),\r\n depthLoadOp: typeof depth === 'number' ? 'clear' : 'load',\r\n depthClearValue: depth ?? undefined,\r\n depthStoreOp: 'store',\r\n stencilLoadOp: hasStencilChannel(depthAttachmentTexture.format)\r\n ? typeof stencil === 'number'\r\n ? 'clear'\r\n : 'load'\r\n : undefined,\r\n stencilClearValue: stencil ?? undefined,\r\n stencilStoreOp: hasStencilChannel(depthAttachmentTexture.format) ? 'store' : undefined\r\n }\r\n : undefined\r\n };\r\n this._renderPassEncoder = this._renderCommandEncoder.beginRenderPass(passDesc);\r\n }\r\n this.setViewport(this._currentViewport);\r\n this.setScissor(this._currentScissor);\r\n }\r\n end(generateMipmaps = true) {\r\n if (!this.active) {\r\n return;\r\n }\r\n // finish current render pass command\r\n if (this._renderPassEncoder) {\r\n this._renderPassEncoder.end();\r\n this._renderPassEncoder = null;\r\n }\r\n this._renderCommandEncoder = null;\r\n // unmark render target flags and generate render target mipmaps if needed\r\n if (this._frameBufferInfo.frameBuffer) {\r\n const options = this._frameBufferInfo.frameBuffer.getOptions();\r\n if (options.colorAttachments) {\r\n for (const attachment of options.colorAttachments) {\r\n const texture = attachment.texture as WebGPUBaseTexture;\r\n texture._markAsCurrentFB(false);\r\n this.handleColorAttachmentMipmap(texture, !!attachment.generateMipmaps, generateMipmaps);\r\n }\r\n }\r\n (options.depthAttachment?.texture as WebGPUBaseTexture)?._markAsCurrentFB(false);\r\n }\r\n }\r\n hasDeferredMipmapsForBindGroups(bindGroups: WebGPUBindGroup[]) {\r\n return bindGroups?.some((bindGroup) => {\r\n return bindGroup?.textureList.some((texture) => this._deferredMipmapTextures.indexOf(texture) >= 0);\r\n });\r\n }\r\n flushDeferredMipmapsForBindGroups(bindGroups?: WebGPUBindGroup[]): void {\r\n if (!bindGroups) {\r\n this.flushDeferredMipmaps();\r\n return;\r\n }\r\n for (const bindGroup of bindGroups) {\r\n for (const texture of bindGroup?.textureList ?? []) {\r\n this.flushDeferredMipmap(texture);\r\n }\r\n }\r\n }\r\n flushDeferredMipmaps(): void {\r\n const textures = this._deferredMipmapTextures.splice(0);\r\n for (const texture of textures) {\r\n if (!texture.disposed) {\r\n texture.generateMipmaps();\r\n }\r\n }\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 const validation = this.validateDraw(\r\n program,\r\n bindGroups,\r\n stateSet,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances\r\n );\r\n if (validation & VALIDATION_FAILED) {\r\n return;\r\n }\r\n this.drawInternal(\r\n this._renderPassEncoder!,\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 renderBundleEncoder\r\n );\r\n }\r\n private drawInternal(\r\n renderPassEncoder: GPURenderPassEncoder,\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 renderBundleEncoder?: GPURenderBundleEncoder\r\n ) {\r\n if (\r\n this.setBindGroupsForRender(\r\n renderPassEncoder,\r\n program,\r\n bindGroups,\r\n bindGroupOffsets,\r\n renderBundleEncoder\r\n )\r\n ) {\r\n const pipeline = this._device.pipelineCache.fetchRenderPipeline(\r\n program,\r\n vertexData,\r\n stateSet,\r\n primitiveType,\r\n this._frameBufferInfo\r\n );\r\n if (pipeline) {\r\n renderPassEncoder.setPipeline(pipeline);\r\n renderBundleEncoder?.setPipeline(pipeline);\r\n const stencilState = stateSet?.stencilState;\r\n if (stencilState) {\r\n renderPassEncoder.setStencilReference(stencilState.ref);\r\n }\r\n if (vertexData) {\r\n const vertexBuffers = vertexData.getLayouts(program.vertexAttributes)?.buffers;\r\n vertexBuffers?.forEach((val, index) => {\r\n renderPassEncoder.setVertexBuffer(index, val.buffer.object as GPUBuffer, val.drawOffset);\r\n renderBundleEncoder?.setVertexBuffer(index, val.buffer.object as GPUBuffer, val.drawOffset);\r\n });\r\n const indexBuffer = vertexData.getIndexBuffer() as unknown as WebGPUIndexBuffer;\r\n if (indexBuffer) {\r\n renderPassEncoder.setIndexBuffer(\r\n indexBuffer.object!,\r\n indexBuffer.indexType === typeU16 ? 'uint16' : 'uint32'\r\n );\r\n renderBundleEncoder?.setIndexBuffer(\r\n indexBuffer.object!,\r\n indexBuffer.indexType === typeU16 ? 'uint16' : 'uint32'\r\n );\r\n renderPassEncoder.drawIndexed(count, numInstances, first);\r\n renderBundleEncoder?.drawIndexed(count, numInstances, first);\r\n } else {\r\n renderPassEncoder.draw(count, numInstances, first);\r\n renderBundleEncoder?.draw(count, numInstances, first);\r\n }\r\n } else {\r\n renderPassEncoder.draw(count, numInstances, first);\r\n renderBundleEncoder?.draw(count, numInstances, first);\r\n }\r\n }\r\n }\r\n }\r\n private validateDraw(\r\n program: WebGPUProgram,\r\n bindGroups: WebGPUBindGroup[],\r\n stateSet: WebGPURenderStateSet,\r\n primitiveType: PrimitiveType,\r\n first: number,\r\n count: number,\r\n numInstances: number\r\n ) {\r\n let validation = 0;\r\n const colorTargetCount = this._frameBufferInfo.colorFormats.length;\r\n if (colorTargetCount !== 0 && program.fragmentOutputCount !== colorTargetCount) {\r\n if (\r\n !stateSet?.colorState ||\r\n stateSet.colorState.redMask ||\r\n stateSet.colorState.greenMask ||\r\n stateSet.colorState.blueMask ||\r\n stateSet.colorState.alphaMask\r\n ) {\r\n const framebuffer = this._frameBufferInfo.frameBuffer;\r\n const colorAttachments = framebuffer?.getColorAttachments().map((texture, index) => ({\r\n index,\r\n name: texture?.name,\r\n uid: texture?.uid,\r\n format: texture?.format\r\n })) ?? [{ index: 0, name: '<backbuffer>', uid: 0, format: this._frameBufferInfo.colorFormats[0] }];\r\n console.error('WebGPU draw validation failed: fragment color output count mismatch', {\r\n programName: program.name,\r\n programLabel: program.label,\r\n programHash: program.hash,\r\n fragmentOutputCount: program.fragmentOutputCount,\r\n colorTargetCount,\r\n colorFormats: this._frameBufferInfo.colorFormats,\r\n depthFormat: this._frameBufferInfo.depthFormat,\r\n framebufferName: framebuffer?.name ?? '<backbuffer>',\r\n framebufferHash: this._frameBufferInfo.hash,\r\n colorAttachments,\r\n primitiveType,\r\n first,\r\n count,\r\n numInstances,\r\n stack: new Error().stack\r\n });\r\n validation |= VALIDATION_FAILED;\r\n }\r\n }\r\n if (bindGroups) {\r\n for (let i = 0; i < program.bindGroupLayouts.length; i++) {\r\n const bindGroup = bindGroups[i];\r\n if (bindGroup) {\r\n if (bindGroup.bindGroup) {\r\n for (const ubo of bindGroup.bufferList) {\r\n if (ubo.disposed) {\r\n validation |= VALIDATION_FAILED;\r\n }\r\n }\r\n for (const tex of bindGroup.textureList) {\r\n if (tex.disposed) {\r\n validation |= VALIDATION_FAILED;\r\n }\r\n if (tex._isMarkedAsCurrentFB()) {\r\n console.error('bind resource texture can not be current render target');\r\n validation |= VALIDATION_FAILED;\r\n }\r\n }\r\n }\r\n } else {\r\n console.error(`Missing bind group (${i}) when drawing with program '${program.name}'`);\r\n return VALIDATION_FAILED;\r\n }\r\n }\r\n }\r\n if (\r\n this._frameBufferInfo.frameBuffer &&\r\n this._frameBufferInfo.frameBuffer.bindFlag !== this._fbBindFlag\r\n ) {\r\n validation |= VALIDATION_NEED_NEW_PASS;\r\n }\r\n return validation;\r\n }\r\n private handleColorAttachmentMipmap(\r\n texture: WebGPUBaseTexture,\r\n attachmentGenerateMipmaps: boolean,\r\n generateMipmaps: boolean\r\n ): void {\r\n if (!attachmentGenerateMipmaps || texture.mipLevelCount <= 1) {\r\n return;\r\n }\r\n if (generateMipmaps) {\r\n this.removeDeferredMipmap(texture);\r\n texture.generateMipmaps();\r\n } else if (this._deferredMipmapTextures.indexOf(texture) < 0) {\r\n this._deferredMipmapTextures.push(texture);\r\n }\r\n }\r\n private flushDeferredMipmap(texture: WebGPUBaseTexture): void {\r\n if (this.removeDeferredMipmap(texture) && !texture.disposed) {\r\n texture.generateMipmaps();\r\n }\r\n }\r\n private removeDeferredMipmap(texture: WebGPUBaseTexture): boolean {\r\n const index = this._deferredMipmapTextures.indexOf(texture);\r\n if (index >= 0) {\r\n this._deferredMipmapTextures.splice(index, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n private setBindGroupsForRender(\r\n renderPassEncoder: GPURenderPassEncoder,\r\n program: WebGPUProgram,\r\n bindGroups: WebGPUBindGroup[],\r\n bindGroupOffsets: Nullable<Nullable<Iterable<number>>[]>,\r\n renderBundleEncoder?: GPURenderBundleEncoder\r\n ) {\r\n if (bindGroups) {\r\n for (let i = 0; i < 4; i++) {\r\n if (i < program.bindGroupLayouts.length) {\r\n const bindGroup = bindGroups[i].bindGroup;\r\n if (!bindGroup) {\r\n return false;\r\n }\r\n const bindGroupOffset = bindGroups[i].getDynamicOffsets() ?? bindGroupOffsets?.[i];\r\n if (bindGroupOffset) {\r\n renderPassEncoder.setBindGroup(i, bindGroup, bindGroupOffset);\r\n renderBundleEncoder?.setBindGroup(i, bindGroup, bindGroupOffset);\r\n } else {\r\n renderPassEncoder.setBindGroup(i, bindGroup);\r\n renderBundleEncoder?.setBindGroup(i, bindGroup);\r\n }\r\n } else {\r\n renderPassEncoder.setBindGroup(i, this._device.emptyBindGroup);\r\n renderBundleEncoder?.setBindGroup(i, this._device.emptyBindGroup);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n"],"names":["VALIDATION_NEED_NEW_PASS","VALIDATION_FAILED","typeU16","PBPrimitiveTypeInfo","getCachedTypeInfo","PBPrimitiveType","U16","WebGPURenderPass","_device","_renderCommandEncoder","_renderPassEncoder","_fbBindFlag","_currentViewport","_currentScissor","_frameBufferInfo","_deferredMipmapTextures","device","createFrameBufferInfo","active","fb","info","frameBuffer","colorFormats","backbufferFormat","depthFormat","backbufferDepthFormat","sampleCount","hash","clearHash","getColorAttachments","map","val","gpuFormat","getDepthAttachment","getOptions","fmt","textureFormatInvMap","isIntegerTextureFormat","isSignedTextureFormat","join","setFramebuffer","end","setViewport","setScissor","getFramebuffer","vp","Array","isArray","default","x","y","width","deviceXToScreen","drawingBufferWidth","height","deviceYToScreen","drawingBufferHeight","Object","assign","vx","screenXToDevice","vy","screenYToDevice","vw","vh","getViewport","scissor","backBufferWidth","backBufferHeight","undefined","Math","min","setScissorRect","getScissor","executeRenderBundle","renderBundle","begin","executeBundles","draw","program","vertexData","stateSet","bindGroups","bindGroupOffsets","primitiveType","first","count","numInstances","validation","validateDraw","hasDeferredMipmapsForBindGroups","flushDeferredMipmapsForBindGroups","drawInternal","clear","color","depth","stencil","insertDebugMarker","WebGPUClearQuad","drawClearQuad","getDevice","getFrameBufferInfo","console","error","commandQueue","getEncoder","mainPassDesc","defaultRenderPassDesc","colorAttachmentDesc","colorAttachments","resolveTarget","context","getCurrentTexture","createView","view","loadOp","clearValue","depthAttachmentDesc","depthStencilAttachment","depthLoadOp","depthClearValue","stencilLoadOp","stencilClearValue","beginRenderPass","depthAttachmentTexture","depthTextureView","_markAsCurrentFB","attachment","depthAttachment","layer","isTexture2DArray","isTexture3D","isTextureCube","face","getView","bindFlag","passDesc","label","index","tex","texture","level","storeOp","msaaTexture","getMSAAColorAttacments","msaaView","gpuCreateTextureView","dimension","baseMipLevel","mipLevelCount","baseArrayLayer","arrayLayerCount","depthStoreOp","hasStencilChannel","format","stencilStoreOp","getMSAADepthAttachment","generateMipmaps","options","handleColorAttachmentMipmap","some","bindGroup","textureList","indexOf","flushDeferredMipmaps","flushDeferredMipmap","textures","splice","disposed","capture","renderBundleEncoder","renderPassEncoder","setBindGroupsForRender","pipeline","pipelineCache","fetchRenderPipeline","setPipeline","stencilState","setStencilReference","ref","vertexBuffers","getLayouts","vertexAttributes","buffers","forEach","setVertexBuffer","buffer","object","drawOffset","indexBuffer","getIndexBuffer","setIndexBuffer","indexType","drawIndexed","colorTargetCount","length","fragmentOutputCount","colorState","redMask","greenMask","blueMask","alphaMask","framebuffer","name","uid","programName","programLabel","programHash","framebufferName","framebufferHash","stack","Error","i","bindGroupLayouts","ubo","bufferList","_isMarkedAsCurrentFB","attachmentGenerateMipmaps","removeDeferredMipmap","push","bindGroupOffset","getDynamicOffsets","setBindGroup","emptyBindGroup"],"mappings":"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"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
const TIMESTAMP_QUERY_COUNT = 4096;
|
|
2
|
+
const TIMESTAMP_BYTES_PER_QUERY = 8;
|
|
3
|
+
const TIMESTAMP_QUERIES_PER_SCOPE = 2;
|
|
4
|
+
const TIMESTAMP_RESOLVE_STRIDE = 256;
|
|
5
|
+
const MAX_RESOLVED_RESULT_HISTORY = 4096;
|
|
6
|
+
const defaultTimestampQueryOptions = {
|
|
7
|
+
includePendingUploads: true,
|
|
8
|
+
allowCrossFrame: false,
|
|
9
|
+
strict: false
|
|
10
|
+
};
|
|
11
|
+
class WebGPUTimestampQueryManager {
|
|
12
|
+
_device;
|
|
13
|
+
_supported;
|
|
14
|
+
_querySet;
|
|
15
|
+
_freeQueryPairs;
|
|
16
|
+
_records;
|
|
17
|
+
_openRecords;
|
|
18
|
+
_endedRecords;
|
|
19
|
+
_pendingSubmitBatches;
|
|
20
|
+
_resolvedResults;
|
|
21
|
+
_nextId;
|
|
22
|
+
constructor(device){
|
|
23
|
+
this._device = device;
|
|
24
|
+
this._supported = device.device.features.has('timestamp-query');
|
|
25
|
+
this._querySet = this._supported ? device.device.createQuerySet({
|
|
26
|
+
type: 'timestamp',
|
|
27
|
+
count: TIMESTAMP_QUERY_COUNT
|
|
28
|
+
}) : null;
|
|
29
|
+
this._freeQueryPairs = [];
|
|
30
|
+
for(let i = TIMESTAMP_QUERY_COUNT - 2; i >= 0; i -= 2){
|
|
31
|
+
this._freeQueryPairs.push(i);
|
|
32
|
+
}
|
|
33
|
+
this._records = new Map();
|
|
34
|
+
this._openRecords = new Map();
|
|
35
|
+
this._endedRecords = [];
|
|
36
|
+
this._pendingSubmitBatches = [];
|
|
37
|
+
this._resolvedResults = [];
|
|
38
|
+
this._nextId = 0;
|
|
39
|
+
}
|
|
40
|
+
get supported() {
|
|
41
|
+
return this._supported;
|
|
42
|
+
}
|
|
43
|
+
begin(label, options) {
|
|
44
|
+
if (!this._supported || !this._querySet) {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
const id = ++this._nextId;
|
|
48
|
+
const resolvedOptions = {
|
|
49
|
+
...defaultTimestampQueryOptions,
|
|
50
|
+
...options ?? {}
|
|
51
|
+
};
|
|
52
|
+
const startIndex = this._freeQueryPairs.pop();
|
|
53
|
+
if (startIndex === undefined) {
|
|
54
|
+
const result = this.createResult(id, label ?? '', this._device.frameInfo.frameCounter, 0n, 0n, 'exhausted', false, 'GPU timestamp query pool exhausted');
|
|
55
|
+
this._records.set(id, {
|
|
56
|
+
id,
|
|
57
|
+
label: result.label,
|
|
58
|
+
frameId: result.frameId,
|
|
59
|
+
options: resolvedOptions,
|
|
60
|
+
startIndex: -1,
|
|
61
|
+
endIndex: -1,
|
|
62
|
+
status: 'exhausted',
|
|
63
|
+
autoClosed: false,
|
|
64
|
+
result,
|
|
65
|
+
waiters: []
|
|
66
|
+
});
|
|
67
|
+
this.pushResolvedResult(result);
|
|
68
|
+
return id;
|
|
69
|
+
}
|
|
70
|
+
const record = {
|
|
71
|
+
id,
|
|
72
|
+
label: label ?? '',
|
|
73
|
+
frameId: this._device.frameInfo.frameCounter,
|
|
74
|
+
options: resolvedOptions,
|
|
75
|
+
startIndex,
|
|
76
|
+
endIndex: startIndex + 1,
|
|
77
|
+
status: 'open',
|
|
78
|
+
autoClosed: false,
|
|
79
|
+
result: null,
|
|
80
|
+
waiters: []
|
|
81
|
+
};
|
|
82
|
+
this._records.set(id, record);
|
|
83
|
+
this._openRecords.set(id, record);
|
|
84
|
+
this._device.commandQueue.insertTimestampMarker(this._querySet, record.startIndex, record.options.includePendingUploads);
|
|
85
|
+
return id;
|
|
86
|
+
}
|
|
87
|
+
end(id) {
|
|
88
|
+
if (!this._supported) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const record = this._records.get(id);
|
|
92
|
+
if (!record) {
|
|
93
|
+
this.reportInvalidEnd(id, 'endTimestampQuery() ignored: invalid query id');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (record.status !== 'open') {
|
|
97
|
+
if (record.status !== 'exhausted' && record.status !== 'unsupported') {
|
|
98
|
+
this.reportInvalidEnd(id, 'endTimestampQuery() ignored: query is not open');
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.endRecord(record, false);
|
|
103
|
+
}
|
|
104
|
+
autoCloseOpenScopes() {
|
|
105
|
+
for (const record of Array.from(this._openRecords.values())){
|
|
106
|
+
if (!record.options.allowCrossFrame) {
|
|
107
|
+
this.endRecord(record, true);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
createResolveCommandBuffer() {
|
|
112
|
+
if (!this._querySet || this._endedRecords.length === 0) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
const records = this._endedRecords.splice(0);
|
|
116
|
+
const entries = records.map((record, index)=>{
|
|
117
|
+
record.status = 'resolving';
|
|
118
|
+
return {
|
|
119
|
+
record,
|
|
120
|
+
readbackOffset: index * TIMESTAMP_RESOLVE_STRIDE
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
const byteLength = entries.length * TIMESTAMP_RESOLVE_STRIDE;
|
|
124
|
+
const resolveBuffer = this._device.device.createBuffer({
|
|
125
|
+
label: 'timestamp-query-resolve',
|
|
126
|
+
size: byteLength,
|
|
127
|
+
usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC
|
|
128
|
+
});
|
|
129
|
+
const readbackBuffer = this._device.device.createBuffer({
|
|
130
|
+
label: 'timestamp-query-readback',
|
|
131
|
+
size: byteLength,
|
|
132
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
|
|
133
|
+
});
|
|
134
|
+
const encoder = this._device.device.createCommandEncoder({
|
|
135
|
+
label: 'timestamp-query-resolve'
|
|
136
|
+
});
|
|
137
|
+
for (const entry of entries){
|
|
138
|
+
encoder.resolveQuerySet(this._querySet, entry.record.startIndex, TIMESTAMP_QUERIES_PER_SCOPE, resolveBuffer, entry.readbackOffset);
|
|
139
|
+
}
|
|
140
|
+
encoder.copyBufferToBuffer(resolveBuffer, 0, readbackBuffer, 0, byteLength);
|
|
141
|
+
this._pendingSubmitBatches.push({
|
|
142
|
+
entries,
|
|
143
|
+
resolveBuffer,
|
|
144
|
+
readbackBuffer
|
|
145
|
+
});
|
|
146
|
+
return encoder.finish();
|
|
147
|
+
}
|
|
148
|
+
onSubmitted() {
|
|
149
|
+
const batches = this._pendingSubmitBatches.splice(0);
|
|
150
|
+
for (const batch of batches){
|
|
151
|
+
batch.readbackBuffer.mapAsync(GPUMapMode.READ).then(()=>{
|
|
152
|
+
this.completeBatch(batch);
|
|
153
|
+
}).catch((err)=>{
|
|
154
|
+
this.failBatch(batch, err instanceof Error ? err.message : String(err));
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
poll(query) {
|
|
159
|
+
if (!this._supported) {
|
|
160
|
+
return this.createUnsupportedResult(query);
|
|
161
|
+
}
|
|
162
|
+
const record = this.findRecord(query);
|
|
163
|
+
if (!record) {
|
|
164
|
+
return this.createInvalidResult(query, 'Timestamp query not found');
|
|
165
|
+
}
|
|
166
|
+
return record.result;
|
|
167
|
+
}
|
|
168
|
+
resolve(query) {
|
|
169
|
+
if (!this._supported) {
|
|
170
|
+
return Promise.resolve(this.createUnsupportedResult(query));
|
|
171
|
+
}
|
|
172
|
+
const record = this.findRecord(query);
|
|
173
|
+
if (!record) {
|
|
174
|
+
return Promise.resolve(this.createInvalidResult(query, 'Timestamp query not found'));
|
|
175
|
+
}
|
|
176
|
+
if (record.result) {
|
|
177
|
+
return Promise.resolve(record.result);
|
|
178
|
+
}
|
|
179
|
+
return new Promise((resolve)=>{
|
|
180
|
+
record.waiters.push(resolve);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
collect(filter) {
|
|
184
|
+
return this._resolvedResults.filter((result)=>{
|
|
185
|
+
return (filter?.label === undefined || result.label === filter.label) && (filter?.frameId === undefined || result.frameId === filter.frameId);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
endRecord(record, autoClosed) {
|
|
189
|
+
if (!this._querySet) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
record.autoClosed = autoClosed;
|
|
193
|
+
this._openRecords.delete(record.id);
|
|
194
|
+
this._device.commandQueue.insertTimestampMarker(this._querySet, record.endIndex, record.options.includePendingUploads);
|
|
195
|
+
record.status = 'ended';
|
|
196
|
+
this._endedRecords.push(record);
|
|
197
|
+
if (autoClosed) {
|
|
198
|
+
console.warn(`GPU timestamp query '${record.label}' was automatically closed at frame end`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
completeBatch(batch) {
|
|
202
|
+
const values = new BigUint64Array(batch.readbackBuffer.getMappedRange());
|
|
203
|
+
for (const entry of batch.entries){
|
|
204
|
+
const record = entry.record;
|
|
205
|
+
const valueOffset = entry.readbackOffset / TIMESTAMP_BYTES_PER_QUERY;
|
|
206
|
+
const start = values[valueOffset];
|
|
207
|
+
const end = values[valueOffset + 1];
|
|
208
|
+
const duration = end >= start ? end - start : 0n;
|
|
209
|
+
const result = this.createResult(record.id, record.label, record.frameId, start, end, record.autoClosed ? 'auto-closed' : 'resolved', record.autoClosed);
|
|
210
|
+
result.durationMs = Number(duration) / 1000000;
|
|
211
|
+
record.status = result.status;
|
|
212
|
+
record.result = result;
|
|
213
|
+
this.freeQueryPair(record.startIndex);
|
|
214
|
+
this.resolveWaiters(record);
|
|
215
|
+
this.pushResolvedResult(result);
|
|
216
|
+
}
|
|
217
|
+
batch.readbackBuffer.unmap();
|
|
218
|
+
batch.readbackBuffer.destroy();
|
|
219
|
+
batch.resolveBuffer.destroy();
|
|
220
|
+
}
|
|
221
|
+
failBatch(batch, message) {
|
|
222
|
+
for (const entry of batch.entries){
|
|
223
|
+
const record = entry.record;
|
|
224
|
+
const result = this.createResult(record.id, record.label, record.frameId, 0n, 0n, 'failed', record.autoClosed, message);
|
|
225
|
+
record.status = 'failed';
|
|
226
|
+
record.result = result;
|
|
227
|
+
this.freeQueryPair(record.startIndex);
|
|
228
|
+
this.resolveWaiters(record);
|
|
229
|
+
this.pushResolvedResult(result);
|
|
230
|
+
}
|
|
231
|
+
batch.readbackBuffer.destroy();
|
|
232
|
+
batch.resolveBuffer.destroy();
|
|
233
|
+
}
|
|
234
|
+
freeQueryPair(startIndex) {
|
|
235
|
+
if (startIndex >= 0 && this._freeQueryPairs.indexOf(startIndex) < 0) {
|
|
236
|
+
this._freeQueryPairs.push(startIndex);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
resolveWaiters(record) {
|
|
240
|
+
for (const resolve of record.waiters.splice(0)){
|
|
241
|
+
resolve(record.result);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
pushResolvedResult(result) {
|
|
245
|
+
this._resolvedResults.push(result);
|
|
246
|
+
while(this._resolvedResults.length > MAX_RESOLVED_RESULT_HISTORY){
|
|
247
|
+
const oldResult = this._resolvedResults.shift();
|
|
248
|
+
if (oldResult) {
|
|
249
|
+
const oldRecord = this._records.get(oldResult.id);
|
|
250
|
+
if (oldRecord?.result === oldResult) {
|
|
251
|
+
this._records.delete(oldResult.id);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
reportInvalidEnd(id, message) {
|
|
257
|
+
const record = this._records.get(id);
|
|
258
|
+
if (record?.options.strict) {
|
|
259
|
+
throw new Error(message);
|
|
260
|
+
}
|
|
261
|
+
console.warn(message);
|
|
262
|
+
}
|
|
263
|
+
findRecord(query) {
|
|
264
|
+
if (typeof query === 'number') {
|
|
265
|
+
return this._records.get(query) ?? null;
|
|
266
|
+
}
|
|
267
|
+
let latest = null;
|
|
268
|
+
for (const record of this._records.values()){
|
|
269
|
+
if (record.label === query) {
|
|
270
|
+
latest = record;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return latest;
|
|
274
|
+
}
|
|
275
|
+
createUnsupportedResult(query) {
|
|
276
|
+
return this.createResult(typeof query === 'number' ? query : 0, typeof query === 'string' ? query : '', this._device.frameInfo.frameCounter, 0n, 0n, 'unsupported', false, 'GPU timestamp queries are not supported by this WebGPU device');
|
|
277
|
+
}
|
|
278
|
+
createInvalidResult(query, message) {
|
|
279
|
+
return this.createResult(typeof query === 'number' ? query : 0, typeof query === 'string' ? query : '', this._device.frameInfo.frameCounter, 0n, 0n, 'invalid', false, message);
|
|
280
|
+
}
|
|
281
|
+
createResult(id, label, frameId, start, end, status, autoClosed, message) {
|
|
282
|
+
return {
|
|
283
|
+
id,
|
|
284
|
+
label,
|
|
285
|
+
frameId,
|
|
286
|
+
durationMs: 0,
|
|
287
|
+
start,
|
|
288
|
+
end,
|
|
289
|
+
status,
|
|
290
|
+
autoClosed: autoClosed || undefined,
|
|
291
|
+
message
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { WebGPUTimestampQueryManager };
|
|
297
|
+
//# sourceMappingURL=timestamp_query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp_query.js","sources":["../src/timestamp_query.ts"],"sourcesContent":["import type { WebGPUDevice } from './device';\r\n\r\nconst TIMESTAMP_QUERY_COUNT = 4096;\r\nconst TIMESTAMP_BYTES_PER_QUERY = 8;\r\nconst TIMESTAMP_QUERIES_PER_SCOPE = 2;\r\nconst TIMESTAMP_RESOLVE_STRIDE = 256;\r\nconst MAX_RESOLVED_RESULT_HISTORY = 4096;\r\n\r\nexport type TimestampQueryStatus =\r\n | 'pending'\r\n | 'resolved'\r\n | 'unsupported'\r\n | 'invalid'\r\n | 'auto-closed'\r\n | 'exhausted'\r\n | 'failed';\r\n\r\nexport interface TimestampQueryOptions {\r\n includePendingUploads?: boolean;\r\n allowCrossFrame?: boolean;\r\n strict?: boolean;\r\n}\r\n\r\nexport type TimestampQueryHandle = number | string;\r\n\r\nexport interface TimestampQueryResult {\r\n id: number;\r\n label: string;\r\n frameId: number;\r\n durationMs: number;\r\n start: bigint;\r\n end: bigint;\r\n status: TimestampQueryStatus;\r\n autoClosed?: boolean;\r\n message?: string;\r\n}\r\n\r\nexport interface TimestampQueryFilter {\r\n label?: string;\r\n frameId?: number;\r\n}\r\n\r\ntype TimestampQueryInternalStatus = 'open' | 'ended' | 'resolving' | TimestampQueryStatus;\r\n\r\ntype TimestampQueryRecord = {\r\n id: number;\r\n label: string;\r\n frameId: number;\r\n options: Required<TimestampQueryOptions>;\r\n startIndex: number;\r\n endIndex: number;\r\n status: TimestampQueryInternalStatus;\r\n autoClosed: boolean;\r\n result: TimestampQueryResult | null;\r\n waiters: Array<(result: TimestampQueryResult) => void>;\r\n};\r\n\r\ntype TimestampResolveBatch = {\r\n entries: TimestampResolveEntry[];\r\n resolveBuffer: GPUBuffer;\r\n readbackBuffer: GPUBuffer;\r\n};\r\n\r\ntype TimestampResolveEntry = {\r\n record: TimestampQueryRecord;\r\n readbackOffset: number;\r\n};\r\n\r\nconst defaultTimestampQueryOptions: Required<TimestampQueryOptions> = {\r\n includePendingUploads: true,\r\n allowCrossFrame: false,\r\n strict: false\r\n};\r\n\r\nexport class WebGPUTimestampQueryManager {\r\n private readonly _device: WebGPUDevice;\r\n private readonly _supported: boolean;\r\n private readonly _querySet: GPUQuerySet | null;\r\n private readonly _freeQueryPairs: number[];\r\n private readonly _records: Map<number, TimestampQueryRecord>;\r\n private readonly _openRecords: Map<number, TimestampQueryRecord>;\r\n private readonly _endedRecords: TimestampQueryRecord[];\r\n private readonly _pendingSubmitBatches: TimestampResolveBatch[];\r\n private readonly _resolvedResults: TimestampQueryResult[];\r\n private _nextId: number;\r\n\r\n constructor(device: WebGPUDevice) {\r\n this._device = device;\r\n this._supported = device.device.features.has('timestamp-query');\r\n this._querySet = this._supported\r\n ? device.device.createQuerySet({\r\n type: 'timestamp',\r\n count: TIMESTAMP_QUERY_COUNT\r\n })\r\n : null;\r\n this._freeQueryPairs = [];\r\n for (let i = TIMESTAMP_QUERY_COUNT - 2; i >= 0; i -= 2) {\r\n this._freeQueryPairs.push(i);\r\n }\r\n this._records = new Map();\r\n this._openRecords = new Map();\r\n this._endedRecords = [];\r\n this._pendingSubmitBatches = [];\r\n this._resolvedResults = [];\r\n this._nextId = 0;\r\n }\r\n\r\n get supported() {\r\n return this._supported;\r\n }\r\n\r\n begin(label?: string, options?: TimestampQueryOptions): number {\r\n if (!this._supported || !this._querySet) {\r\n return 0;\r\n }\r\n const id = ++this._nextId;\r\n const resolvedOptions = { ...defaultTimestampQueryOptions, ...(options ?? {}) };\r\n const startIndex = this._freeQueryPairs.pop();\r\n if (startIndex === undefined) {\r\n const result = this.createResult(\r\n id,\r\n label ?? '',\r\n this._device.frameInfo.frameCounter,\r\n 0n,\r\n 0n,\r\n 'exhausted',\r\n false,\r\n 'GPU timestamp query pool exhausted'\r\n );\r\n this._records.set(id, {\r\n id,\r\n label: result.label,\r\n frameId: result.frameId,\r\n options: resolvedOptions,\r\n startIndex: -1,\r\n endIndex: -1,\r\n status: 'exhausted',\r\n autoClosed: false,\r\n result,\r\n waiters: []\r\n });\r\n this.pushResolvedResult(result);\r\n return id;\r\n }\r\n const record: TimestampQueryRecord = {\r\n id,\r\n label: label ?? '',\r\n frameId: this._device.frameInfo.frameCounter,\r\n options: resolvedOptions,\r\n startIndex,\r\n endIndex: startIndex + 1,\r\n status: 'open',\r\n autoClosed: false,\r\n result: null,\r\n waiters: []\r\n };\r\n this._records.set(id, record);\r\n this._openRecords.set(id, record);\r\n this._device.commandQueue.insertTimestampMarker(\r\n this._querySet,\r\n record.startIndex,\r\n record.options.includePendingUploads\r\n );\r\n return id;\r\n }\r\n\r\n end(id: number): void {\r\n if (!this._supported) {\r\n return;\r\n }\r\n const record = this._records.get(id);\r\n if (!record) {\r\n this.reportInvalidEnd(id, 'endTimestampQuery() ignored: invalid query id');\r\n return;\r\n }\r\n if (record.status !== 'open') {\r\n if (record.status !== 'exhausted' && record.status !== 'unsupported') {\r\n this.reportInvalidEnd(id, 'endTimestampQuery() ignored: query is not open');\r\n }\r\n return;\r\n }\r\n this.endRecord(record, false);\r\n }\r\n\r\n autoCloseOpenScopes(): void {\r\n for (const record of Array.from(this._openRecords.values())) {\r\n if (!record.options.allowCrossFrame) {\r\n this.endRecord(record, true);\r\n }\r\n }\r\n }\r\n\r\n createResolveCommandBuffer(): GPUCommandBuffer | null {\r\n if (!this._querySet || this._endedRecords.length === 0) {\r\n return null;\r\n }\r\n const records = this._endedRecords.splice(0);\r\n const entries = records.map((record, index) => {\r\n record.status = 'resolving';\r\n return {\r\n record,\r\n readbackOffset: index * TIMESTAMP_RESOLVE_STRIDE\r\n };\r\n });\r\n const byteLength = entries.length * TIMESTAMP_RESOLVE_STRIDE;\r\n const resolveBuffer = this._device.device.createBuffer({\r\n label: 'timestamp-query-resolve',\r\n size: byteLength,\r\n usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\r\n });\r\n const readbackBuffer = this._device.device.createBuffer({\r\n label: 'timestamp-query-readback',\r\n size: byteLength,\r\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\r\n });\r\n const encoder = this._device.device.createCommandEncoder({ label: 'timestamp-query-resolve' });\r\n for (const entry of entries) {\r\n encoder.resolveQuerySet(\r\n this._querySet,\r\n entry.record.startIndex,\r\n TIMESTAMP_QUERIES_PER_SCOPE,\r\n resolveBuffer,\r\n entry.readbackOffset\r\n );\r\n }\r\n encoder.copyBufferToBuffer(resolveBuffer, 0, readbackBuffer, 0, byteLength);\r\n this._pendingSubmitBatches.push({\r\n entries,\r\n resolveBuffer,\r\n readbackBuffer\r\n });\r\n return encoder.finish();\r\n }\r\n\r\n onSubmitted(): void {\r\n const batches = this._pendingSubmitBatches.splice(0);\r\n for (const batch of batches) {\r\n batch.readbackBuffer\r\n .mapAsync(GPUMapMode.READ)\r\n .then(() => {\r\n this.completeBatch(batch);\r\n })\r\n .catch((err) => {\r\n this.failBatch(batch, err instanceof Error ? err.message : String(err));\r\n });\r\n }\r\n }\r\n\r\n poll(query: TimestampQueryHandle): TimestampQueryResult | null {\r\n if (!this._supported) {\r\n return this.createUnsupportedResult(query);\r\n }\r\n const record = this.findRecord(query);\r\n if (!record) {\r\n return this.createInvalidResult(query, 'Timestamp query not found');\r\n }\r\n return record.result;\r\n }\r\n\r\n resolve(query: TimestampQueryHandle): Promise<TimestampQueryResult> {\r\n if (!this._supported) {\r\n return Promise.resolve(this.createUnsupportedResult(query));\r\n }\r\n const record = this.findRecord(query);\r\n if (!record) {\r\n return Promise.resolve(this.createInvalidResult(query, 'Timestamp query not found'));\r\n }\r\n if (record.result) {\r\n return Promise.resolve(record.result);\r\n }\r\n return new Promise<TimestampQueryResult>((resolve) => {\r\n record.waiters.push(resolve);\r\n });\r\n }\r\n\r\n collect(filter?: TimestampQueryFilter): TimestampQueryResult[] {\r\n return this._resolvedResults.filter((result) => {\r\n return (\r\n (filter?.label === undefined || result.label === filter.label) &&\r\n (filter?.frameId === undefined || result.frameId === filter.frameId)\r\n );\r\n });\r\n }\r\n\r\n private endRecord(record: TimestampQueryRecord, autoClosed: boolean): void {\r\n if (!this._querySet) {\r\n return;\r\n }\r\n record.autoClosed = autoClosed;\r\n this._openRecords.delete(record.id);\r\n this._device.commandQueue.insertTimestampMarker(\r\n this._querySet,\r\n record.endIndex,\r\n record.options.includePendingUploads\r\n );\r\n record.status = 'ended';\r\n this._endedRecords.push(record);\r\n if (autoClosed) {\r\n console.warn(`GPU timestamp query '${record.label}' was automatically closed at frame end`);\r\n }\r\n }\r\n\r\n private completeBatch(batch: TimestampResolveBatch): void {\r\n const values = new BigUint64Array(batch.readbackBuffer.getMappedRange());\r\n for (const entry of batch.entries) {\r\n const record = entry.record;\r\n const valueOffset = entry.readbackOffset / TIMESTAMP_BYTES_PER_QUERY;\r\n const start = values[valueOffset];\r\n const end = values[valueOffset + 1];\r\n const duration = end >= start ? end - start : 0n;\r\n const result = this.createResult(\r\n record.id,\r\n record.label,\r\n record.frameId,\r\n start,\r\n end,\r\n record.autoClosed ? 'auto-closed' : 'resolved',\r\n record.autoClosed\r\n );\r\n result.durationMs = Number(duration) / 1000000;\r\n record.status = result.status;\r\n record.result = result;\r\n this.freeQueryPair(record.startIndex);\r\n this.resolveWaiters(record);\r\n this.pushResolvedResult(result);\r\n }\r\n batch.readbackBuffer.unmap();\r\n batch.readbackBuffer.destroy();\r\n batch.resolveBuffer.destroy();\r\n }\r\n\r\n private failBatch(batch: TimestampResolveBatch, message: string): void {\r\n for (const entry of batch.entries) {\r\n const record = entry.record;\r\n const result = this.createResult(\r\n record.id,\r\n record.label,\r\n record.frameId,\r\n 0n,\r\n 0n,\r\n 'failed',\r\n record.autoClosed,\r\n message\r\n );\r\n record.status = 'failed';\r\n record.result = result;\r\n this.freeQueryPair(record.startIndex);\r\n this.resolveWaiters(record);\r\n this.pushResolvedResult(result);\r\n }\r\n batch.readbackBuffer.destroy();\r\n batch.resolveBuffer.destroy();\r\n }\r\n\r\n private freeQueryPair(startIndex: number): void {\r\n if (startIndex >= 0 && this._freeQueryPairs.indexOf(startIndex) < 0) {\r\n this._freeQueryPairs.push(startIndex);\r\n }\r\n }\r\n\r\n private resolveWaiters(record: TimestampQueryRecord): void {\r\n for (const resolve of record.waiters.splice(0)) {\r\n resolve(record.result!);\r\n }\r\n }\r\n\r\n private pushResolvedResult(result: TimestampQueryResult): void {\r\n this._resolvedResults.push(result);\r\n while (this._resolvedResults.length > MAX_RESOLVED_RESULT_HISTORY) {\r\n const oldResult = this._resolvedResults.shift();\r\n if (oldResult) {\r\n const oldRecord = this._records.get(oldResult.id);\r\n if (oldRecord?.result === oldResult) {\r\n this._records.delete(oldResult.id);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private reportInvalidEnd(id: number, message: string): void {\r\n const record = this._records.get(id);\r\n if (record?.options.strict) {\r\n throw new Error(message);\r\n }\r\n console.warn(message);\r\n }\r\n\r\n private findRecord(query: TimestampQueryHandle): TimestampQueryRecord | null {\r\n if (typeof query === 'number') {\r\n return this._records.get(query) ?? null;\r\n }\r\n let latest: TimestampQueryRecord | null = null;\r\n for (const record of this._records.values()) {\r\n if (record.label === query) {\r\n latest = record;\r\n }\r\n }\r\n return latest;\r\n }\r\n\r\n private createUnsupportedResult(query: TimestampQueryHandle): TimestampQueryResult {\r\n return this.createResult(\r\n typeof query === 'number' ? query : 0,\r\n typeof query === 'string' ? query : '',\r\n this._device.frameInfo.frameCounter,\r\n 0n,\r\n 0n,\r\n 'unsupported',\r\n false,\r\n 'GPU timestamp queries are not supported by this WebGPU device'\r\n );\r\n }\r\n\r\n private createInvalidResult(query: TimestampQueryHandle, message: string): TimestampQueryResult {\r\n return this.createResult(\r\n typeof query === 'number' ? query : 0,\r\n typeof query === 'string' ? query : '',\r\n this._device.frameInfo.frameCounter,\r\n 0n,\r\n 0n,\r\n 'invalid',\r\n false,\r\n message\r\n );\r\n }\r\n\r\n private createResult(\r\n id: number,\r\n label: string,\r\n frameId: number,\r\n start: bigint,\r\n end: bigint,\r\n status: TimestampQueryStatus,\r\n autoClosed: boolean,\r\n message?: string\r\n ): TimestampQueryResult {\r\n return {\r\n id,\r\n label,\r\n frameId,\r\n durationMs: 0,\r\n start,\r\n end,\r\n status,\r\n autoClosed: autoClosed || undefined,\r\n message\r\n };\r\n }\r\n}\r\n"],"names":["TIMESTAMP_QUERY_COUNT","TIMESTAMP_BYTES_PER_QUERY","TIMESTAMP_QUERIES_PER_SCOPE","TIMESTAMP_RESOLVE_STRIDE","MAX_RESOLVED_RESULT_HISTORY","defaultTimestampQueryOptions","includePendingUploads","allowCrossFrame","strict","WebGPUTimestampQueryManager","_device","_supported","_querySet","_freeQueryPairs","_records","_openRecords","_endedRecords","_pendingSubmitBatches","_resolvedResults","_nextId","device","features","has","createQuerySet","type","count","i","push","Map","supported","begin","label","options","id","resolvedOptions","startIndex","pop","undefined","result","createResult","frameInfo","frameCounter","set","frameId","endIndex","status","autoClosed","waiters","pushResolvedResult","record","commandQueue","insertTimestampMarker","end","get","reportInvalidEnd","endRecord","autoCloseOpenScopes","Array","from","values","createResolveCommandBuffer","length","records","splice","entries","map","index","readbackOffset","byteLength","resolveBuffer","createBuffer","size","usage","GPUBufferUsage","QUERY_RESOLVE","COPY_SRC","readbackBuffer","COPY_DST","MAP_READ","encoder","createCommandEncoder","entry","resolveQuerySet","copyBufferToBuffer","finish","onSubmitted","batches","batch","mapAsync","GPUMapMode","READ","then","completeBatch","catch","err","failBatch","Error","message","String","poll","query","createUnsupportedResult","findRecord","createInvalidResult","resolve","Promise","collect","filter","delete","console","warn","BigUint64Array","getMappedRange","valueOffset","start","duration","durationMs","Number","freeQueryPair","resolveWaiters","unmap","destroy","indexOf","oldResult","shift","oldRecord","latest"],"mappings":"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"}
|