@flighthq/render-wgpu 0.5.1-next.973.788d3d7 → 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.
Files changed (407) hide show
  1. package/README.md +2 -2
  2. package/dist/.tsbuildinfo.compressed-texture-decoder-contract +1 -0
  3. package/dist/.tsbuildinfo.contract +1 -0
  4. package/dist/.tsbuildinfo.runtime +1 -0
  5. package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.d.ts +3 -0
  6. package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.d.ts.map +1 -0
  7. package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.js +2 -0
  8. package/dist/compressed-texture-decoder-contract/WgpuCompressedTextureDecoder.js.map +1 -0
  9. package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.d.ts +2 -0
  10. package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.d.ts.map +1 -0
  11. package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.js +2 -0
  12. package/dist/compressed-texture-decoder-contract/compressedTextureDecoderContract.js.map +1 -0
  13. package/dist/contract.d.ts +32 -34
  14. package/dist/contract.d.ts.map +1 -1
  15. package/dist/contract.js +32 -34
  16. package/dist/contract.js.map +1 -1
  17. package/dist/contract.render-wgpu-types.d.ts +55 -0
  18. package/dist/contract.render-wgpu-types.d.ts.map +1 -0
  19. package/dist/contract.render-wgpu-types.js +5 -0
  20. package/dist/contract.render-wgpu-types.js.map +1 -0
  21. package/dist/enableWgpuTextureResolverGuards.d.ts +3 -2
  22. package/dist/enableWgpuTextureResolverGuards.d.ts.map +1 -1
  23. package/dist/enableWgpuTextureResolverGuards.js +12 -9
  24. package/dist/enableWgpuTextureResolverGuards.js.map +1 -1
  25. package/dist/explainWgpuTextureResolution.d.ts +2 -1
  26. package/dist/explainWgpuTextureResolution.d.ts.map +1 -1
  27. package/dist/explainWgpuTextureResolution.js +2 -5
  28. package/dist/explainWgpuTextureResolution.js.map +1 -1
  29. package/dist/explainWgpuUniformEndianness.d.ts +3 -0
  30. package/dist/explainWgpuUniformEndianness.d.ts.map +1 -0
  31. package/dist/explainWgpuUniformEndianness.js +25 -0
  32. package/dist/explainWgpuUniformEndianness.js.map +1 -0
  33. package/dist/index.d.ts +20 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +20 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/types/Host.d.ts +5 -0
  38. package/dist/types/Host.d.ts.map +1 -0
  39. package/dist/types/Host.js +2 -0
  40. package/dist/types/Host.js.map +1 -0
  41. package/dist/types/WgpuAdapter.d.ts +14 -0
  42. package/dist/types/WgpuAdapter.d.ts.map +1 -0
  43. package/dist/types/WgpuAdapter.js +2 -0
  44. package/dist/types/WgpuAdapter.js.map +1 -0
  45. package/dist/types/WgpuAdapterCapabilities.d.ts +7 -0
  46. package/dist/types/WgpuAdapterCapabilities.d.ts.map +1 -0
  47. package/dist/types/WgpuAdapterCapabilities.js +2 -0
  48. package/dist/types/WgpuAdapterCapabilities.js.map +1 -0
  49. package/dist/types/WgpuBindGroup.d.ts +23 -0
  50. package/dist/types/WgpuBindGroup.d.ts.map +1 -0
  51. package/dist/types/WgpuBindGroup.js +2 -0
  52. package/dist/types/WgpuBindGroup.js.map +1 -0
  53. package/dist/types/WgpuBindGroupLayout.d.ts +45 -0
  54. package/dist/types/WgpuBindGroupLayout.d.ts.map +1 -0
  55. package/dist/types/WgpuBindGroupLayout.js +7 -0
  56. package/dist/types/WgpuBindGroupLayout.js.map +1 -0
  57. package/dist/types/WgpuBuffer.d.ts +34 -0
  58. package/dist/types/WgpuBuffer.d.ts.map +1 -0
  59. package/dist/types/WgpuBuffer.js +19 -0
  60. package/dist/types/WgpuBuffer.js.map +1 -0
  61. package/dist/types/WgpuCanvasContext.d.ts +17 -0
  62. package/dist/types/WgpuCanvasContext.d.ts.map +1 -0
  63. package/dist/types/WgpuCanvasContext.js +2 -0
  64. package/dist/types/WgpuCanvasContext.js.map +1 -0
  65. package/dist/types/WgpuColorAdjustmentMaterialFeature.d.ts +14 -0
  66. package/dist/types/WgpuColorAdjustmentMaterialFeature.d.ts.map +1 -0
  67. package/dist/types/WgpuColorAdjustmentMaterialFeature.js +2 -0
  68. package/dist/types/WgpuColorAdjustmentMaterialFeature.js.map +1 -0
  69. package/dist/types/WgpuCommandBuffer.d.ts +5 -0
  70. package/dist/types/WgpuCommandBuffer.d.ts.map +1 -0
  71. package/dist/types/WgpuCommandBuffer.js +2 -0
  72. package/dist/types/WgpuCommandBuffer.js.map +1 -0
  73. package/dist/types/WgpuCommandEncoder.d.ts +12 -0
  74. package/dist/types/WgpuCommandEncoder.d.ts.map +1 -0
  75. package/dist/types/WgpuCommandEncoder.js +2 -0
  76. package/dist/types/WgpuCommandEncoder.js.map +1 -0
  77. package/dist/types/WgpuCompressedTextureSupport.d.ts +6 -0
  78. package/dist/types/WgpuCompressedTextureSupport.d.ts.map +1 -0
  79. package/dist/types/WgpuCompressedTextureSupport.js +2 -0
  80. package/dist/types/WgpuCompressedTextureSupport.js.map +1 -0
  81. package/dist/types/WgpuCompressedTextureUploader.d.ts +6 -0
  82. package/dist/types/WgpuCompressedTextureUploader.d.ts.map +1 -0
  83. package/dist/types/WgpuCompressedTextureUploader.js +2 -0
  84. package/dist/types/WgpuCompressedTextureUploader.js.map +1 -0
  85. package/dist/types/WgpuCustomMaterialShaderSource.d.ts +2 -0
  86. package/dist/types/WgpuCustomMaterialShaderSource.d.ts.map +1 -0
  87. package/dist/types/WgpuCustomMaterialShaderSource.js +2 -0
  88. package/dist/types/WgpuCustomMaterialShaderSource.js.map +1 -0
  89. package/dist/types/WgpuDevice.d.ts +76 -0
  90. package/dist/types/WgpuDevice.d.ts.map +1 -0
  91. package/dist/types/WgpuDevice.js +2 -0
  92. package/dist/types/WgpuDevice.js.map +1 -0
  93. package/dist/types/WgpuDeviceRuntime.d.ts +53 -0
  94. package/dist/types/WgpuDeviceRuntime.d.ts.map +1 -0
  95. package/dist/types/WgpuDeviceRuntime.js +2 -0
  96. package/dist/types/WgpuDeviceRuntime.js.map +1 -0
  97. package/dist/types/WgpuDeviceSignals.d.ts +6 -0
  98. package/dist/types/WgpuDeviceSignals.d.ts.map +1 -0
  99. package/dist/types/WgpuDeviceSignals.js +2 -0
  100. package/dist/types/WgpuDeviceSignals.js.map +1 -0
  101. package/dist/types/WgpuDeviceState.d.ts +7 -0
  102. package/dist/types/WgpuDeviceState.d.ts.map +1 -0
  103. package/dist/types/WgpuDeviceState.js +2 -0
  104. package/dist/types/WgpuDeviceState.js.map +1 -0
  105. package/dist/types/WgpuEffectState.d.ts +19 -0
  106. package/dist/types/WgpuEffectState.d.ts.map +1 -0
  107. package/dist/types/WgpuEffectState.js +2 -0
  108. package/dist/types/WgpuEffectState.js.map +1 -0
  109. package/dist/types/WgpuExternalImageSource.d.ts +18 -0
  110. package/dist/types/WgpuExternalImageSource.d.ts.map +1 -0
  111. package/dist/types/WgpuExternalImageSource.js +2 -0
  112. package/dist/types/WgpuExternalImageSource.js.map +1 -0
  113. package/dist/types/WgpuFullscreenPipeline.d.ts +14 -0
  114. package/dist/types/WgpuFullscreenPipeline.d.ts.map +1 -0
  115. package/dist/types/WgpuFullscreenPipeline.js +2 -0
  116. package/dist/types/WgpuFullscreenPipeline.js.map +1 -0
  117. package/dist/types/WgpuGpu.d.ts +7 -0
  118. package/dist/types/WgpuGpu.d.ts.map +1 -0
  119. package/dist/types/WgpuGpu.js +2 -0
  120. package/dist/types/WgpuGpu.js.map +1 -0
  121. package/dist/types/WgpuHost.d.ts +44 -0
  122. package/dist/types/WgpuHost.d.ts.map +1 -0
  123. package/dist/types/WgpuHost.js +2 -0
  124. package/dist/types/WgpuHost.js.map +1 -0
  125. package/dist/types/WgpuMeshMaterialRenderer.d.ts +11 -0
  126. package/dist/types/WgpuMeshMaterialRenderer.d.ts.map +1 -0
  127. package/dist/types/WgpuMeshMaterialRenderer.js +2 -0
  128. package/dist/types/WgpuMeshMaterialRenderer.js.map +1 -0
  129. package/dist/types/WgpuModifierSnippet.d.ts +16 -0
  130. package/dist/types/WgpuModifierSnippet.d.ts.map +1 -0
  131. package/dist/types/WgpuModifierSnippet.js +2 -0
  132. package/dist/types/WgpuModifierSnippet.js.map +1 -0
  133. package/dist/types/WgpuParticleResources.d.ts +12 -0
  134. package/dist/types/WgpuParticleResources.d.ts.map +1 -0
  135. package/dist/types/WgpuParticleResources.js +2 -0
  136. package/dist/types/WgpuParticleResources.js.map +1 -0
  137. package/dist/types/WgpuPipelineLayout.d.ts +8 -0
  138. package/dist/types/WgpuPipelineLayout.d.ts.map +1 -0
  139. package/dist/types/WgpuPipelineLayout.js +2 -0
  140. package/dist/types/WgpuPipelineLayout.js.map +1 -0
  141. package/dist/types/WgpuQuadBatchResources.d.ts +12 -0
  142. package/dist/types/WgpuQuadBatchResources.d.ts.map +1 -0
  143. package/dist/types/WgpuQuadBatchResources.js +2 -0
  144. package/dist/types/WgpuQuadBatchResources.js.map +1 -0
  145. package/dist/types/WgpuQuadMaterialRenderer.d.ts +9 -0
  146. package/dist/types/WgpuQuadMaterialRenderer.d.ts.map +1 -0
  147. package/dist/types/WgpuQuadMaterialRenderer.js +2 -0
  148. package/dist/types/WgpuQuadMaterialRenderer.js.map +1 -0
  149. package/dist/types/WgpuQueue.d.ts +12 -0
  150. package/dist/types/WgpuQueue.d.ts.map +1 -0
  151. package/dist/types/WgpuQueue.js +2 -0
  152. package/dist/types/WgpuQueue.js.map +1 -0
  153. package/dist/types/WgpuRenderOptions.d.ts +14 -0
  154. package/dist/types/WgpuRenderOptions.d.ts.map +1 -0
  155. package/dist/types/WgpuRenderOptions.js +2 -0
  156. package/dist/types/WgpuRenderOptions.js.map +1 -0
  157. package/dist/types/WgpuRenderPass.d.ts +31 -0
  158. package/dist/types/WgpuRenderPass.d.ts.map +1 -0
  159. package/dist/types/WgpuRenderPass.js +2 -0
  160. package/dist/types/WgpuRenderPass.js.map +1 -0
  161. package/dist/types/WgpuRenderPassEncoder.d.ts +52 -0
  162. package/dist/types/WgpuRenderPassEncoder.d.ts.map +1 -0
  163. package/dist/types/WgpuRenderPassEncoder.js +2 -0
  164. package/dist/types/WgpuRenderPassEncoder.js.map +1 -0
  165. package/dist/types/WgpuRenderPipeline.d.ts +96 -0
  166. package/dist/types/WgpuRenderPipeline.d.ts.map +1 -0
  167. package/dist/types/WgpuRenderPipeline.js +9 -0
  168. package/dist/types/WgpuRenderPipeline.js.map +1 -0
  169. package/dist/types/WgpuRenderState.d.ts +249 -0
  170. package/dist/types/WgpuRenderState.d.ts.map +1 -0
  171. package/dist/types/WgpuRenderState.js +2 -0
  172. package/dist/types/WgpuRenderState.js.map +1 -0
  173. package/dist/types/WgpuRenderStateOptions.d.ts +31 -0
  174. package/dist/types/WgpuRenderStateOptions.d.ts.map +1 -0
  175. package/dist/types/WgpuRenderStateOptions.js +2 -0
  176. package/dist/types/WgpuRenderStateOptions.js.map +1 -0
  177. package/dist/types/WgpuRenderTarget.d.ts +62 -0
  178. package/dist/types/WgpuRenderTarget.d.ts.map +1 -0
  179. package/dist/types/WgpuRenderTarget.js +2 -0
  180. package/dist/types/WgpuRenderTarget.js.map +1 -0
  181. package/dist/types/WgpuRenderTexture.d.ts +25 -0
  182. package/dist/types/WgpuRenderTexture.d.ts.map +1 -0
  183. package/dist/types/WgpuRenderTexture.js +2 -0
  184. package/dist/types/WgpuRenderTexture.js.map +1 -0
  185. package/dist/types/WgpuSampler.d.ts +19 -0
  186. package/dist/types/WgpuSampler.d.ts.map +1 -0
  187. package/dist/types/WgpuSampler.js +2 -0
  188. package/dist/types/WgpuSampler.js.map +1 -0
  189. package/dist/types/WgpuScene3DRuntime.d.ts +6 -0
  190. package/dist/types/WgpuScene3DRuntime.d.ts.map +1 -0
  191. package/dist/types/WgpuScene3DRuntime.js +2 -0
  192. package/dist/types/WgpuScene3DRuntime.js.map +1 -0
  193. package/dist/types/WgpuShaderModule.d.ts +6 -0
  194. package/dist/types/WgpuShaderModule.d.ts.map +1 -0
  195. package/dist/types/WgpuShaderModule.js +2 -0
  196. package/dist/types/WgpuShaderModule.js.map +1 -0
  197. package/dist/types/WgpuShapeMesh.d.ts +7 -0
  198. package/dist/types/WgpuShapeMesh.d.ts.map +1 -0
  199. package/dist/types/WgpuShapeMesh.js +2 -0
  200. package/dist/types/WgpuShapeMesh.js.map +1 -0
  201. package/dist/types/WgpuSkinningAdapter.d.ts +18 -0
  202. package/dist/types/WgpuSkinningAdapter.d.ts.map +1 -0
  203. package/dist/types/WgpuSkinningAdapter.js +2 -0
  204. package/dist/types/WgpuSkinningAdapter.js.map +1 -0
  205. package/dist/types/WgpuSurface.d.ts +5 -0
  206. package/dist/types/WgpuSurface.d.ts.map +1 -0
  207. package/dist/types/WgpuSurface.js +2 -0
  208. package/dist/types/WgpuSurface.js.map +1 -0
  209. package/dist/types/WgpuTexture.d.ts +58 -0
  210. package/dist/types/WgpuTexture.d.ts.map +1 -0
  211. package/dist/types/WgpuTexture.js +9 -0
  212. package/dist/types/WgpuTexture.js.map +1 -0
  213. package/dist/types/WgpuTextureFormat.d.ts +2 -0
  214. package/dist/types/WgpuTextureFormat.d.ts.map +1 -0
  215. package/dist/types/WgpuTextureFormat.js +2 -0
  216. package/dist/types/WgpuTextureFormat.js.map +1 -0
  217. package/dist/types/WgpuTextureResolver.d.ts +4 -0
  218. package/dist/types/WgpuTextureResolver.d.ts.map +1 -0
  219. package/dist/types/WgpuTextureResolver.js +2 -0
  220. package/dist/types/WgpuTextureResolver.js.map +1 -0
  221. package/dist/types/WgpuTextureView.d.ts +16 -0
  222. package/dist/types/WgpuTextureView.d.ts.map +1 -0
  223. package/dist/types/WgpuTextureView.js +2 -0
  224. package/dist/types/WgpuTextureView.js.map +1 -0
  225. package/dist/types/WgpuUniformEndianness.d.ts +7 -0
  226. package/dist/types/WgpuUniformEndianness.d.ts.map +1 -0
  227. package/dist/types/WgpuUniformEndianness.js +2 -0
  228. package/dist/types/WgpuUniformEndianness.js.map +1 -0
  229. package/dist/types/WgpuVelocityWriter.d.ts +11 -0
  230. package/dist/types/WgpuVelocityWriter.d.ts.map +1 -0
  231. package/dist/types/WgpuVelocityWriter.js +2 -0
  232. package/dist/types/WgpuVelocityWriter.js.map +1 -0
  233. package/dist/wgpuAdapterCapabilities.d.ts +2 -2
  234. package/dist/wgpuAdapterCapabilities.d.ts.map +1 -1
  235. package/dist/wgpuAdapterCapabilities.js.map +1 -1
  236. package/dist/wgpuCompressedTexture.d.ts +7 -5
  237. package/dist/wgpuCompressedTexture.d.ts.map +1 -1
  238. package/dist/wgpuCompressedTexture.js +10 -18
  239. package/dist/wgpuCompressedTexture.js.map +1 -1
  240. package/dist/wgpuDeviceLoss.d.ts +2 -2
  241. package/dist/wgpuDeviceLoss.d.ts.map +1 -1
  242. package/dist/wgpuDeviceLoss.js +1 -1
  243. package/dist/wgpuDeviceLoss.js.map +1 -1
  244. package/dist/wgpuDraw.d.ts +11 -5
  245. package/dist/wgpuDraw.d.ts.map +1 -1
  246. package/dist/wgpuDraw.js +21 -20
  247. package/dist/wgpuDraw.js.map +1 -1
  248. package/dist/wgpuExternalImageSource.d.ts +3 -2
  249. package/dist/wgpuExternalImageSource.d.ts.map +1 -1
  250. package/dist/wgpuExternalImageSource.js.map +1 -1
  251. package/dist/wgpuExternalTexture.d.ts +7 -3
  252. package/dist/wgpuExternalTexture.d.ts.map +1 -1
  253. package/dist/wgpuExternalTexture.js +5 -5
  254. package/dist/wgpuExternalTexture.js.map +1 -1
  255. package/dist/wgpuFrame.d.ts +23 -0
  256. package/dist/wgpuFrame.d.ts.map +1 -0
  257. package/dist/{wgpuBackground.js → wgpuFrame.js} +67 -122
  258. package/dist/wgpuFrame.js.map +1 -0
  259. package/dist/wgpuFullscreenPass.d.ts +5 -4
  260. package/dist/wgpuFullscreenPass.d.ts.map +1 -1
  261. package/dist/wgpuFullscreenPass.js +22 -8
  262. package/dist/wgpuFullscreenPass.js.map +1 -1
  263. package/dist/wgpuHost.d.ts +4 -7
  264. package/dist/wgpuHost.d.ts.map +1 -1
  265. package/dist/wgpuHost.js +81 -70
  266. package/dist/wgpuHost.js.map +1 -1
  267. package/dist/wgpuMipmap.d.ts +2 -2
  268. package/dist/wgpuMipmap.d.ts.map +1 -1
  269. package/dist/wgpuMipmap.js +4 -3
  270. package/dist/wgpuMipmap.js.map +1 -1
  271. package/dist/wgpuQuadMaterialRegistry.d.ts +7 -0
  272. package/dist/wgpuQuadMaterialRegistry.d.ts.map +1 -0
  273. package/dist/wgpuQuadMaterialRegistry.js +33 -0
  274. package/dist/wgpuQuadMaterialRegistry.js.map +1 -0
  275. package/dist/wgpuRenderPass.d.ts +9 -0
  276. package/dist/wgpuRenderPass.d.ts.map +1 -0
  277. package/dist/wgpuRenderPass.js +210 -0
  278. package/dist/wgpuRenderPass.js.map +1 -0
  279. package/dist/wgpuRenderState.d.ts +16 -12
  280. package/dist/wgpuRenderState.d.ts.map +1 -1
  281. package/dist/wgpuRenderState.js +104 -149
  282. package/dist/wgpuRenderState.js.map +1 -1
  283. package/dist/wgpuRenderTarget.d.ts +13 -29
  284. package/dist/wgpuRenderTarget.d.ts.map +1 -1
  285. package/dist/wgpuRenderTarget.js +20 -253
  286. package/dist/wgpuRenderTarget.js.map +1 -1
  287. package/dist/wgpuRenderTargetPool.d.ts +8 -6
  288. package/dist/wgpuRenderTargetPool.d.ts.map +1 -1
  289. package/dist/wgpuRenderTargetPool.js +9 -9
  290. package/dist/wgpuRenderTargetPool.js.map +1 -1
  291. package/dist/wgpuRenderTexture.d.ts +7 -4
  292. package/dist/wgpuRenderTexture.d.ts.map +1 -1
  293. package/dist/wgpuRenderTexture.js +15 -17
  294. package/dist/wgpuRenderTexture.js.map +1 -1
  295. package/dist/wgpuRenderTexturePool.d.ts +3 -1
  296. package/dist/wgpuRenderTexturePool.d.ts.map +1 -1
  297. package/dist/wgpuRenderTexturePool.js +5 -7
  298. package/dist/wgpuRenderTexturePool.js.map +1 -1
  299. package/dist/wgpuScissor.d.ts +3 -3
  300. package/dist/wgpuScissor.d.ts.map +1 -1
  301. package/dist/wgpuScissor.js +8 -5
  302. package/dist/wgpuScissor.js.map +1 -1
  303. package/dist/wgpuScreenAntialias.d.ts +3 -0
  304. package/dist/wgpuScreenAntialias.d.ts.map +1 -0
  305. package/dist/wgpuScreenAntialias.js +120 -0
  306. package/dist/wgpuScreenAntialias.js.map +1 -0
  307. package/dist/wgpuScreenCapture.d.ts +6 -0
  308. package/dist/wgpuScreenCapture.d.ts.map +1 -0
  309. package/dist/wgpuScreenCapture.js +138 -0
  310. package/dist/wgpuScreenCapture.js.map +1 -0
  311. package/dist/wgpuScreenRenderTarget.d.ts +11 -0
  312. package/dist/wgpuScreenRenderTarget.d.ts.map +1 -0
  313. package/dist/wgpuScreenRenderTarget.js +121 -0
  314. package/dist/wgpuScreenRenderTarget.js.map +1 -0
  315. package/dist/wgpuShader.d.ts +11 -8
  316. package/dist/wgpuShader.d.ts.map +1 -1
  317. package/dist/wgpuShader.js +11 -10
  318. package/dist/wgpuShader.js.map +1 -1
  319. package/dist/wgpuShaderBinding.d.ts +3 -1
  320. package/dist/wgpuShaderBinding.d.ts.map +1 -1
  321. package/dist/wgpuShaderBinding.js +1 -1
  322. package/dist/wgpuShaderBinding.js.map +1 -1
  323. package/dist/wgpuShaderRegistry.d.ts +1 -1
  324. package/dist/wgpuShaderRegistry.d.ts.map +1 -1
  325. package/dist/wgpuShaderRegistry.js +1 -1
  326. package/dist/wgpuShaderRegistry.js.map +1 -1
  327. package/dist/wgpuTestHelper.d.ts +11 -2
  328. package/dist/wgpuTestHelper.d.ts.map +1 -1
  329. package/dist/wgpuTestHelper.js +50 -38
  330. package/dist/wgpuTestHelper.js.map +1 -1
  331. package/dist/wgpuTextureRenderTarget.d.ts +22 -0
  332. package/dist/wgpuTextureRenderTarget.d.ts.map +1 -0
  333. package/dist/wgpuTextureRenderTarget.js +123 -0
  334. package/dist/wgpuTextureRenderTarget.js.map +1 -0
  335. package/dist/wgpuTextureResolver.d.ts +5 -1
  336. package/dist/wgpuTextureResolver.d.ts.map +1 -1
  337. package/dist/wgpuTextureResolver.js +13 -12
  338. package/dist/wgpuTextureResolver.js.map +1 -1
  339. package/dist/wgpuTextureUpload.d.ts +5 -4
  340. package/dist/wgpuTextureUpload.d.ts.map +1 -1
  341. package/dist/wgpuTextureUpload.js +1 -1
  342. package/dist/wgpuTextureUpload.js.map +1 -1
  343. package/package.json +33 -13
  344. package/src/enableWgpuTextureResolverGuards.test.ts +40 -19
  345. package/src/explainWgpuTextureResolution.test.ts +6 -6
  346. package/src/explainWgpuUniformEndianness.test.ts +11 -0
  347. package/src/types/WgpuBindGroupLayout.test.ts +9 -0
  348. package/src/types/WgpuBuffer.test.ts +26 -0
  349. package/src/types/WgpuGpu.test.ts +56 -0
  350. package/src/types/WgpuRenderPipeline.test.ts +12 -0
  351. package/src/types/WgpuTexture.test.ts +15 -0
  352. package/src/wgpuAdapterCapabilities.test.ts +5 -4
  353. package/src/wgpuCompressedTexture.test.ts +31 -37
  354. package/src/wgpuDeviceLoss.test.ts +31 -24
  355. package/src/wgpuDraw.test.ts +21 -24
  356. package/src/wgpuExternalImageSource.test.ts +12 -11
  357. package/src/wgpuExternalTexture.test.ts +7 -6
  358. package/src/{wgpuBackground.test.ts → wgpuFrame.test.ts} +47 -29
  359. package/src/wgpuFullscreenPass.test.ts +8 -8
  360. package/src/wgpuHost.test.ts +57 -186
  361. package/src/wgpuMipmap.test.ts +15 -9
  362. package/src/wgpuQuadMaterialRegistry.test.ts +132 -0
  363. package/src/wgpuRenderPass.test.ts +239 -0
  364. package/src/wgpuRenderState.test.ts +215 -550
  365. package/src/wgpuRenderTarget.test.ts +44 -220
  366. package/src/wgpuRenderTargetPool.test.ts +23 -23
  367. package/src/wgpuRenderTexture.test.ts +21 -18
  368. package/src/wgpuRenderTexturePool.test.ts +3 -3
  369. package/src/wgpuScissor.test.ts +50 -19
  370. package/src/wgpuScreenAntialias.test.ts +65 -0
  371. package/src/wgpuScreenCapture.test.ts +165 -0
  372. package/src/wgpuScreenRenderTarget.test.ts +172 -0
  373. package/src/wgpuShader.test.ts +12 -11
  374. package/src/wgpuShaderBinding.test.ts +4 -4
  375. package/src/wgpuShaderRegistry.test.ts +4 -5
  376. package/src/wgpuTestHelper.test.ts +8 -7
  377. package/src/wgpuTextureRenderTarget.test.ts +129 -0
  378. package/src/wgpuTextureResolver.test.ts +25 -14
  379. package/src/wgpuTextureUpload.test.ts +15 -10
  380. package/dist/wgpuAntialias.d.ts +0 -14
  381. package/dist/wgpuAntialias.d.ts.map +0 -1
  382. package/dist/wgpuAntialias.js +0 -155
  383. package/dist/wgpuAntialias.js.map +0 -1
  384. package/dist/wgpuBackground.d.ts +0 -20
  385. package/dist/wgpuBackground.d.ts.map +0 -1
  386. package/dist/wgpuBackground.js.map +0 -1
  387. package/dist/wgpuElement.d.ts +0 -7
  388. package/dist/wgpuElement.d.ts.map +0 -1
  389. package/dist/wgpuElement.js +0 -20
  390. package/dist/wgpuElement.js.map +0 -1
  391. package/dist/wgpuMaterialRegistry.d.ts +0 -5
  392. package/dist/wgpuMaterialRegistry.d.ts.map +0 -1
  393. package/dist/wgpuMaterialRegistry.js +0 -32
  394. package/dist/wgpuMaterialRegistry.js.map +0 -1
  395. package/dist/wgpuPipeline.d.ts +0 -6
  396. package/dist/wgpuPipeline.d.ts.map +0 -1
  397. package/dist/wgpuPipeline.js +0 -33
  398. package/dist/wgpuPipeline.js.map +0 -1
  399. package/dist/wgpuSurface.d.ts +0 -6
  400. package/dist/wgpuSurface.d.ts.map +0 -1
  401. package/dist/wgpuSurface.js +0 -155
  402. package/dist/wgpuSurface.js.map +0 -1
  403. package/src/wgpuAntialias.test.ts +0 -239
  404. package/src/wgpuElement.test.ts +0 -145
  405. package/src/wgpuMaterialRegistry.test.ts +0 -100
  406. package/src/wgpuPipeline.test.ts +0 -62
  407. package/src/wgpuSurface.test.ts +0 -141
