@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.
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 +29 -16
  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 +10 -10
  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,49 +1,39 @@
1
- import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
- import type { Entity, WgpuHostAcquisition, WgpuHostBackend } from '@flighthq/types/contract';
3
- import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest';
1
+ import { allocateEntity } from '@flighthq/entity/contract';
2
+ import { beforeAll, describe, expect, it, vi } from 'vitest';
4
3
 
4
+ import type { WgpuDevice, WgpuHostAcquisition } from './contract.render-wgpu-types.ts';
5
+ import { WgpuBufferUsage } from './contract.render-wgpu-types.ts';
6
+ import { createTestWgpuSurface, testWgpuHost } from './wgpuHost.ts';
5
7
  import {
6
- createWebWgpuHostBackend,
7
- getWgpuHostBackend,
8
- initializeWebWgpuHostBackend,
9
- installWgpuHostBackend,
10
- resetWgpuHostBackendForTest,
11
- setWgpuHostBackend,
12
- } from './wgpuHost';
13
- import { createEmptyWgpuRegistries, createWgpuPipeline } from './wgpuPipeline';
14
- import {
8
+ createWgpuAcquisition,
15
9
  createWgpuRenderState,
16
- createWgpuRenderStateFromCanvasElement,
17
10
  destroyWgpuRenderState,
18
- } from './wgpuRenderState';
19
- import { installWgpuMock } from './wgpuTestHelper';
20
-
21
- function fakeBackend(): WgpuHostBackend {
22
- return entityBackend({
23
- acquire: vi.fn(),
24
- isSupported: vi.fn(() => true),
25
- release: vi.fn(),
26
- });
27
- }
28
-
29
- function entityBackend(fields: Omit<WgpuHostBackend, keyof Entity>): WgpuHostBackend {
30
- return (() => {
31
- const out = allocateEntity<WgpuHostBackend>();
32
- Object.assign(out, fields);
33
- return finishEntity(out);
34
- })();
35
- }
11
+ releaseWgpuAcquisition,
12
+ } from './wgpuRenderState.ts';
13
+ import { installWgpuMock } from './wgpuTestHelper.ts';
36
14
 
37
15
  beforeAll(installWgpuMock);
38
- afterEach(resetWgpuHostBackendForTest);
39
16
 
