@flighthq/render-wgpu 0.5.1-next.920.da8f530 → 0.6.0
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 +2 -2
- package/dist/.tsbuildinfo.compressed-texture-decoder-contract +1 -0
- package/dist/.tsbuildinfo.contract +1 -0
- package/dist/.tsbuildinfo.runtime +1 -0
- package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.d.ts +3 -0
- package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.d.ts.map +1 -0
- package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.js +2 -0
- package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.js.map +1 -0
- package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.d.ts +2 -0
- package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.d.ts.map +1 -0
- package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.js +2 -0
- package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.js.map +1 -0
- package/dist/contract.d.ts +32 -34
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +32 -34
- package/dist/contract.js.map +1 -1
- package/dist/contract.render-wgpu-types.d.ts +55 -0
- package/dist/contract.render-wgpu-types.d.ts.map +1 -0
- package/dist/contract.render-wgpu-types.js +5 -0
- package/dist/contract.render-wgpu-types.js.map +1 -0
- package/dist/enableWgpuTextureResolverGuards.d.ts +3 -2
- package/dist/enableWgpuTextureResolverGuards.d.ts.map +1 -1
- package/dist/enableWgpuTextureResolverGuards.js +12 -9
- package/dist/enableWgpuTextureResolverGuards.js.map +1 -1
- package/dist/explainWgpuTextureResolution.d.ts +2 -1
- package/dist/explainWgpuTextureResolution.d.ts.map +1 -1
- package/dist/explainWgpuTextureResolution.js +2 -5
- package/dist/explainWgpuTextureResolution.js.map +1 -1
- package/dist/explainWgpuUniformEndianness.d.ts +3 -0
- package/dist/explainWgpuUniformEndianness.d.ts.map +1 -0
- package/dist/explainWgpuUniformEndianness.js +25 -0
- package/dist/explainWgpuUniformEndianness.js.map +1 -0
- package/dist/index.d.ts +20 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/types/Host.d.ts +5 -0
- package/dist/types/Host.d.ts.map +1 -0
- package/dist/types/Host.js +2 -0
- package/dist/types/Host.js.map +1 -0
- package/dist/types/WgpuAdapter.d.ts +14 -0
- package/dist/types/WgpuAdapter.d.ts.map +1 -0
- package/dist/types/WgpuAdapter.js +2 -0
- package/dist/types/WgpuAdapter.js.map +1 -0
- package/dist/types/WgpuAdapterCapabilities.d.ts +7 -0
- package/dist/types/WgpuAdapterCapabilities.d.ts.map +1 -0
- package/dist/types/WgpuAdapterCapabilities.js +2 -0
- package/dist/types/WgpuAdapterCapabilities.js.map +1 -0
- package/dist/types/WgpuBindGroup.d.ts +23 -0
- package/dist/types/WgpuBindGroup.d.ts.map +1 -0
- package/dist/types/WgpuBindGroup.js +2 -0
- package/dist/types/WgpuBindGroup.js.map +1 -0
- package/dist/types/WgpuBindGroupLayout.d.ts +45 -0
- package/dist/types/WgpuBindGroupLayout.d.ts.map +1 -0
- package/dist/types/WgpuBindGroupLayout.js +7 -0
- package/dist/types/WgpuBindGroupLayout.js.map +1 -0
- package/dist/types/WgpuBuffer.d.ts +34 -0
- package/dist/types/WgpuBuffer.d.ts.map +1 -0
- package/dist/types/WgpuBuffer.js +19 -0
- package/dist/types/WgpuBuffer.js.map +1 -0
- package/dist/types/WgpuCanvasContext.d.ts +17 -0
- package/dist/types/WgpuCanvasContext.d.ts.map +1 -0
- package/dist/types/WgpuCanvasContext.js +2 -0
- package/dist/types/WgpuCanvasContext.js.map +1 -0
- package/dist/types/WgpuColorAdjustmentMaterialFeature.d.ts +14 -0
- package/dist/types/WgpuColorAdjustmentMaterialFeature.d.ts.map +1 -0
- package/dist/types/WgpuColorAdjustmentMaterialFeature.js +2 -0
- package/dist/types/WgpuColorAdjustmentMaterialFeature.js.map +1 -0
- package/dist/types/WgpuCommandBuffer.d.ts +5 -0
- package/dist/types/WgpuCommandBuffer.d.ts.map +1 -0
- package/dist/types/WgpuCommandBuffer.js +2 -0
- package/dist/types/WgpuCommandBuffer.js.map +1 -0
- package/dist/types/WgpuCommandEncoder.d.ts +12 -0
- package/dist/types/WgpuCommandEncoder.d.ts.map +1 -0
- package/dist/types/WgpuCommandEncoder.js +2 -0
- package/dist/types/WgpuCommandEncoder.js.map +1 -0
- package/dist/types/WgpuCompressedTextureSupport.d.ts +6 -0
- package/dist/types/WgpuCompressedTextureSupport.d.ts.map +1 -0
- package/dist/types/WgpuCompressedTextureSupport.js +2 -0
- package/dist/types/WgpuCompressedTextureSupport.js.map +1 -0
- package/dist/types/WgpuCompressedTextureUploader.d.ts +6 -0
- package/dist/types/WgpuCompressedTextureUploader.d.ts.map +1 -0
- package/dist/types/WgpuCompressedTextureUploader.js +2 -0
- package/dist/types/WgpuCompressedTextureUploader.js.map +1 -0
- package/dist/types/WgpuCustomMaterialShaderSource.d.ts +2 -0
- package/dist/types/WgpuCustomMaterialShaderSource.d.ts.map +1 -0
- package/dist/types/WgpuCustomMaterialShaderSource.js +2 -0
- package/dist/types/WgpuCustomMaterialShaderSource.js.map +1 -0
- package/dist/types/WgpuDevice.d.ts +76 -0
- package/dist/types/WgpuDevice.d.ts.map +1 -0
- package/dist/types/WgpuDevice.js +2 -0
- package/dist/types/WgpuDevice.js.map +1 -0
- package/dist/types/WgpuDeviceRuntime.d.ts +53 -0
- package/dist/types/WgpuDeviceRuntime.d.ts.map +1 -0
- package/dist/types/WgpuDeviceRuntime.js +2 -0
- package/dist/types/WgpuDeviceRuntime.js.map +1 -0
- package/dist/types/WgpuDeviceSignals.d.ts +6 -0
- package/dist/types/WgpuDeviceSignals.d.ts.map +1 -0
- package/dist/types/WgpuDeviceSignals.js +2 -0
- package/dist/types/WgpuDeviceSignals.js.map +1 -0
- package/dist/types/WgpuDeviceState.d.ts +7 -0
- package/dist/types/WgpuDeviceState.d.ts.map +1 -0
- package/dist/types/WgpuDeviceState.js +2 -0
- package/dist/types/WgpuDeviceState.js.map +1 -0
- package/dist/types/WgpuEffectState.d.ts +19 -0
- package/dist/types/WgpuEffectState.d.ts.map +1 -0
- package/dist/types/WgpuEffectState.js +2 -0
- package/dist/types/WgpuEffectState.js.map +1 -0
- package/dist/types/WgpuExternalImageSource.d.ts +18 -0
- package/dist/types/WgpuExternalImageSource.d.ts.map +1 -0
- package/dist/types/WgpuExternalImageSource.js +2 -0
- package/dist/types/WgpuExternalImageSource.js.map +1 -0
- package/dist/types/WgpuFullscreenPipeline.d.ts +14 -0
- package/dist/types/WgpuFullscreenPipeline.d.ts.map +1 -0
- package/dist/types/WgpuFullscreenPipeline.js +2 -0
- package/dist/types/WgpuFullscreenPipeline.js.map +1 -0
- package/dist/types/WgpuGpu.d.ts +7 -0
- package/dist/types/WgpuGpu.d.ts.map +1 -0
- package/dist/types/WgpuGpu.js +2 -0
- package/dist/types/WgpuGpu.js.map +1 -0
- package/dist/types/WgpuHost.d.ts +44 -0
- package/dist/types/WgpuHost.d.ts.map +1 -0
- package/dist/types/WgpuHost.js +2 -0
- package/dist/types/WgpuHost.js.map +1 -0
- package/dist/types/WgpuMeshMaterialRenderer.d.ts +11 -0
- package/dist/types/WgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/types/WgpuMeshMaterialRenderer.js +2 -0
- package/dist/types/WgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/types/WgpuModifierSnippet.d.ts +16 -0
- package/dist/types/WgpuModifierSnippet.d.ts.map +1 -0
- package/dist/types/WgpuModifierSnippet.js +2 -0
- package/dist/types/WgpuModifierSnippet.js.map +1 -0
- package/dist/types/WgpuParticleResources.d.ts +12 -0
- package/dist/types/WgpuParticleResources.d.ts.map +1 -0
- package/dist/types/WgpuParticleResources.js +2 -0
- package/dist/types/WgpuParticleResources.js.map +1 -0
- package/dist/types/WgpuPipelineLayout.d.ts +8 -0
- package/dist/types/WgpuPipelineLayout.d.ts.map +1 -0
- package/dist/types/WgpuPipelineLayout.js +2 -0
- package/dist/types/WgpuPipelineLayout.js.map +1 -0
- package/dist/types/WgpuQuadBatchResources.d.ts +12 -0
- package/dist/types/WgpuQuadBatchResources.d.ts.map +1 -0
- package/dist/types/WgpuQuadBatchResources.js +2 -0
- package/dist/types/WgpuQuadBatchResources.js.map +1 -0
- package/dist/types/WgpuQuadMaterialRenderer.d.ts +9 -0
- package/dist/types/WgpuQuadMaterialRenderer.d.ts.map +1 -0
- package/dist/types/WgpuQuadMaterialRenderer.js +2 -0
- package/dist/types/WgpuQuadMaterialRenderer.js.map +1 -0
- package/dist/types/WgpuQueue.d.ts +12 -0
- package/dist/types/WgpuQueue.d.ts.map +1 -0
- package/dist/types/WgpuQueue.js +2 -0
- package/dist/types/WgpuQueue.js.map +1 -0
- package/dist/types/WgpuRenderOptions.d.ts +14 -0
- package/dist/types/WgpuRenderOptions.d.ts.map +1 -0
- package/dist/types/WgpuRenderOptions.js +2 -0
- package/dist/types/WgpuRenderOptions.js.map +1 -0
- package/dist/types/WgpuRenderPass.d.ts +31 -0
- package/dist/types/WgpuRenderPass.d.ts.map +1 -0
- package/dist/types/WgpuRenderPass.js +2 -0
- package/dist/types/WgpuRenderPass.js.map +1 -0
- package/dist/types/WgpuRenderPassEncoder.d.ts +52 -0
- package/dist/types/WgpuRenderPassEncoder.d.ts.map +1 -0
- package/dist/types/WgpuRenderPassEncoder.js +2 -0
- package/dist/types/WgpuRenderPassEncoder.js.map +1 -0
- package/dist/types/WgpuRenderPipeline.d.ts +96 -0
- package/dist/types/WgpuRenderPipeline.d.ts.map +1 -0
- package/dist/types/WgpuRenderPipeline.js +9 -0
- package/dist/types/WgpuRenderPipeline.js.map +1 -0
- package/dist/types/WgpuRenderState.d.ts +249 -0
- package/dist/types/WgpuRenderState.d.ts.map +1 -0
- package/dist/types/WgpuRenderState.js +2 -0
- package/dist/types/WgpuRenderState.js.map +1 -0
- package/dist/types/WgpuRenderStateOptions.d.ts +31 -0
- package/dist/types/WgpuRenderStateOptions.d.ts.map +1 -0
- package/dist/types/WgpuRenderStateOptions.js +2 -0
- package/dist/types/WgpuRenderStateOptions.js.map +1 -0
- package/dist/types/WgpuRenderTarget.d.ts +62 -0
- package/dist/types/WgpuRenderTarget.d.ts.map +1 -0
- package/dist/types/WgpuRenderTarget.js +2 -0
- package/dist/types/WgpuRenderTarget.js.map +1 -0
- package/dist/types/WgpuRenderTexture.d.ts +25 -0
- package/dist/types/WgpuRenderTexture.d.ts.map +1 -0
- package/dist/types/WgpuRenderTexture.js +2 -0
- package/dist/types/WgpuRenderTexture.js.map +1 -0
- package/dist/types/WgpuSampler.d.ts +19 -0
- package/dist/types/WgpuSampler.d.ts.map +1 -0
- package/dist/types/WgpuSampler.js +2 -0
- package/dist/types/WgpuSampler.js.map +1 -0
- package/dist/types/WgpuScene3DRuntime.d.ts +6 -0
- package/dist/types/WgpuScene3DRuntime.d.ts.map +1 -0
- package/dist/types/WgpuScene3DRuntime.js +2 -0
- package/dist/types/WgpuScene3DRuntime.js.map +1 -0
- package/dist/types/WgpuShaderModule.d.ts +6 -0
- package/dist/types/WgpuShaderModule.d.ts.map +1 -0
- package/dist/types/WgpuShaderModule.js +2 -0
- package/dist/types/WgpuShaderModule.js.map +1 -0
- package/dist/types/WgpuShapeMesh.d.ts +7 -0
- package/dist/types/WgpuShapeMesh.d.ts.map +1 -0
- package/dist/types/WgpuShapeMesh.js +2 -0
- package/dist/types/WgpuShapeMesh.js.map +1 -0
- package/dist/types/WgpuSkinningAdapter.d.ts +18 -0
- package/dist/types/WgpuSkinningAdapter.d.ts.map +1 -0
- package/dist/types/WgpuSkinningAdapter.js +2 -0
- package/dist/types/WgpuSkinningAdapter.js.map +1 -0
- package/dist/types/WgpuSurface.d.ts +5 -0
- package/dist/types/WgpuSurface.d.ts.map +1 -0
- package/dist/types/WgpuSurface.js +2 -0
- package/dist/types/WgpuSurface.js.map +1 -0
- package/dist/types/WgpuTexture.d.ts +58 -0
- package/dist/types/WgpuTexture.d.ts.map +1 -0
- package/dist/types/WgpuTexture.js +9 -0
- package/dist/types/WgpuTexture.js.map +1 -0
- package/dist/types/WgpuTextureFormat.d.ts +2 -0
- package/dist/types/WgpuTextureFormat.d.ts.map +1 -0
- package/dist/types/WgpuTextureFormat.js +2 -0
- package/dist/types/WgpuTextureFormat.js.map +1 -0
- package/dist/types/WgpuTextureResolver.d.ts +4 -0
- package/dist/types/WgpuTextureResolver.d.ts.map +1 -0
- package/dist/types/WgpuTextureResolver.js +2 -0
- package/dist/types/WgpuTextureResolver.js.map +1 -0
- package/dist/types/WgpuTextureView.d.ts +16 -0
- package/dist/types/WgpuTextureView.d.ts.map +1 -0
- package/dist/types/WgpuTextureView.js +2 -0
- package/dist/types/WgpuTextureView.js.map +1 -0
- package/dist/types/WgpuUniformEndianness.d.ts +7 -0
- package/dist/types/WgpuUniformEndianness.d.ts.map +1 -0
- package/dist/types/WgpuUniformEndianness.js +2 -0
- package/dist/types/WgpuUniformEndianness.js.map +1 -0
- package/dist/types/WgpuVelocityWriter.d.ts +11 -0
- package/dist/types/WgpuVelocityWriter.d.ts.map +1 -0
- package/dist/types/WgpuVelocityWriter.js +2 -0
- package/dist/types/WgpuVelocityWriter.js.map +1 -0
- package/dist/wgpuAdapterCapabilities.d.ts +2 -2
- package/dist/wgpuAdapterCapabilities.d.ts.map +1 -1
- package/dist/wgpuAdapterCapabilities.js.map +1 -1
- package/dist/wgpuCompressedTexture.d.ts +7 -5
- package/dist/wgpuCompressedTexture.d.ts.map +1 -1
- package/dist/wgpuCompressedTexture.js +10 -18
- package/dist/wgpuCompressedTexture.js.map +1 -1
- package/dist/wgpuDeviceLoss.d.ts +2 -2
- package/dist/wgpuDeviceLoss.d.ts.map +1 -1
- package/dist/wgpuDeviceLoss.js +1 -1
- package/dist/wgpuDeviceLoss.js.map +1 -1
- package/dist/wgpuDraw.d.ts +11 -5
- package/dist/wgpuDraw.d.ts.map +1 -1
- package/dist/wgpuDraw.js +21 -20
- package/dist/wgpuDraw.js.map +1 -1
- package/dist/wgpuExternalImageSource.d.ts +3 -2
- package/dist/wgpuExternalImageSource.d.ts.map +1 -1
- package/dist/wgpuExternalImageSource.js.map +1 -1
- package/dist/wgpuExternalTexture.d.ts +7 -3
- package/dist/wgpuExternalTexture.d.ts.map +1 -1
- package/dist/wgpuExternalTexture.js +5 -5
- package/dist/wgpuExternalTexture.js.map +1 -1
- package/dist/wgpuFrame.d.ts +23 -0
- package/dist/wgpuFrame.d.ts.map +1 -0
- package/dist/{wgpuBackground.js → wgpuFrame.js} +67 -122
- package/dist/wgpuFrame.js.map +1 -0
- package/dist/wgpuFullscreenPass.d.ts +5 -4
- package/dist/wgpuFullscreenPass.d.ts.map +1 -1
- package/dist/wgpuFullscreenPass.js +29 -16
- package/dist/wgpuFullscreenPass.js.map +1 -1
- package/dist/wgpuHost.d.ts +4 -7
- package/dist/wgpuHost.d.ts.map +1 -1
- package/dist/wgpuHost.js +81 -70
- package/dist/wgpuHost.js.map +1 -1
- package/dist/wgpuMipmap.d.ts +2 -2
- package/dist/wgpuMipmap.d.ts.map +1 -1
- package/dist/wgpuMipmap.js +4 -3
- package/dist/wgpuMipmap.js.map +1 -1
- package/dist/wgpuQuadMaterialRegistry.d.ts +7 -0
- package/dist/wgpuQuadMaterialRegistry.d.ts.map +1 -0
- package/dist/wgpuQuadMaterialRegistry.js +33 -0
- package/dist/wgpuQuadMaterialRegistry.js.map +1 -0
- package/dist/wgpuRenderPass.d.ts +9 -0
- package/dist/wgpuRenderPass.d.ts.map +1 -0
- package/dist/wgpuRenderPass.js +210 -0
- package/dist/wgpuRenderPass.js.map +1 -0
- package/dist/wgpuRenderState.d.ts +16 -12
- package/dist/wgpuRenderState.d.ts.map +1 -1
- package/dist/wgpuRenderState.js +104 -149
- package/dist/wgpuRenderState.js.map +1 -1
- package/dist/wgpuRenderTarget.d.ts +13 -29
- package/dist/wgpuRenderTarget.d.ts.map +1 -1
- package/dist/wgpuRenderTarget.js +20 -253
- package/dist/wgpuRenderTarget.js.map +1 -1
- package/dist/wgpuRenderTargetPool.d.ts +8 -6
- package/dist/wgpuRenderTargetPool.d.ts.map +1 -1
- package/dist/wgpuRenderTargetPool.js +9 -9
- package/dist/wgpuRenderTargetPool.js.map +1 -1
- package/dist/wgpuRenderTexture.d.ts +7 -4
- package/dist/wgpuRenderTexture.d.ts.map +1 -1
- package/dist/wgpuRenderTexture.js +15 -17
- package/dist/wgpuRenderTexture.js.map +1 -1
- package/dist/wgpuRenderTexturePool.d.ts +3 -1
- package/dist/wgpuRenderTexturePool.d.ts.map +1 -1
- package/dist/wgpuRenderTexturePool.js +5 -7
- package/dist/wgpuRenderTexturePool.js.map +1 -1
- package/dist/wgpuScissor.d.ts +3 -3
- package/dist/wgpuScissor.d.ts.map +1 -1
- package/dist/wgpuScissor.js +8 -5
- package/dist/wgpuScissor.js.map +1 -1
- package/dist/wgpuScreenAntialias.d.ts +3 -0
- package/dist/wgpuScreenAntialias.d.ts.map +1 -0
- package/dist/wgpuScreenAntialias.js +120 -0
- package/dist/wgpuScreenAntialias.js.map +1 -0
- package/dist/wgpuScreenCapture.d.ts +6 -0
- package/dist/wgpuScreenCapture.d.ts.map +1 -0
- package/dist/wgpuScreenCapture.js +138 -0
- package/dist/wgpuScreenCapture.js.map +1 -0
- package/dist/wgpuScreenRenderTarget.d.ts +11 -0
- package/dist/wgpuScreenRenderTarget.d.ts.map +1 -0
- package/dist/wgpuScreenRenderTarget.js +121 -0
- package/dist/wgpuScreenRenderTarget.js.map +1 -0
- package/dist/wgpuShader.d.ts +11 -8
- package/dist/wgpuShader.d.ts.map +1 -1
- package/dist/wgpuShader.js +11 -10
- package/dist/wgpuShader.js.map +1 -1
- package/dist/wgpuShaderBinding.d.ts +3 -1
- package/dist/wgpuShaderBinding.d.ts.map +1 -1
- package/dist/wgpuShaderBinding.js +1 -1
- package/dist/wgpuShaderBinding.js.map +1 -1
- package/dist/wgpuShaderRegistry.d.ts +1 -1
- package/dist/wgpuShaderRegistry.d.ts.map +1 -1
- package/dist/wgpuShaderRegistry.js +1 -1
- package/dist/wgpuShaderRegistry.js.map +1 -1
- package/dist/wgpuTestHelper.d.ts +11 -2
- package/dist/wgpuTestHelper.d.ts.map +1 -1
- package/dist/wgpuTestHelper.js +50 -38
- package/dist/wgpuTestHelper.js.map +1 -1
- package/dist/wgpuTextureRenderTarget.d.ts +22 -0
- package/dist/wgpuTextureRenderTarget.d.ts.map +1 -0
- package/dist/wgpuTextureRenderTarget.js +123 -0
- package/dist/wgpuTextureRenderTarget.js.map +1 -0
- package/dist/wgpuTextureResolver.d.ts +5 -1
- package/dist/wgpuTextureResolver.d.ts.map +1 -1
- package/dist/wgpuTextureResolver.js +13 -12
- package/dist/wgpuTextureResolver.js.map +1 -1
- package/dist/wgpuTextureUpload.d.ts +5 -4
- package/dist/wgpuTextureUpload.d.ts.map +1 -1
- package/dist/wgpuTextureUpload.js +1 -1
- package/dist/wgpuTextureUpload.js.map +1 -1
- package/package.json +33 -13
- package/src/enableWgpuTextureResolverGuards.test.ts +40 -19
- package/src/explainWgpuTextureResolution.test.ts +6 -6
- package/src/explainWgpuUniformEndianness.test.ts +11 -0
- package/src/types/WgpuBindGroupLayout.test.ts +9 -0
- package/src/types/WgpuBuffer.test.ts +26 -0
- package/src/types/WgpuGpu.test.ts +56 -0
- package/src/types/WgpuRenderPipeline.test.ts +12 -0
- package/src/types/WgpuTexture.test.ts +15 -0
- package/src/wgpuAdapterCapabilities.test.ts +5 -4
- package/src/wgpuCompressedTexture.test.ts +31 -37
- package/src/wgpuDeviceLoss.test.ts +31 -24
- package/src/wgpuDraw.test.ts +21 -24
- package/src/wgpuExternalImageSource.test.ts +12 -11
- package/src/wgpuExternalTexture.test.ts +7 -6
- package/src/{wgpuBackground.test.ts → wgpuFrame.test.ts} +47 -29
- package/src/wgpuFullscreenPass.test.ts +10 -10
- package/src/wgpuHost.test.ts +57 -186
- package/src/wgpuMipmap.test.ts +15 -9
- package/src/wgpuQuadMaterialRegistry.test.ts +132 -0
- package/src/wgpuRenderPass.test.ts +239 -0
- package/src/wgpuRenderState.test.ts +215 -550
- package/src/wgpuRenderTarget.test.ts +44 -220
- package/src/wgpuRenderTargetPool.test.ts +23 -23
- package/src/wgpuRenderTexture.test.ts +21 -18
- package/src/wgpuRenderTexturePool.test.ts +3 -3
- package/src/wgpuScissor.test.ts +50 -19
- package/src/wgpuScreenAntialias.test.ts +65 -0
- package/src/wgpuScreenCapture.test.ts +165 -0
- package/src/wgpuScreenRenderTarget.test.ts +172 -0
- package/src/wgpuShader.test.ts +12 -11
- package/src/wgpuShaderBinding.test.ts +4 -4
- package/src/wgpuShaderRegistry.test.ts +4 -5
- package/src/wgpuTestHelper.test.ts +8 -7
- package/src/wgpuTextureRenderTarget.test.ts +129 -0
- package/src/wgpuTextureResolver.test.ts +25 -14
- package/src/wgpuTextureUpload.test.ts +15 -10
- package/dist/wgpuAntialias.d.ts +0 -14
- package/dist/wgpuAntialias.d.ts.map +0 -1
- package/dist/wgpuAntialias.js +0 -155
- package/dist/wgpuAntialias.js.map +0 -1
- package/dist/wgpuBackground.d.ts +0 -20
- package/dist/wgpuBackground.d.ts.map +0 -1
- package/dist/wgpuBackground.js.map +0 -1
- package/dist/wgpuElement.d.ts +0 -7
- package/dist/wgpuElement.d.ts.map +0 -1
- package/dist/wgpuElement.js +0 -20
- package/dist/wgpuElement.js.map +0 -1
- package/dist/wgpuMaterialRegistry.d.ts +0 -5
- package/dist/wgpuMaterialRegistry.d.ts.map +0 -1
- package/dist/wgpuMaterialRegistry.js +0 -32
- package/dist/wgpuMaterialRegistry.js.map +0 -1
- package/dist/wgpuPipeline.d.ts +0 -6
- package/dist/wgpuPipeline.d.ts.map +0 -1
- package/dist/wgpuPipeline.js +0 -33
- package/dist/wgpuPipeline.js.map +0 -1
- package/dist/wgpuSurface.d.ts +0 -6
- package/dist/wgpuSurface.d.ts.map +0 -1
- package/dist/wgpuSurface.js +0 -155
- package/dist/wgpuSurface.js.map +0 -1
- package/src/wgpuAntialias.test.ts +0 -239
- package/src/wgpuElement.test.ts +0 -145
- package/src/wgpuMaterialRegistry.test.ts +0 -100
- package/src/wgpuPipeline.test.ts +0 -62
- package/src/wgpuSurface.test.ts +0 -141
package/src/wgpuScissor.test.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { WgpuRenderPassEncoder } from './contract.render-wgpu-types.ts';
|
|
2
|
+
import { beginWgpuRenderPass, endWgpuRenderPass } from './wgpuRenderPass.ts';
|
|
3
|
+
import { getWgpuRenderStateRuntime } from './wgpuRenderState.ts';
|
|
3
4
|
import {
|
|
4
5
|
applyWgpuScissorRect,
|
|
5
6
|
popWgpuScissorRect,
|
|
6
7
|
pushWgpuScissorRect,
|
|
7
8
|
setWgpuRenderPassScissorRect,
|
|
8
|
-
} from './wgpuScissor';
|
|
9
|
-
import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
|
|
9
|
+
} from './wgpuScissor.ts';
|
|
10
|
+
import { beginWgpuScreenRenderPassForTest, createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper.ts';
|
|
11
|
+
import { createWgpuTextureRenderTarget } from './wgpuTextureRenderTarget.ts';
|
|
10
12
|
|
|
11
13
|
beforeAll(() => {
|
|
12
14
|
installWgpuMock();
|
|
@@ -15,11 +17,11 @@ beforeAll(() => {
|
|
|
15
17
|
describe('applyWgpuScissorRect', () => {
|
|
16
18
|
it('calls setScissorRect on the pass when a rect is active', async () => {
|
|
17
19
|
const state = await createWgpuRenderStateForTest();
|
|
18
|
-
|
|
20
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
19
21
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
20
22
|
runtime.currentScissorRect = { x: 10, y: 20, width: 100, height: 50 };
|
|
21
23
|
const calls: number[][] = [];
|
|
22
|
-
const fakePass = { setScissorRect: (...args: number[]) => calls.push(args) } as unknown as
|
|
24
|
+
const fakePass = { setScissorRect: (...args: number[]) => calls.push(args) } as unknown as WgpuRenderPassEncoder;
|
|
23
25
|
applyWgpuScissorRect(state, fakePass);
|
|
24
26
|
expect(calls.length).toBe(1);
|
|
25
27
|
expect(calls[0]).toEqual([10, 20, 100, 50]);
|
|
@@ -27,20 +29,20 @@ describe('applyWgpuScissorRect', () => {
|
|
|
27
29
|
|
|
28
30
|
it('is a no-op when currentScissorRect is null', async () => {
|
|
29
31
|
const state = await createWgpuRenderStateForTest();
|
|
30
|
-
|
|
32
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
31
33
|
const calls: number[][] = [];
|
|
32
|
-
const fakePass = { setScissorRect: (...args: number[]) => calls.push(args) } as unknown as
|
|
34
|
+
const fakePass = { setScissorRect: (...args: number[]) => calls.push(args) } as unknown as WgpuRenderPassEncoder;
|
|
33
35
|
applyWgpuScissorRect(state, fakePass);
|
|
34
36
|
expect(calls.length).toBe(0);
|
|
35
37
|
});
|
|
36
38
|
|
|
37
39
|
it('clamps dimensions to at least 1×1', async () => {
|
|
38
40
|
const state = await createWgpuRenderStateForTest();
|
|
39
|
-
|
|
41
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
40
42
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
41
43
|
runtime.currentScissorRect = { x: 0, y: 0, width: 0, height: 0 };
|
|
42
44
|
const calls: number[][] = [];
|
|
43
|
-
const fakePass = { setScissorRect: (...args: number[]) => calls.push(args) } as unknown as
|
|
45
|
+
const fakePass = { setScissorRect: (...args: number[]) => calls.push(args) } as unknown as WgpuRenderPassEncoder;
|
|
44
46
|
applyWgpuScissorRect(state, fakePass);
|
|
45
47
|
expect(calls[0]).toEqual([0, 0, 1, 1]);
|
|
46
48
|
});
|
|
@@ -49,14 +51,14 @@ describe('applyWgpuScissorRect', () => {
|
|
|
49
51
|
describe('popWgpuScissorRect', () => {
|
|
50
52
|
it('is a no-op when the stack is empty', async () => {
|
|
51
53
|
const state = await createWgpuRenderStateForTest();
|
|
52
|
-
|
|
54
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
53
55
|
expect(() => popWgpuScissorRect(state)).not.toThrow();
|
|
54
56
|
expect(getWgpuRenderStateRuntime(state).currentScissorRect).toBeNull();
|
|
55
57
|
});
|
|
56
58
|
|
|
57
59
|
it('restores the previous rect after a push/pop pair', async () => {
|
|
58
60
|
const state = await createWgpuRenderStateForTest();
|
|
59
|
-
|
|
61
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
60
62
|
const r1 = { x: 0, y: 0, width: 100, height: 100 };
|
|
61
63
|
const r2 = { x: 10, y: 10, width: 50, height: 50 };
|
|
62
64
|
pushWgpuScissorRect(state, r1);
|
|
@@ -72,7 +74,7 @@ describe('popWgpuScissorRect', () => {
|
|
|
72
74
|
describe('pushWgpuScissorRect', () => {
|
|
73
75
|
it('sets currentScissorRect on first push', async () => {
|
|
74
76
|
const state = await createWgpuRenderStateForTest();
|
|
75
|
-
|
|
77
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
76
78
|
const rect = { x: 5, y: 10, width: 80, height: 40 };
|
|
77
79
|
pushWgpuScissorRect(state, rect);
|
|
78
80
|
expect(getWgpuRenderStateRuntime(state).currentScissorRect).toEqual(rect);
|
|
@@ -80,7 +82,7 @@ describe('pushWgpuScissorRect', () => {
|
|
|
80
82
|
|
|
81
83
|
it('stacks previous rect when pushing a second rect', async () => {
|
|
82
84
|
const state = await createWgpuRenderStateForTest();
|
|
83
|
-
|
|
85
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
84
86
|
const r1 = { x: 0, y: 0, width: 100, height: 100 };
|
|
85
87
|
const r2 = { x: 20, y: 20, width: 60, height: 60 };
|
|
86
88
|
pushWgpuScissorRect(state, r1);
|
|
@@ -93,7 +95,7 @@ describe('pushWgpuScissorRect', () => {
|
|
|
93
95
|
|
|
94
96
|
it('copies the rect so mutation of the original does not affect the pushed value', async () => {
|
|
95
97
|
const state = await createWgpuRenderStateForTest();
|
|
96
|
-
|
|
98
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
97
99
|
const rect = { x: 0, y: 0, width: 50, height: 50 };
|
|
98
100
|
pushWgpuScissorRect(state, rect);
|
|
99
101
|
rect.width = 999;
|
|
@@ -102,13 +104,42 @@ describe('pushWgpuScissorRect', () => {
|
|
|
102
104
|
});
|
|
103
105
|
|
|
104
106
|
describe('setWgpuRenderPassScissorRect', () => {
|
|
105
|
-
it('scales logical coordinates
|
|
106
|
-
const state = await createWgpuRenderStateForTest(
|
|
107
|
-
|
|
107
|
+
it('scales logical coordinates onto a supersampled screen surface', async () => {
|
|
108
|
+
const state = await createWgpuRenderStateForTest();
|
|
109
|
+
beginWgpuScreenRenderPassForTest(state, { color: [0, 0, 0, 0] }, { antialias: true });
|
|
110
|
+
const setScissorRect = vi.fn();
|
|
111
|
+
|
|
112
|
+
setWgpuRenderPassScissorRect(state, { setScissorRect } as unknown as WgpuRenderPassEncoder, 3, 5, 7, 11);
|
|
113
|
+
|
|
114
|
+
expect(setScissorRect).toHaveBeenCalledWith(6, 10, 14, 22);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Logical is one coordinate space, so a supersampled OFFSCREEN target scales its scissors by the same
|
|
118
|
+
// factor its storage was grown by. It previously passed them through unscaled while the screen scaled
|
|
119
|
+
// them, which left a clip inside a sampleCount-4 effect target covering a quarter of its intended area.
|
|
120
|
+
it('scales them onto a supersampled texture target by the same rule', async () => {
|
|
121
|
+
const state = await createWgpuRenderStateForTest();
|
|
122
|
+
const outer = beginWgpuScreenRenderPassForTest(state);
|
|
123
|
+
const pass = beginWgpuRenderPass(state, createWgpuTextureRenderTarget(state, 64, 64, state.format, 'srgb', 4));
|
|
108
124
|
const setScissorRect = vi.fn();
|
|
109
125
|
|
|
110
|
-
setWgpuRenderPassScissorRect(state, { setScissorRect } as unknown as
|
|
126
|
+
setWgpuRenderPassScissorRect(state, { setScissorRect } as unknown as WgpuRenderPassEncoder, 3, 5, 7, 11);
|
|
111
127
|
|
|
112
128
|
expect(setScissorRect).toHaveBeenCalledWith(6, 10, 14, 22);
|
|
129
|
+
endWgpuRenderPass(pass);
|
|
130
|
+
endWgpuRenderPass(outer);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('passes them through unscaled on a target with no supersample', async () => {
|
|
134
|
+
const state = await createWgpuRenderStateForTest();
|
|
135
|
+
const outer = beginWgpuScreenRenderPassForTest(state);
|
|
136
|
+
const pass = beginWgpuRenderPass(state, createWgpuTextureRenderTarget(state, 64, 64));
|
|
137
|
+
const setScissorRect = vi.fn();
|
|
138
|
+
|
|
139
|
+
setWgpuRenderPassScissorRect(state, { setScissorRect } as unknown as WgpuRenderPassEncoder, 3, 5, 7, 11);
|
|
140
|
+
|
|
141
|
+
expect(setScissorRect).toHaveBeenCalledWith(3, 5, 7, 11);
|
|
142
|
+
endWgpuRenderPass(pass);
|
|
143
|
+
endWgpuRenderPass(outer);
|
|
113
144
|
});
|
|
114
145
|
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { WgpuCommandEncoder, WgpuRenderPassDescriptor } from './contract.render-wgpu-types.ts';
|
|
2
|
+
import { beginWgpuRenderPass, endWgpuRenderPass } from './wgpuRenderPass.ts';
|
|
3
|
+
import { enableWgpuScreenRenderTargetAntialias } from './wgpuScreenAntialias.ts';
|
|
4
|
+
import { bindWgpuScreenRenderTarget } from './wgpuScreenRenderTarget.ts';
|
|
5
|
+
import {
|
|
6
|
+
createWgpuRenderStateForTest,
|
|
7
|
+
createWgpuScreenRenderTargetForTest,
|
|
8
|
+
installWgpuMock,
|
|
9
|
+
} from './wgpuTestHelper.ts';
|
|
10
|
+
|
|
11
|
+
beforeAll(() => {
|
|
12
|
+
installWgpuMock();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('enableWgpuScreenRenderTargetAntialias', () => {
|
|
16
|
+
// ★ THE COST IS OPT-IN, AND THAT IS THE POINT OF THE SLOTS. A screen target that was never asked for
|
|
17
|
+
// antialiasing carries no resolve hook, so the module holding the resolve pipeline and its shader is
|
|
18
|
+
// unreachable from an ordinary frame loop and tree-shakes out of the bundle entirely.
|
|
19
|
+
it('installs the hooks a plain screen target does not carry', async () => {
|
|
20
|
+
const state = await createWgpuRenderStateForTest();
|
|
21
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
22
|
+
|
|
23
|
+
expect(screen.antialias).toBe(false);
|
|
24
|
+
expect(screen.acquireAntialiasView).toBeNull();
|
|
25
|
+
expect(screen.encodeAntialiasResolve).toBeNull();
|
|
26
|
+
|
|
27
|
+
enableWgpuScreenRenderTargetAntialias(screen);
|
|
28
|
+
|
|
29
|
+
expect(screen.antialias).toBe(true);
|
|
30
|
+
expect(screen.acquireAntialiasView).not.toBeNull();
|
|
31
|
+
expect(screen.encodeAntialiasResolve).not.toBeNull();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('draws into supersample storage twice the surface extent', async () => {
|
|
35
|
+
const state = await createWgpuRenderStateForTest();
|
|
36
|
+
const screen = createWgpuScreenRenderTargetForTest(state, { antialias: true }, 400, 300);
|
|
37
|
+
|
|
38
|
+
const view = bindWgpuScreenRenderTarget(state, screen);
|
|
39
|
+
|
|
40
|
+
expect(screen.width).toBe(800);
|
|
41
|
+
expect(view).toBe(screen.antialiasView);
|
|
42
|
+
expect(view).not.toBe(screen.presentationView);
|
|
43
|
+
expect(screen.antialiasTexture?.width).toBe(800);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('resolves the supersample texture into the presentation view', async () => {
|
|
47
|
+
const state = await createWgpuRenderStateForTest();
|
|
48
|
+
const screen = createWgpuScreenRenderTargetForTest(state, { antialias: true });
|
|
49
|
+
const pass = beginWgpuRenderPass(state, screen, { color: [0, 0, 0, 0] });
|
|
50
|
+
const presentationView = screen.presentationView;
|
|
51
|
+
const encoded: WgpuRenderPassDescriptor[] = [];
|
|
52
|
+
const encoder = {
|
|
53
|
+
beginRenderPass: (descriptor: WgpuRenderPassDescriptor) => {
|
|
54
|
+
encoded.push(descriptor);
|
|
55
|
+
return { draw: () => {}, end: () => {}, setBindGroup: () => {}, setPipeline: () => {} };
|
|
56
|
+
},
|
|
57
|
+
} as unknown as WgpuCommandEncoder;
|
|
58
|
+
|
|
59
|
+
screen.encodeAntialiasResolve!(state, screen, encoder);
|
|
60
|
+
|
|
61
|
+
expect(encoded.length).toBe(1);
|
|
62
|
+
expect(Array.from(encoded[0]!.colorAttachments)[0]!.view).toBe(presentationView);
|
|
63
|
+
endWgpuRenderPass(pass);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { beforeAll, describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
WgpuBuffer,
|
|
5
|
+
WgpuBufferMapState,
|
|
6
|
+
WgpuCommandEncoder,
|
|
7
|
+
WgpuScreenRenderTarget,
|
|
8
|
+
} from './contract.render-wgpu-types.ts';
|
|
9
|
+
import { beginWgpuRenderPass, endWgpuRenderPass } from './wgpuRenderPass.ts';
|
|
10
|
+
import {
|
|
11
|
+
createBitmapFromWgpuScreenRenderTarget,
|
|
12
|
+
enableWgpuScreenRenderTargetCapture,
|
|
13
|
+
encodeWgpuScreenRenderTargetCapture,
|
|
14
|
+
} from './wgpuScreenCapture.ts';
|
|
15
|
+
import {
|
|
16
|
+
createWgpuRenderStateForTest,
|
|
17
|
+
createWgpuScreenRenderTargetForTest,
|
|
18
|
+
installWgpuMock,
|
|
19
|
+
} from './wgpuTestHelper.ts';
|
|
20
|
+
|
|
21
|
+
beforeAll(() => {
|
|
22
|
+
installWgpuMock();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('createBitmapFromWgpuScreenRenderTarget', () => {
|
|
26
|
+
it('throws when capture was never enabled (no buffer to read)', async () => {
|
|
27
|
+
const state = await createWgpuRenderStateForTest();
|
|
28
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
29
|
+
await expect(createBitmapFromWgpuScreenRenderTarget(screen)).rejects.toThrow(/enableWgpuScreenRenderTargetCapture/);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('reads the mapped buffer within the bound', async () => {
|
|
33
|
+
const state = await createWgpuRenderStateForTest();
|
|
34
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
35
|
+
installCaptureBuffer(screen, () => Promise.resolve());
|
|
36
|
+
|
|
37
|
+
const bitmap = await createBitmapFromWgpuScreenRenderTarget(screen, 1_000);
|
|
38
|
+
|
|
39
|
+
expect(bitmap.width).toBe(1);
|
|
40
|
+
expect(bitmap.height).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('fails by name when the buffer never maps, instead of awaiting forever', async () => {
|
|
44
|
+
// The driver failure this bounds: mapAsync neither resolves nor rejects. Before the bound, the
|
|
45
|
+
// caller sat here until something outside it gave up and reported a stall with no location.
|
|
46
|
+
const state = await createWgpuRenderStateForTest();
|
|
47
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
48
|
+
installCaptureBuffer(screen, () => new Promise<void>(() => {}));
|
|
49
|
+
|
|
50
|
+
await expect(createBitmapFromWgpuScreenRenderTarget(screen, 25)).rejects.toThrow(/did not map within 25ms/);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('leaves the wait unbounded when the caller passes 0', async () => {
|
|
54
|
+
const state = await createWgpuRenderStateForTest();
|
|
55
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
56
|
+
let settle = (): void => {};
|
|
57
|
+
installCaptureBuffer(screen, () => new Promise<void>((resolve) => (settle = resolve)));
|
|
58
|
+
|
|
59
|
+
let done = false;
|
|
60
|
+
const pending = createBitmapFromWgpuScreenRenderTarget(screen, 0).then(() => (done = true));
|
|
61
|
+
await new Promise((resolve) => setTimeout(resolve, 40));
|
|
62
|
+
expect(done).toBe(false);
|
|
63
|
+
|
|
64
|
+
settle();
|
|
65
|
+
await pending;
|
|
66
|
+
expect(done).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
describe('enableWgpuScreenRenderTargetCapture', () => {
|
|
71
|
+
it('sets the capture flag on the screen target', async () => {
|
|
72
|
+
const state = await createWgpuRenderStateForTest();
|
|
73
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
74
|
+
expect(screen.captureEnabled).toBe(false);
|
|
75
|
+
enableWgpuScreenRenderTargetCapture(screen);
|
|
76
|
+
expect(screen.captureEnabled).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('redirects the frame into an offscreen texture rather than the swap chain', async () => {
|
|
80
|
+
// The whole reason capture exists: software and headless adapters never present the swap chain, and
|
|
81
|
+
// its texture reads back as zeros, so a captured frame must be drawn somewhere readable instead.
|
|
82
|
+
const state = await createWgpuRenderStateForTest();
|
|
83
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
84
|
+
expect(screen.captureTexture).toBeNull();
|
|
85
|
+
|
|
86
|
+
enableWgpuScreenRenderTargetCapture(screen);
|
|
87
|
+
endWgpuRenderPass(beginWgpuRenderPass(state, screen, { color: [0, 0, 0, 0] }));
|
|
88
|
+
|
|
89
|
+
expect(screen.captureTexture).not.toBeNull();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('encodeWgpuScreenRenderTargetCapture', () => {
|
|
94
|
+
it('is a no-op when capture is disabled', async () => {
|
|
95
|
+
const state = await createWgpuRenderStateForTest();
|
|
96
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
97
|
+
let copied = false;
|
|
98
|
+
const encoder = { copyTextureToBuffer: () => (copied = true) } as unknown as WgpuCommandEncoder;
|
|
99
|
+
encodeWgpuScreenRenderTargetCapture(screen, encoder);
|
|
100
|
+
expect(copied).toBe(false);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('skips the copy while a readback holds the buffer, and resumes once it lets go', async () => {
|
|
104
|
+
// The writer/reader handshake over the single retained buffer: an animating scene must not keep
|
|
105
|
+
// enqueueing copies into a buffer a readback has mapped or is waiting to map.
|
|
106
|
+
const state = await createWgpuRenderStateForTest();
|
|
107
|
+
const screen = captureReadyScreenRenderTarget(state);
|
|
108
|
+
let mapState: WgpuBufferMapState = 'unmapped';
|
|
109
|
+
installCaptureBuffer(screen, () => Promise.resolve());
|
|
110
|
+
Object.defineProperty(screen.captureBuffer, 'mapState', { get: () => mapState });
|
|
111
|
+
|
|
112
|
+
let copies = 0;
|
|
113
|
+
const encoder = { copyTextureToBuffer: () => copies++ } as unknown as WgpuCommandEncoder;
|
|
114
|
+
|
|
115
|
+
mapState = 'pending';
|
|
116
|
+
encodeWgpuScreenRenderTargetCapture(screen, encoder);
|
|
117
|
+
mapState = 'mapped';
|
|
118
|
+
encodeWgpuScreenRenderTargetCapture(screen, encoder);
|
|
119
|
+
expect(copies).toBe(0);
|
|
120
|
+
|
|
121
|
+
mapState = 'unmapped';
|
|
122
|
+
encodeWgpuScreenRenderTargetCapture(screen, encoder);
|
|
123
|
+
expect(copies).toBe(1);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('still copies when the implementation reports no map state at all', async () => {
|
|
127
|
+
// Fails safe in the direction that keeps capturing: an undefined mapState must not read as "busy"
|
|
128
|
+
// and silence every copy for the rest of the run.
|
|
129
|
+
const state = await createWgpuRenderStateForTest();
|
|
130
|
+
const screen = captureReadyScreenRenderTarget(state);
|
|
131
|
+
installCaptureBuffer(screen, () => Promise.resolve());
|
|
132
|
+
Object.defineProperty(screen.captureBuffer, 'mapState', { get: () => undefined });
|
|
133
|
+
|
|
134
|
+
let copies = 0;
|
|
135
|
+
encodeWgpuScreenRenderTargetCapture(screen, {
|
|
136
|
+
copyTextureToBuffer: () => copies++,
|
|
137
|
+
} as unknown as WgpuCommandEncoder);
|
|
138
|
+
|
|
139
|
+
expect(copies).toBe(1);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// A screen target that has drawn one captured frame, so its capture texture exists.
|
|
144
|
+
function captureReadyScreenRenderTarget(
|
|
145
|
+
state: Awaited<ReturnType<typeof createWgpuRenderStateForTest>>,
|
|
146
|
+
): WgpuScreenRenderTarget {
|
|
147
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
148
|
+
enableWgpuScreenRenderTargetCapture(screen);
|
|
149
|
+
endWgpuRenderPass(beginWgpuRenderPass(state, screen, { color: [0, 0, 0, 0] }));
|
|
150
|
+
return screen;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Installs a 1x1 retained capture buffer whose map step the caller controls, so the map bound can be
|
|
154
|
+
// exercised without a GPU. The mock device's buffers carry no map surface of their own.
|
|
155
|
+
function installCaptureBuffer(target: WgpuScreenRenderTarget, mapAsync: () => Promise<void>): void {
|
|
156
|
+
target.captureBuffer = {
|
|
157
|
+
mapAsync,
|
|
158
|
+
getMappedRange: () => new ArrayBuffer(256),
|
|
159
|
+
unmap: () => {},
|
|
160
|
+
destroy: () => {},
|
|
161
|
+
} as unknown as WgpuBuffer;
|
|
162
|
+
target.captureWidth = 1;
|
|
163
|
+
target.captureHeight = 1;
|
|
164
|
+
target.captureBytesPerRow = 256;
|
|
165
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { allocateEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import type { EntityConstruction } from '@flighthq/entity/contract';
|
|
3
|
+
import type { Surface } from '@flighthq/surface/contract';
|
|
4
|
+
|
|
5
|
+
import { createTestWgpuSurface, testWgpuHost } from './wgpuHost.ts';
|
|
6
|
+
import { beginWgpuRenderPass, endWgpuRenderPass } from './wgpuRenderPass.ts';
|
|
7
|
+
import { getWgpuRenderStateRuntime } from './wgpuRenderState.ts';
|
|
8
|
+
import {
|
|
9
|
+
bindWgpuScreenRenderTarget,
|
|
10
|
+
createWgpuScreenRenderTarget,
|
|
11
|
+
destroyWgpuScreenRenderTarget,
|
|
12
|
+
endWgpuScreenRenderTargetFrame,
|
|
13
|
+
initializeWgpuScreenRenderTarget,
|
|
14
|
+
isWgpuScreenRenderTarget,
|
|
15
|
+
syncWgpuScreenRenderTargetExtent,
|
|
16
|
+
} from './wgpuScreenRenderTarget.ts';
|
|
17
|
+
import {
|
|
18
|
+
createWgpuRenderStateForTest,
|
|
19
|
+
createWgpuScreenRenderTargetForTest,
|
|
20
|
+
installWgpuMock,
|
|
21
|
+
} from './wgpuTestHelper.ts';
|
|
22
|
+
import { createWgpuTextureRenderTarget } from './wgpuTextureRenderTarget.ts';
|
|
23
|
+
|
|
24
|
+
beforeAll(() => {
|
|
25
|
+
installWgpuMock();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const _webBackend = testWgpuHost;
|
|
29
|
+
|
|
30
|
+
describe('bindWgpuScreenRenderTarget', () => {
|
|
31
|
+
it('acquires one swap-chain view per frame and releases it at the end of the frame', async () => {
|
|
32
|
+
// Nothing may hold a swap-chain view across frames — that is the property that makes a screen target
|
|
33
|
+
// unsampleable — so the view is acquired inside the frame and dropped when it is submitted.
|
|
34
|
+
const state = await createWgpuRenderStateForTest();
|
|
35
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
36
|
+
|
|
37
|
+
const first = bindWgpuScreenRenderTarget(state, screen);
|
|
38
|
+
expect(bindWgpuScreenRenderTarget(state, screen)).toBe(first);
|
|
39
|
+
expect(screen.presentationView).toBe(first);
|
|
40
|
+
|
|
41
|
+
endWgpuScreenRenderTargetFrame(screen);
|
|
42
|
+
expect(screen.presentationView).toBeNull();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('follows a surface that resized between frames', async () => {
|
|
46
|
+
const state = await createWgpuRenderStateForTest();
|
|
47
|
+
const canvas = document.createElement('canvas');
|
|
48
|
+
canvas.width = 320;
|
|
49
|
+
canvas.height = 240;
|
|
50
|
+
const screen = createWgpuScreenRenderTarget(_webBackend, state.device, createTestWgpuSurface(canvas), {
|
|
51
|
+
format: state.format,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
canvas.width = 640;
|
|
55
|
+
canvas.height = 480;
|
|
56
|
+
bindWgpuScreenRenderTarget(state, screen);
|
|
57
|
+
|
|
58
|
+
expect(screen.width).toBe(640);
|
|
59
|
+
expect(screen.height).toBe(480);
|
|
60
|
+
expect(screen.depthStencilTexture.width).toBe(640);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('draws into supersample storage when the target is antialiased', async () => {
|
|
64
|
+
const state = await createWgpuRenderStateForTest();
|
|
65
|
+
const screen = createWgpuScreenRenderTargetForTest(state, { antialias: true }, 400, 300);
|
|
66
|
+
|
|
67
|
+
const view = bindWgpuScreenRenderTarget(state, screen);
|
|
68
|
+
|
|
69
|
+
expect(screen.width).toBe(800);
|
|
70
|
+
expect(view).toBe(screen.antialiasView);
|
|
71
|
+
expect(view).not.toBe(screen.presentationView);
|
|
72
|
+
expect(screen.antialiasTexture?.width).toBe(800);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe('createWgpuScreenRenderTarget', () => {
|
|
77
|
+
it('configures the surface context and declares one color attachment', async () => {
|
|
78
|
+
const state = await createWgpuRenderStateForTest();
|
|
79
|
+
const canvas = document.createElement('canvas');
|
|
80
|
+
canvas.width = 800;
|
|
81
|
+
canvas.height = 600;
|
|
82
|
+
const target = createTestWgpuSurface(canvas);
|
|
83
|
+
const context = canvas.getContext('webgpu')!;
|
|
84
|
+
const configure = vi.spyOn(context, 'configure');
|
|
85
|
+
|
|
86
|
+
const screen = createWgpuScreenRenderTarget(_webBackend, state.device, target, { format: 'rgba8unorm' });
|
|
87
|
+
|
|
88
|
+
expect(configure).toHaveBeenCalledOnce();
|
|
89
|
+
expect(configure.mock.calls[0]![0].format).toBe('rgba8unorm');
|
|
90
|
+
expect(screen.context).toBe(context);
|
|
91
|
+
expect(screen.colorAttachments).toBe(1);
|
|
92
|
+
expect(screen.format).toBe('rgba8unorm');
|
|
93
|
+
expect(screen.width).toBe(800);
|
|
94
|
+
expect(screen.height).toBe(600);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('reports a surface the host cannot present rather than returning a target that cannot bind', async () => {
|
|
98
|
+
const state = await createWgpuRenderStateForTest();
|
|
99
|
+
// A surface whose drawable is not a canvas: the host cannot present through it, which is the same
|
|
100
|
+
// sentinel as a surface it never allocated.
|
|
101
|
+
const unregisteredTarget = createTestWgpuSurface(document.createElement('div') as unknown as HTMLCanvasElement);
|
|
102
|
+
|
|
103
|
+
expect(() => createWgpuScreenRenderTarget(_webBackend, state.device, unregisteredTarget)).toThrow(
|
|
104
|
+
/cannot present WebGPU/,
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('destroyWgpuScreenRenderTarget', () => {
|
|
110
|
+
it('frees the storage it owns and unconfigures the context', async () => {
|
|
111
|
+
const state = await createWgpuRenderStateForTest();
|
|
112
|
+
const screen = createWgpuScreenRenderTargetForTest(state, { antialias: true });
|
|
113
|
+
bindWgpuScreenRenderTarget(state, screen);
|
|
114
|
+
const depth = vi.spyOn(screen.depthStencilTexture, 'destroy');
|
|
115
|
+
const antialias = vi.spyOn(screen.antialiasTexture!, 'destroy');
|
|
116
|
+
const unconfigure = vi.spyOn(screen.context, 'unconfigure');
|
|
117
|
+
|
|
118
|
+
destroyWgpuScreenRenderTarget(screen);
|
|
119
|
+
|
|
120
|
+
expect(depth).toHaveBeenCalledOnce();
|
|
121
|
+
expect(antialias).toHaveBeenCalledOnce();
|
|
122
|
+
expect(unconfigure).toHaveBeenCalledOnce();
|
|
123
|
+
expect(screen.antialiasView).toBeNull();
|
|
124
|
+
expect(screen.presentationView).toBeNull();
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe('endWgpuScreenRenderTargetFrame', () => {
|
|
129
|
+
it('is what a submitted frame calls, leaving no view behind', async () => {
|
|
130
|
+
const state = await createWgpuRenderStateForTest();
|
|
131
|
+
const screen = createWgpuScreenRenderTargetForTest(state);
|
|
132
|
+
|
|
133
|
+
endWgpuRenderPass(beginWgpuRenderPass(state, screen, { color: [0, 0, 0, 0] }));
|
|
134
|
+
|
|
135
|
+
expect(screen.presentationView).toBeNull();
|
|
136
|
+
expect(getWgpuRenderStateRuntime(state).frameScreenTarget).toBeNull();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe('initializeWgpuScreenRenderTarget', () => {
|
|
141
|
+
it('is the construction initializer of createWgpuScreenRenderTarget', () => {
|
|
142
|
+
expect(typeof initializeWgpuScreenRenderTarget).toBe('function');
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe('isWgpuScreenRenderTarget', () => {
|
|
147
|
+
it('separates the two realizations by the field that says where the pixels live', async () => {
|
|
148
|
+
const state = await createWgpuRenderStateForTest();
|
|
149
|
+
|
|
150
|
+
expect(isWgpuScreenRenderTarget(createWgpuScreenRenderTargetForTest(state))).toBe(true);
|
|
151
|
+
expect(isWgpuScreenRenderTarget(createWgpuTextureRenderTarget(state, 16, 16))).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe('syncWgpuScreenRenderTargetExtent', () => {
|
|
156
|
+
it('follows the surface without a resize call', async () => {
|
|
157
|
+
const state = await createWgpuRenderStateForTest();
|
|
158
|
+
const canvas = document.createElement('canvas');
|
|
159
|
+
canvas.width = 320;
|
|
160
|
+
canvas.height = 240;
|
|
161
|
+
const screen = createWgpuScreenRenderTarget(_webBackend, state.device, createTestWgpuSurface(canvas), {
|
|
162
|
+
format: state.format,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
canvas.width = 500;
|
|
166
|
+
canvas.height = 400;
|
|
167
|
+
syncWgpuScreenRenderTargetExtent(screen);
|
|
168
|
+
|
|
169
|
+
expect(screen.width).toBe(500);
|
|
170
|
+
expect(screen.height).toBe(400);
|
|
171
|
+
});
|
|
172
|
+
});
|
package/src/wgpuShader.test.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { AdvancedBlendMode
|
|
1
|
+
import { AdvancedBlendMode } from '@flighthq/effects/contract';
|
|
2
|
+
import { BlendMode } from '@flighthq/materials/contract';
|
|
2
3
|
|
|
3
|
-
import {
|
|
4
|
-
import { getWgpuRenderStateDeviceResources, getWgpuRenderStateRuntime } from './wgpuRenderState';
|
|
4
|
+
import type { WgpuRenderPipelineDescriptor } from './contract.render-wgpu-types.ts';
|
|
5
|
+
import { getWgpuRenderStateDeviceResources, getWgpuRenderStateRuntime } from './wgpuRenderState.ts';
|
|
5
6
|
import {
|
|
6
7
|
UNIFORM_BYTE_SIZE,
|
|
7
8
|
createWgpuBindGroupLayouts,
|
|
@@ -13,8 +14,8 @@ import {
|
|
|
13
14
|
setWgpuMatrixFromTransform,
|
|
14
15
|
writeWgpuMatrixOnlyUniforms,
|
|
15
16
|
writeWgpuQuadUniforms,
|
|
16
|
-
} from './wgpuShader';
|
|
17
|
-
import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
|
|
17
|
+
} from './wgpuShader.ts';
|
|
18
|
+
import { beginWgpuScreenRenderPassForTest, createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper.ts';
|
|
18
19
|
|
|
19
20
|
beforeAll(() => {
|
|
20
21
|
installWgpuMock();
|
|
@@ -95,7 +96,7 @@ describe('getWgpuPipeline', () => {
|
|
|
95
96
|
const state = await createWgpuRenderStateForTest();
|
|
96
97
|
const blendOf = (mode: BlendMode) =>
|
|
97
98
|
[
|
|
98
|
-
...(getWgpuPipeline(state, mode, 'normal') as unknown as { __descriptor:
|
|
99
|
+
...(getWgpuPipeline(state, mode, 'normal') as unknown as { __descriptor: WgpuRenderPipelineDescriptor })
|
|
99
100
|
.__descriptor.fragment!.targets,
|
|
100
101
|
][0]!.blend!.color;
|
|
101
102
|
expect(blendOf(BlendMode.Normal)).toEqual({ srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' });
|
|
@@ -114,7 +115,7 @@ describe('getWgpuPipeline', () => {
|
|
|
114
115
|
const state = await createWgpuRenderStateForTest();
|
|
115
116
|
const blendOf = (mode: BlendMode) =>
|
|
116
117
|
[
|
|
117
|
-
...(getWgpuPipeline(state, mode, 'normal') as unknown as { __descriptor:
|
|
118
|
+
...(getWgpuPipeline(state, mode, 'normal') as unknown as { __descriptor: WgpuRenderPipelineDescriptor })
|
|
118
119
|
.__descriptor.fragment!.targets,
|
|
119
120
|
][0]!.blend!.color;
|
|
120
121
|
expect(blendOf(AdvancedBlendMode.Overlay)).toEqual({
|
|
@@ -164,7 +165,7 @@ describe('writeWgpuMatrixOnlyUniforms', () => {
|
|
|
164
165
|
it('advances uniformOffset', async () => {
|
|
165
166
|
const state = await createWgpuRenderStateForTest();
|
|
166
167
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
167
|
-
|
|
168
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
168
169
|
const before = runtime.uniformOffset;
|
|
169
170
|
const fakeNode = { alpha: 1, useColorScaleBias: false, colorScaleBias: null };
|
|
170
171
|
const t = { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };
|
|
@@ -176,7 +177,7 @@ describe('writeWgpuQuadUniforms', () => {
|
|
|
176
177
|
it('advances uniformOffset by uniformStride', async () => {
|
|
177
178
|
const state = await createWgpuRenderStateForTest();
|
|
178
179
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
179
|
-
|
|
180
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
180
181
|
const before = runtime.uniformOffset;
|
|
181
182
|
const fakeNode = {
|
|
182
183
|
alpha: 1,
|
|
@@ -191,7 +192,7 @@ describe('writeWgpuQuadUniforms', () => {
|
|
|
191
192
|
it('writes quad coordinates into uniform data at float offset 24', async () => {
|
|
192
193
|
const state = await createWgpuRenderStateForTest();
|
|
193
194
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
194
|
-
|
|
195
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
195
196
|
const fakeNode = {
|
|
196
197
|
alpha: 0.5,
|
|
197
198
|
useColorScaleBias: false,
|
|
@@ -211,7 +212,7 @@ describe('writeWgpuQuadUniforms', () => {
|
|
|
211
212
|
it('writes the native straight-alpha texture flag at u32 offset 14', async () => {
|
|
212
213
|
const state = await createWgpuRenderStateForTest();
|
|
213
214
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
214
|
-
|
|
215
|
+
beginWgpuScreenRenderPassForTest(state);
|
|
215
216
|
const fakeNode = {
|
|
216
217
|
alpha: 1,
|
|
217
218
|
useColorScaleBias: false,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { getOrCreateRenderProxy2D } from '@flighthq/render/contract';
|
|
2
2
|
import { createSprite } from '@flighthq/scene2d/contract';
|
|
3
|
-
import type { WgpuBitmapShader } from '@flighthq/types/contract';
|
|
4
3
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import type { WgpuBitmapShader } from './contract.render-wgpu-types.ts';
|
|
5
|
+
import { getWgpuRenderStateRuntime } from './wgpuRenderState.ts';
|
|
6
|
+
import { getWgpuShader, resolveWgpuShader, setWgpuShader } from './wgpuShaderBinding.ts';
|
|
7
|
+
import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper.ts';
|
|
8
8
|
|
|
9
9
|
beforeAll(() => {
|
|
10
10
|
installWgpuMock();
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { WgpuBitmapShader } from '
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
|
|
1
|
+
import type { WgpuBitmapShader } from './contract.render-wgpu-types.ts';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from './wgpuRenderState.ts';
|
|
3
|
+
import { registerWgpuBitmapShader } from './wgpuShaderRegistry.ts';
|
|
4
|
+
import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper.ts';
|
|
6
5
|
|
|
7
6
|
beforeAll(() => {
|
|
8
7
|
installWgpuMock();
|