@@ -1,12 +1,14 @@
1
- import { renderWgpuBackground } from './wgpuBackground';
2
- import { getWgpuRenderStateRuntime } from './wgpuRenderState';
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
- renderWgpuBackground(state);
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 GPURenderPassEncoder;
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
- renderWgpuBackground(state);
32
+ beginWgpuScreenRenderPassForTest(state);
31
33
  const calls: number[][] = [];
32
- const fakePass = { setScissorRect: (...args: number[]) => calls.push(args) } as unknown as GPURenderPassEncoder;
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
- renderWgpuBackground(state);
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 GPURenderPassEncoder;
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
- renderWgpuBackground(state);
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
- renderWgpuBackground(state);
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
- renderWgpuBackground(state);
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
- renderWgpuBackground(state);
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
- renderWgpuBackground(state);
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 on the acquired supersample surface', async () => {
106
- const state = await createWgpuRenderStateForTest({ antialias: true });
107
- renderWgpuBackground(state);
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 GPURenderPassEncoder, 3, 5, 7, 11);
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
+ });
@@ -1,7 +1,8 @@
1
- import { AdvancedBlendMode, BlendMode } from '@flighthq/types/contract';
1
+ import { AdvancedBlendMode } from '@flighthq/effects/contract';
2
+ import { BlendMode } from '@flighthq/materials/contract';
2
3
 
3
- import { renderWgpuBackground } from './wgpuBackground';
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: GPURenderPipelineDescriptor })
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: GPURenderPipelineDescriptor })
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
- renderWgpuBackground(state);
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
- renderWgpuBackground(state);
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
- renderWgpuBackground(state);
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
- renderWgpuBackground(state);
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 { getWgpuRenderStateRuntime } from './wgpuRenderState';
6
- import { getWgpuShader, resolveWgpuShader, setWgpuShader } from './wgpuShaderBinding';
7
- import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
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 '@flighthq/types/contract';
2
-
3
- import { getWgpuRenderStateRuntime } from './wgpuRenderState';
4
- import { registerWgpuBitmapShader } from './wgpuShaderRegistry';
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();