40
- const _pipeline = createWgpuPipeline(createEmptyWgpuRegistries());
17
+ describe('createTestWgpuSurface', () => {
18
+ const ATTACHMENT = { alphaMode: 'premultiplied', device: {} as WgpuDevice, format: 'bgra8unorm' } as const;
19
+
20
+ it('builds a surface the test host backend can resolve back to its canvas', () => {
21
+ const canvas = document.createElement('canvas');
22
+ const surface = createTestWgpuSurface(canvas);
41
23
 
42
- describe('createWebWgpuHostBackend', () => {
24
+ // The drawable lives on the runtime, not on the entity: nothing about the canvas is visible on the
25
+ // public surface, and the host is the only code that narrows it back.
26
+ expect(Object.keys(surface)).toEqual([]);
27
+ expect(() => testWgpuHost.attachSurface(surface, ATTACHMENT)).not.toThrow();
28
+ });
29
+ });
30
+
31
+ describe('testWgpuHost', () => {
43
32
  it('acquires Flight-owned browser handles and releases each native handle', async () => {
44
- const backend = createWebWgpuHostBackend();
33
+ const backend = testWgpuHost;
45
34
  const canvas = document.createElement('canvas');
46
- const acquisition = await backend.acquire(canvas, {});
35
+ const target = createTestWgpuSurface(canvas);
36
+ const acquisition = await backend.acquire(target, {});
47
37
  const unconfigure = vi.spyOn(acquisition.context, 'unconfigure');
48
38
  const destroy = vi.spyOn(acquisition.device, 'destroy');
49
39
 
@@ -53,14 +43,11 @@ describe('createWebWgpuHostBackend', () => {
53
43
  expect(destroy).toHaveBeenCalledOnce();
54
44
  });
55
45
 
56
- // ★ THE BACKEND NO LONGER DECIDES OWNERSHIP. It used to return early for `caller`, which meant the whole
57
- // contract lived in one implementation and any other backend could violate it unseen — and it also made
58
- // the caller's own release verb a no-op. `release` now tears down whatever it is handed; Flight simply
59
- // never hands it a caller-owned acquisition (see O1/O2), and `releaseWgpuAcquisition` hands it one only
60
- // because the caller asked.
61
46
  it('tears down whatever it is handed, leaving the ownership decision to the caller', async () => {
62
- const backend = createWebWgpuHostBackend();
63
- const acquired = await backend.acquire(document.createElement('canvas'), {});
47
+ const backend = testWgpuHost;
48
+ const canvas = document.createElement('canvas');
49
+ const target = createTestWgpuSurface(canvas);
50
+ const acquired = await backend.acquire(target, {});
64
51
  const acquisition = allocateEntity<WgpuHostAcquisition>();
65
52
  Object.assign(acquisition, acquired);
66
53
  acquisition.ownership = 'caller' as const;
@@ -80,173 +67,57 @@ describe('createWebWgpuHostBackend', () => {
80
67
  },
81
68
  });
82
69
  try {
83
- expect(createWebWgpuHostBackend().isSupported()).toBe(false);
70
+ expect(testWgpuHost.isSupported()).toBe(false);
84
71
  } finally {
85
72
  installWgpuMock();
86
73
  }
87
74
  });
88
- });
89
-
90
- describe('getWgpuHostBackend', () => {
91
- it('returns one stable explicit web fallback', () => {
92
- const first = getWgpuHostBackend();
93
- const second = getWgpuHostBackend();
94
- expect(first).toBe(second);
95
- });
96
- });
97
75
 
98
- describe('initializeWebWgpuHostBackend', () => {
99
- it('is the construction initializer of createWebWgpuHostBackend', () => {
100
- expect(typeof initializeWebWgpuHostBackend).toBe('function');
101
- });
102
- });
103
-
104
- describe('installWgpuHostBackend', () => {
105
- it('preserves the first installed host identity', () => {
106
- const first = fakeBackend();
107
- installWgpuHostBackend(first);
108
- installWgpuHostBackend(fakeBackend());
109
- expect(getWgpuHostBackend()).toBe(first);
110
- });
111
- });
112
-
113
- describe('resetWgpuHostBackendForTest', () => {
114
- it('clears custom and host slots back to the web fallback', () => {
115
- const fallback = getWgpuHostBackend();
116
- const host = fakeBackend();
117
- const custom = fakeBackend();
118
- installWgpuHostBackend(host);
119
- setWgpuHostBackend(custom);
120
-
121
- resetWgpuHostBackendForTest();
122
- expect(getWgpuHostBackend()).toBe(fallback);
123
- });
124
- });
125
- describe('setWgpuHostBackend', () => {
126
- it('routes acquisition and release through the same selected backend', async () => {
127
- const web = createWebWgpuHostBackend();
128
- const acquired = await web.acquire(document.createElement('canvas'), {});
129
- // Flight-owned: the state acquired these, so destroying it releases them. The caller-owned case is the
130
- // opposite assertion and lives in its own test below.
131
- const acquisition = allocateEntity<WgpuHostAcquisition>();
132
- Object.assign(acquisition, acquired);
133
- acquisition.ownership = 'flight' as const;
134
- const backend = entityBackend({
135
- acquire: vi.fn(async () => acquisition),
136
- isSupported: vi.fn(() => true),
137
- release: vi.fn(),
138
- });
76
+ it('routes acquisition and release through a caller-provided backend', async () => {
77
+ const web = testWgpuHost;
139
78
  const canvas = document.createElement('canvas');
140
- setWgpuHostBackend(backend);
141
-
142
- const state = await createWgpuRenderStateFromCanvasElement(canvas, _pipeline);
143
- expect(backend.acquire).toHaveBeenCalledWith(canvas, { format: undefined, powerPreference: undefined });
144
- expect(state.context).toBe(acquisition.context);
145
- expect(state.device).toBe(acquisition.device);
146
- expect(state.format).toBe(acquisition.format);
147
- destroyWgpuRenderState(state);
148
- expect(backend.release).toHaveBeenCalledOnce();
149
- expect(backend.release).toHaveBeenCalledWith(acquisition);
150
-
151
- web.release(acquired);
152
- });
153
-
154
- it('releases flight-owned handles through the selected backend when initialization fails', async () => {
155
- const web = createWebWgpuHostBackend();
156
- const acquired = await web.acquire(document.createElement('canvas'), {});
79
+ const target = createTestWgpuSurface(canvas);
80
+ const acquired = await web.acquire(target, {});
157
81
  const acquisition = allocateEntity<WgpuHostAcquisition>();
158
82
  Object.assign(acquisition, acquired);
159
- acquisition.ownership = 'flight' as const;
160
- const configure = vi.spyOn(acquisition.context, 'configure').mockImplementationOnce(() => {
161
- throw new Error('configure failed');
162
- });
163
- const backend = entityBackend({
83
+ acquisition.ownership = 'caller' as const;
84
+ const backend: typeof web = {
164
85
  acquire: vi.fn(async () => acquisition),
86
+ attachSurface: vi.fn(() => null),
87
+ create: vi.fn(),
165
88
  isSupported: vi.fn(() => true),
166
89
  release: vi.fn(),
167
- });
168
- setWgpuHostBackend(backend);
90
+ } as typeof web;
91
+ const routeTarget = createTestWgpuSurface(document.createElement('canvas'));
92
+
93
+ const routed = await createWgpuAcquisition(backend, routeTarget);
94
+ expect(backend.acquire).toHaveBeenCalledWith(routeTarget, {});
95
+ expect(routed?.device).toBe(acquisition.device);
96
+ expect(routed?.format).toBe(acquisition.format);
169
97
 
170
- expect(() => createWgpuRenderState(acquisition, _pipeline)).toThrow('configure failed');
98
+ releaseWgpuAcquisition(backend, acquisition);
171
99
  expect(backend.release).toHaveBeenCalledOnce();
172
100
  expect(backend.release).toHaveBeenCalledWith(acquisition);
173
101
 
174
- configure.mockRestore();
175
102
  web.release(acquired);
176
103
  });
177
104
 
178
- // ★ O2. The previous shape of this test used a CALLER-owned acquisition and asserted release WAS called,
179
- // with a `vi.fn()` release that could not destroy anything — so it passed whether or not ownership was
180
- // honoured. Flight now refuses to release borrowed handles even while unwinding a failure, and the
181
- // backend here is deliberately one that would destroy them if asked.
182
- it('O2: never releases caller-owned handles when initialization fails, whatever the backend does', async () => {
183
- const web = createWebWgpuHostBackend();
184
- const acquired = await web.acquire(document.createElement('canvas'), {});
185
- const acquisition = allocateEntity<WgpuHostAcquisition>();
186
- Object.assign(acquisition, acquired);
187
- acquisition.ownership = 'caller' as const;
188
- const configure = vi.spyOn(acquisition.context, 'configure').mockImplementationOnce(() => {
189
- throw new Error('configure failed');
190
- });
191
- const destroy = vi.spyOn(acquisition.device, 'destroy');
192
- const unconfigure = vi.spyOn(acquisition.context, 'unconfigure');
193
- const backend = entityBackend({
194
- acquire: vi.fn(async () => acquisition),
195
- isSupported: vi.fn(() => true),
196
- release: vi.fn((held) => {
197
- held.context.unconfigure();
198
- held.device.destroy();
199
- }),
200
- });
201
- setWgpuHostBackend(backend);
105
+ it('never releases host handles when a state built on the device is destroyed', async () => {
106
+ const web = testWgpuHost;
107
+ const canvas = document.createElement('canvas');
108
+ const target = createTestWgpuSurface(canvas);
109
+ const acquired = await web.acquire(target, {});
110
+ const destroy = vi.spyOn(acquired.device, 'destroy');
111
+ const unconfigure = vi.spyOn(acquired.context, 'unconfigure');
112
+
113
+ destroyWgpuRenderState(createWgpuRenderState(acquired.device));
202
114
 
203
- expect(() => createWgpuRenderState(acquisition, _pipeline)).toThrow('configure failed');
204
- expect(backend.release).not.toHaveBeenCalled();
205
115
  expect(destroy).not.toHaveBeenCalled();
206
116
  expect(unconfigure).not.toHaveBeenCalled();
117
+ expect(acquired.device.createBuffer({ size: 4, usage: WgpuBufferUsage.COPY_DST }).size).toBe(4);
207
118
 
208
- configure.mockRestore();
209
119
  destroy.mockRestore();
210
120
  unconfigure.mockRestore();
211
121
  web.release(acquired);
212
122
  });
213
-
214
- // ★ O1. The destroy path, against a backend whose release really destroys.
215
- it('O1: never releases caller-owned handles when the state is destroyed', async () => {
216
- const web = createWebWgpuHostBackend();
217
- const acquired = await web.acquire(document.createElement('canvas'), {});
218
- const acquisition = allocateEntity<WgpuHostAcquisition>();
219
- Object.assign(acquisition, acquired);
220
- acquisition.ownership = 'caller' as const;
221
- const destroy = vi.spyOn(acquisition.device, 'destroy');
222
- const backend = entityBackend({
223
- acquire: vi.fn(async () => acquisition),
224
- isSupported: vi.fn(() => true),
225
- release: vi.fn((held) => {
226
- held.device.destroy();
227
- }),
228
- });
229
- setWgpuHostBackend(backend);
230
-
231
- const state = createWgpuRenderState(acquisition, _pipeline);
232
- destroyWgpuRenderState(state);
233
-
234
- expect(backend.release).not.toHaveBeenCalled();
235
- expect(destroy).not.toHaveBeenCalled();
236
- // The handles are still usable, which is the property the caller actually cares about.
237
- expect(acquisition.device.createBuffer({ size: 4, usage: GPUBufferUsage.COPY_DST }).size).toBe(4);
238
-
239
- destroy.mockRestore();
240
- web.release(acquired);
241
- });
242
-
243
- it('takes precedence over host installation and reveals that host when cleared', () => {
244
- const host = fakeBackend();
245
- const custom = fakeBackend();
246
- installWgpuHostBackend(host);
247
- setWgpuHostBackend(custom);
248
- expect(getWgpuHostBackend()).toBe(custom);
249
- setWgpuHostBackend(null);
250
- expect(getWgpuHostBackend()).toBe(host);
251
- });
252
123
  });
@@ -1,15 +1,21 @@
1
- import type { WgpuRenderState } from '@flighthq/types/contract';
2
-
3
- import { generateWgpuMipmaps, getWgpuMipLevelCount, registerWgpuMipmapGeneration } from './wgpuMipmap';
4
- import { getWgpuRenderStateRuntime } from './wgpuRenderState';
5
- import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
1
+ import type {
2
+ WgpuCommandBuffer,
3
+ WgpuCommandEncoder,
4
+ WgpuRenderPassEncoder,
5
+ WgpuRenderState,
6
+ WgpuTexture,
7
+ WgpuTextureView,
8
+ } from './contract.render-wgpu-types.ts';
9
+ import { generateWgpuMipmaps, getWgpuMipLevelCount, registerWgpuMipmapGeneration } from './wgpuMipmap.ts';
10
+ import { getWgpuRenderStateRuntime } from './wgpuRenderState.ts';
11
+ import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper.ts';
6
12
 
7
13
  beforeAll(() => {
8
14
  installWgpuMock();
9
15
  });
10
16
 
11
- function makeTextureSpy(): GPUTexture {
12
- return { createView: vi.fn(() => ({}) as GPUTextureView), destroy: () => {} } as unknown as GPUTexture;
17
+ function makeTextureSpy(): WgpuTexture {
18
+ return { createView: vi.fn(() => ({}) as WgpuTextureView), destroy: () => {} } as unknown as WgpuTexture;
13
19
  }
14
20
 
15
21
  // Replaces the mock device's command encoder with one whose render passes are spies, so a test can
@@ -22,9 +28,9 @@ function spyEncoderPasses(state: WgpuRenderState): ReturnType<typeof vi.fn> {
22
28
  setBindGroup: vi.fn(),
23
29
  draw: vi.fn(),
24
30
  end: vi.fn(),
25
- }) as unknown as GPURenderPassEncoder,
31
+ }) as unknown as WgpuRenderPassEncoder,
26
32
  );
27
- const encoder = { beginRenderPass, finish: () => ({}) as GPUCommandBuffer } as unknown as GPUCommandEncoder;
33
+ const encoder = { beginRenderPass, finish: () => ({}) as WgpuCommandBuffer } as unknown as WgpuCommandEncoder;
28
34
  vi.spyOn(state.device, 'createCommandEncoder').mockReturnValue(encoder);
29
35
  return beginRenderPass;
30
36
  }
@@ -0,0 +1,132 @@
1
+ import { EntityRuntimeKey } from '@flighthq/entity/contract';
2
+ import {
3
+ addLogSink,
4
+ createLogState,
5
+ createMemoryLogSink,
6
+ getMemoryLogSinkEntries,
7
+ removeLogSink,
8
+ } from '@flighthq/log/contract';
9
+ import type { LogState } from '@flighthq/log/contract';
10
+ import type { LogEntry, MemoryLogSink } from '@flighthq/log/contract';
11
+ import type { Material } from '@flighthq/materials/contract';
12
+ import { StandardMaterialKind } from '@flighthq/materials/contract';
13
+ import { enableRenderRegistriesGuards, explainRenderRegistriesMisses } from '@flighthq/render/contract';
14
+ import { RenderRegistryTable } from '@flighthq/render/contract';
15
+
16
+ import type {
17
+ WgpuDevice,
18
+ WgpuQuadMaterialRenderer,
19
+ WgpuRenderState,
20
+ WgpuShaderModule,
21
+ } from './contract.render-wgpu-types.ts';
22
+ import {
23
+ getWgpuQuadMaterialRenderer,
24
+ registerWgpuQuadMaterialRenderer,
25
+ resolveWgpuQuadMaterialRenderer,
26
+ } from './wgpuQuadMaterialRegistry.ts';
27
+ import { createWgpuDeviceState, createWgpuRenderStateRuntime, getWgpuRenderStateRuntime } from './wgpuRenderState.ts';
28
+
29
+ // Each test logs into a fresh caller-owned state, so logOnce keys never leak between tests.
30
+ let logState: LogState;
31
+
32
+ beforeEach(() => {
33
+ logState = createLogState();
34
+ });
35
+
36
+ const TestKind = 'TestMaterial';
37
+ const testRenderer: WgpuQuadMaterialRenderer = {
38
+ instanceFloatCount: 0,
39
+ getShaderModule: () => ({}) as WgpuShaderModule,
40
+ };
41
+
42
+ function makeState(): WgpuRenderState {
43
+ const device = {} as WgpuDevice;
44
+ const state = { device } as WgpuRenderState;
45
+ state[EntityRuntimeKey] = createWgpuRenderStateRuntime(createWgpuDeviceState(device));
46
+ return state;
47
+ }
48
+
49
+ function makeMaterial(kind: string): Material {
50
+ return { kind } as Material;
51
+ }
52
+
53
+ describe('getWgpuQuadMaterialRenderer', () => {
54
+ it('returns null when nothing is registered for the kind', () => {
55
+ expect(getWgpuQuadMaterialRenderer(makeState(), TestKind)).toBeNull();
56
+ });
57
+ });
58
+
59
+ describe('registerWgpuQuadMaterialRenderer', () => {
60
+ it('registers a renderer retrievable by kind', () => {
61
+ const state = makeState();
62
+ const before = getWgpuRenderStateRuntime(state).registries.materialRenderers;
63
+ registerWgpuQuadMaterialRenderer(state, TestKind, testRenderer);
64
+ expect(getWgpuQuadMaterialRenderer(state, TestKind)).toBe(testRenderer);
65
+ expect(getWgpuRenderStateRuntime(state).registries.materialRenderers).not.toBe(before);
66
+ expect(before.size).toBe(0);
67
+ });
68
+
69
+ it('is last-write-wins without mutating the earlier snapshot', () => {
70
+ const state = makeState();
71
+ const replacement: WgpuQuadMaterialRenderer = {
72
+ instanceFloatCount: 0,
73
+ getShaderModule: () => ({}) as WgpuShaderModule,
74
+ };
75
+ registerWgpuQuadMaterialRenderer(state, TestKind, testRenderer);
76
+ const before = getWgpuRenderStateRuntime(state).registries.materialRenderers;
77
+
78
+ registerWgpuQuadMaterialRenderer(state, TestKind, replacement);
79
+
80
+ expect(getWgpuQuadMaterialRenderer(state, TestKind)).toBe(replacement);
81
+ expect(before.get(TestKind)).toEqual(testRenderer);
82
+ });
83
+ });
84
+
85
+ describe('resolveWgpuQuadMaterialRenderer', () => {
86
+ it('returns null when nothing is registered — no built-in fallback', () => {
87
+ expect(resolveWgpuQuadMaterialRenderer(makeState(), null)).toBeNull();
88
+ expect(resolveWgpuQuadMaterialRenderer(makeState(), makeMaterial(TestKind))).toBeNull();
89
+ });
90
+
91
+ it('returns the registered renderer for a material kind', () => {
92
+ const state = makeState();
93
+ registerWgpuQuadMaterialRenderer(state, TestKind, testRenderer);
94
+ expect(resolveWgpuQuadMaterialRenderer(state, makeMaterial(TestKind))).toBe(testRenderer);
95
+ });
96
+
97
+ it('falls back to the renderer registered for StandardMaterialKind', () => {
98
+ const state = makeState();
99
+ registerWgpuQuadMaterialRenderer(state, StandardMaterialKind, testRenderer);
100
+ expect(resolveWgpuQuadMaterialRenderer(state, makeMaterial('Other'))).toBe(testRenderer);
101
+ expect(resolveWgpuQuadMaterialRenderer(state, null)).toBe(testRenderer);
102
+ });
103
+
104
+ it('reports the missing kind against the wgpu registrar, not the gl one', () => {
105
+ const state = makeState();
106
+ enableRenderRegistriesGuards(state, logState);
107
+ const sink = createMemoryLogSink(4);
108
+ addLogSink(logState, sink.sink);
109
+
110
+ try {
111
+ resolveWgpuQuadMaterialRenderer(state, makeMaterial(TestKind));
112
+
113
+ expect(explainRenderRegistriesMisses(state).misses).toEqual([
114
+ { kind: TestKind, registry: RenderRegistryTable.MaterialRenderer },
115
+ ]);
116
+ expect(readMemoryLogEntries(sink)[0]?.data).toMatchObject({
117
+ kind: TestKind,
118
+ message:
119
+ 'resolveWgpuQuadMaterialRenderer: material kind has no registered renderer, so nodes using it do not draw — call registerWgpuQuadMaterialRenderer(state, kind, renderer)',
120
+ registry: RenderRegistryTable.MaterialRenderer,
121
+ });
122
+ } finally {
123
+ removeLogSink(logState, sink.sink);
124
+ }
125
+ });
126
+ });
127
+
128
+ function readMemoryLogEntries(handle: Readonly<MemoryLogSink>): LogEntry[] {
129
+ const entries: LogEntry[] = [];
130
+ getMemoryLogSinkEntries(entries, handle);
131
+ return entries;
132
+ }