react-native-webgpu 0.5.11

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 (378) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +319 -0
  3. package/android/CMakeLists.txt +108 -0
  4. package/android/build.gradle +138 -0
  5. package/android/cpp/AndroidPlatformContext.h +207 -0
  6. package/android/cpp/cpp-adapter.cpp +71 -0
  7. package/android/src/main/AndroidManifest.xml +3 -0
  8. package/android/src/main/java/com/webgpu/WebGPUAHBView.java +298 -0
  9. package/android/src/main/java/com/webgpu/WebGPUAPI.java +20 -0
  10. package/android/src/main/java/com/webgpu/WebGPUBaseView.java +61 -0
  11. package/android/src/main/java/com/webgpu/WebGPUModule.java +50 -0
  12. package/android/src/main/java/com/webgpu/WebGPUSurfaceView.java +41 -0
  13. package/android/src/main/java/com/webgpu/WebGPUSurfaceViewWithSC.java +79 -0
  14. package/android/src/main/java/com/webgpu/WebGPUTextureView.java +46 -0
  15. package/android/src/main/java/com/webgpu/WebGPUView.java +108 -0
  16. package/android/src/main/java/com/webgpu/WebGPUViewManager.java +38 -0
  17. package/android/src/main/java/com/webgpu/WebGPUViewPackage.java +50 -0
  18. package/android/src/newarch/com/webgpu/WebGPUViewManagerSpec.java +24 -0
  19. package/apple/ApplePlatformContext.h +31 -0
  20. package/apple/ApplePlatformContext.mm +157 -0
  21. package/apple/MetalView.h +13 -0
  22. package/apple/MetalView.mm +50 -0
  23. package/apple/RNWGUIKit.h +16 -0
  24. package/apple/WebGPUModule.h +13 -0
  25. package/apple/WebGPUModule.mm +89 -0
  26. package/apple/WebGPUView.h +12 -0
  27. package/apple/WebGPUView.mm +66 -0
  28. package/cpp/WGPULogger.h +100 -0
  29. package/cpp/dawn_logging.cpp +119 -0
  30. package/cpp/jsi/EnumMapper.h +45 -0
  31. package/cpp/jsi/JSIConverter.h +473 -0
  32. package/cpp/jsi/NativeObject.h +607 -0
  33. package/cpp/jsi/Promise.cpp +44 -0
  34. package/cpp/jsi/Promise.h +35 -0
  35. package/cpp/jsi/RuntimeAwareCache.cpp +7 -0
  36. package/cpp/jsi/RuntimeAwareCache.h +100 -0
  37. package/cpp/jsi/RuntimeLifecycleMonitor.cpp +72 -0
  38. package/cpp/jsi/RuntimeLifecycleMonitor.h +32 -0
  39. package/cpp/rnwgpu/ArrayBuffer.h +73 -0
  40. package/cpp/rnwgpu/PlatformContext.h +46 -0
  41. package/cpp/rnwgpu/RNWebGPUManager.cpp +225 -0
  42. package/cpp/rnwgpu/RNWebGPUManager.h +46 -0
  43. package/cpp/rnwgpu/SurfaceRegistry.h +230 -0
  44. package/cpp/rnwgpu/api/Canvas.h +57 -0
  45. package/cpp/rnwgpu/api/Convertors.h +761 -0
  46. package/cpp/rnwgpu/api/External.h +12 -0
  47. package/cpp/rnwgpu/api/GPU.cpp +127 -0
  48. package/cpp/rnwgpu/api/GPU.h +58 -0
  49. package/cpp/rnwgpu/api/GPUAdapter.cpp +191 -0
  50. package/cpp/rnwgpu/api/GPUAdapter.h +59 -0
  51. package/cpp/rnwgpu/api/GPUAdapterInfo.h +57 -0
  52. package/cpp/rnwgpu/api/GPUBindGroup.cpp +3 -0
  53. package/cpp/rnwgpu/api/GPUBindGroup.h +51 -0
  54. package/cpp/rnwgpu/api/GPUBindGroupLayout.h +52 -0
  55. package/cpp/rnwgpu/api/GPUBuffer.cpp +97 -0
  56. package/cpp/rnwgpu/api/GPUBuffer.h +87 -0
  57. package/cpp/rnwgpu/api/GPUCanvasContext.cpp +67 -0
  58. package/cpp/rnwgpu/api/GPUCanvasContext.h +66 -0
  59. package/cpp/rnwgpu/api/GPUCommandBuffer.h +45 -0
  60. package/cpp/rnwgpu/api/GPUCommandEncoder.cpp +179 -0
  61. package/cpp/rnwgpu/api/GPUCommandEncoder.h +111 -0
  62. package/cpp/rnwgpu/api/GPUCompilationInfo.h +79 -0
  63. package/cpp/rnwgpu/api/GPUCompilationMessage.h +36 -0
  64. package/cpp/rnwgpu/api/GPUComputePassEncoder.cpp +60 -0
  65. package/cpp/rnwgpu/api/GPUComputePassEncoder.h +85 -0
  66. package/cpp/rnwgpu/api/GPUComputePipeline.cpp +12 -0
  67. package/cpp/rnwgpu/api/GPUComputePipeline.h +60 -0
  68. package/cpp/rnwgpu/api/GPUDevice.cpp +492 -0
  69. package/cpp/rnwgpu/api/GPUDevice.h +259 -0
  70. package/cpp/rnwgpu/api/GPUDeviceLostInfo.cpp +7 -0
  71. package/cpp/rnwgpu/api/GPUDeviceLostInfo.h +40 -0
  72. package/cpp/rnwgpu/api/GPUError.h +35 -0
  73. package/cpp/rnwgpu/api/GPUExtent3D.h +66 -0
  74. package/cpp/rnwgpu/api/GPUExternalTexture.h +45 -0
  75. package/cpp/rnwgpu/api/GPUFeatures.h +203 -0
  76. package/cpp/rnwgpu/api/GPUInternalError.h +31 -0
  77. package/cpp/rnwgpu/api/GPUOrigin2D.h +55 -0
  78. package/cpp/rnwgpu/api/GPUOrigin3D.h +62 -0
  79. package/cpp/rnwgpu/api/GPUOutOfMemoryError.h +33 -0
  80. package/cpp/rnwgpu/api/GPUPipelineLayout.h +45 -0
  81. package/cpp/rnwgpu/api/GPUQuerySet.cpp +11 -0
  82. package/cpp/rnwgpu/api/GPUQuerySet.h +73 -0
  83. package/cpp/rnwgpu/api/GPUQueue.cpp +169 -0
  84. package/cpp/rnwgpu/api/GPUQueue.h +81 -0
  85. package/cpp/rnwgpu/api/GPURenderBundle.h +44 -0
  86. package/cpp/rnwgpu/api/GPURenderBundleEncoder.cpp +131 -0
  87. package/cpp/rnwgpu/api/GPURenderBundleEncoder.h +110 -0
  88. package/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +165 -0
  89. package/cpp/rnwgpu/api/GPURenderPassEncoder.h +130 -0
  90. package/cpp/rnwgpu/api/GPURenderPipeline.cpp +13 -0
  91. package/cpp/rnwgpu/api/GPURenderPipeline.h +61 -0
  92. package/cpp/rnwgpu/api/GPUSampler.h +44 -0
  93. package/cpp/rnwgpu/api/GPUShaderModule.cpp +51 -0
  94. package/cpp/rnwgpu/api/GPUShaderModule.h +66 -0
  95. package/cpp/rnwgpu/api/GPUSupportedLimits.cpp +129 -0
  96. package/cpp/rnwgpu/api/GPUSupportedLimits.h +131 -0
  97. package/cpp/rnwgpu/api/GPUTexture.cpp +47 -0
  98. package/cpp/rnwgpu/api/GPUTexture.h +162 -0
  99. package/cpp/rnwgpu/api/GPUTextureView.h +44 -0
  100. package/cpp/rnwgpu/api/GPUUncapturedErrorEvent.h +71 -0
  101. package/cpp/rnwgpu/api/GPUValidationError.h +32 -0
  102. package/cpp/rnwgpu/api/ImageBitmap.h +40 -0
  103. package/cpp/rnwgpu/api/RNWebGPU.h +199 -0
  104. package/cpp/rnwgpu/api/descriptors/GPUBindGroupDescriptor.h +65 -0
  105. package/cpp/rnwgpu/api/descriptors/GPUBindGroupEntry.h +78 -0
  106. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutDescriptor.h +57 -0
  107. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutEntry.h +98 -0
  108. package/cpp/rnwgpu/api/descriptors/GPUBlendComponent.h +58 -0
  109. package/cpp/rnwgpu/api/descriptors/GPUBlendState.h +53 -0
  110. package/cpp/rnwgpu/api/descriptors/GPUBufferBinding.h +57 -0
  111. package/cpp/rnwgpu/api/descriptors/GPUBufferBindingLayout.h +57 -0
  112. package/cpp/rnwgpu/api/descriptors/GPUBufferDescriptor.h +60 -0
  113. package/cpp/rnwgpu/api/descriptors/GPUBufferUsage.h +39 -0
  114. package/cpp/rnwgpu/api/descriptors/GPUCanvasConfiguration.h +76 -0
  115. package/cpp/rnwgpu/api/descriptors/GPUColor.h +67 -0
  116. package/cpp/rnwgpu/api/descriptors/GPUColorTargetState.h +59 -0
  117. package/cpp/rnwgpu/api/descriptors/GPUColorWrite.h +29 -0
  118. package/cpp/rnwgpu/api/descriptors/GPUCommandBufferDescriptor.h +46 -0
  119. package/cpp/rnwgpu/api/descriptors/GPUCommandEncoderDescriptor.h +46 -0
  120. package/cpp/rnwgpu/api/descriptors/GPUComputePassDescriptor.h +57 -0
  121. package/cpp/rnwgpu/api/descriptors/GPUComputePassTimestampWrites.h +59 -0
  122. package/cpp/rnwgpu/api/descriptors/GPUComputePipelineDescriptor.h +68 -0
  123. package/cpp/rnwgpu/api/descriptors/GPUDepthStencilState.h +104 -0
  124. package/cpp/rnwgpu/api/descriptors/GPUDeviceDescriptor.h +100 -0
  125. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureBindingLayout.h +39 -0
  126. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureDescriptor.h +80 -0
  127. package/cpp/rnwgpu/api/descriptors/GPUFragmentState.h +74 -0
  128. package/cpp/rnwgpu/api/descriptors/GPUImageCopyBuffer.h +63 -0
  129. package/cpp/rnwgpu/api/descriptors/GPUImageCopyExternalImage.h +63 -0
  130. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTexture.h +66 -0
  131. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTextureTagged.h +82 -0
  132. package/cpp/rnwgpu/api/descriptors/GPUImageDataLayout.h +55 -0
  133. package/cpp/rnwgpu/api/descriptors/GPUMapMode.h +22 -0
  134. package/cpp/rnwgpu/api/descriptors/GPUMultisampleState.h +55 -0
  135. package/cpp/rnwgpu/api/descriptors/GPUPipelineLayoutDescriptor.h +58 -0
  136. package/cpp/rnwgpu/api/descriptors/GPUPrimitiveState.h +70 -0
  137. package/cpp/rnwgpu/api/descriptors/GPUProgrammableStage.h +62 -0
  138. package/cpp/rnwgpu/api/descriptors/GPUQuerySetDescriptor.h +56 -0
  139. package/cpp/rnwgpu/api/descriptors/GPUQueueDescriptor.h +44 -0
  140. package/cpp/rnwgpu/api/descriptors/GPURenderBundleDescriptor.h +46 -0
  141. package/cpp/rnwgpu/api/descriptors/GPURenderBundleEncoderDescriptor.h +81 -0
  142. package/cpp/rnwgpu/api/descriptors/GPURenderPassColorAttachment.h +82 -0
  143. package/cpp/rnwgpu/api/descriptors/GPURenderPassDepthStencilAttachment.h +102 -0
  144. package/cpp/rnwgpu/api/descriptors/GPURenderPassDescriptor.h +93 -0
  145. package/cpp/rnwgpu/api/descriptors/GPURenderPassTimestampWrites.h +59 -0
  146. package/cpp/rnwgpu/api/descriptors/GPURenderPipelineDescriptor.h +104 -0
  147. package/cpp/rnwgpu/api/descriptors/GPURequestAdapterOptions.h +52 -0
  148. package/cpp/rnwgpu/api/descriptors/GPUSamplerBindingLayout.h +46 -0
  149. package/cpp/rnwgpu/api/descriptors/GPUSamplerDescriptor.h +111 -0
  150. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleCompilationHint.h +61 -0
  151. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleDescriptor.h +63 -0
  152. package/cpp/rnwgpu/api/descriptors/GPUShaderStage.h +25 -0
  153. package/cpp/rnwgpu/api/descriptors/GPUStencilFaceState.h +65 -0
  154. package/cpp/rnwgpu/api/descriptors/GPUStorageTextureBindingLayout.h +60 -0
  155. package/cpp/rnwgpu/api/descriptors/GPUTextureBindingLayout.h +60 -0
  156. package/cpp/rnwgpu/api/descriptors/GPUTextureDescriptor.h +92 -0
  157. package/cpp/rnwgpu/api/descriptors/GPUTextureUsage.h +29 -0
  158. package/cpp/rnwgpu/api/descriptors/GPUTextureViewDescriptor.h +92 -0
  159. package/cpp/rnwgpu/api/descriptors/GPUUncapturedErrorEventInit.h +65 -0
  160. package/cpp/rnwgpu/api/descriptors/GPUVertexAttribute.h +54 -0
  161. package/cpp/rnwgpu/api/descriptors/GPUVertexBufferLayout.h +63 -0
  162. package/cpp/rnwgpu/api/descriptors/GPUVertexState.h +74 -0
  163. package/cpp/rnwgpu/api/descriptors/Unions.h +1969 -0
  164. package/cpp/rnwgpu/async/AsyncDispatcher.h +28 -0
  165. package/cpp/rnwgpu/async/AsyncRunner.cpp +215 -0
  166. package/cpp/rnwgpu/async/AsyncRunner.h +53 -0
  167. package/cpp/rnwgpu/async/AsyncTaskHandle.cpp +181 -0
  168. package/cpp/rnwgpu/async/AsyncTaskHandle.h +55 -0
  169. package/cpp/rnwgpu/async/JSIMicrotaskDispatcher.cpp +23 -0
  170. package/cpp/rnwgpu/async/JSIMicrotaskDispatcher.h +22 -0
  171. package/cpp/webgpu/webgpu.h +4918 -0
  172. package/cpp/webgpu/webgpu_cpp.h +10294 -0
  173. package/cpp/webgpu/webgpu_cpp_chained_struct.h +57 -0
  174. package/cpp/webgpu/webgpu_cpp_print.h +2755 -0
  175. package/cpp/webgpu/webgpu_enum_class_bitmasks.h +161 -0
  176. package/lib/commonjs/Canvas.js +55 -0
  177. package/lib/commonjs/Canvas.js.map +1 -0
  178. package/lib/commonjs/NativeWebGPUModule.js +10 -0
  179. package/lib/commonjs/NativeWebGPUModule.js.map +1 -0
  180. package/lib/commonjs/Offscreen.js +103 -0
  181. package/lib/commonjs/Offscreen.js.map +1 -0
  182. package/lib/commonjs/WebGPUViewNativeComponent.js +10 -0
  183. package/lib/commonjs/WebGPUViewNativeComponent.js.map +1 -0
  184. package/lib/commonjs/WebGPUViewNativeComponent.web.js +103 -0
  185. package/lib/commonjs/WebGPUViewNativeComponent.web.js.map +1 -0
  186. package/lib/commonjs/WebPolyfillGPUModule.js +40 -0
  187. package/lib/commonjs/WebPolyfillGPUModule.js.map +1 -0
  188. package/lib/commonjs/external/ModuleProxy.js +36 -0
  189. package/lib/commonjs/external/ModuleProxy.js.map +1 -0
  190. package/lib/commonjs/external/index.js +17 -0
  191. package/lib/commonjs/external/index.js.map +1 -0
  192. package/lib/commonjs/external/reanimated/ReanimatedProxy.js +18 -0
  193. package/lib/commonjs/external/reanimated/ReanimatedProxy.js.map +1 -0
  194. package/lib/commonjs/external/reanimated/index.js +21 -0
  195. package/lib/commonjs/external/reanimated/index.js.map +1 -0
  196. package/lib/commonjs/external/reanimated/registerWebGPUForReanimated.js +49 -0
  197. package/lib/commonjs/external/reanimated/registerWebGPUForReanimated.js.map +1 -0
  198. package/lib/commonjs/hooks.js +83 -0
  199. package/lib/commonjs/hooks.js.map +1 -0
  200. package/lib/commonjs/index.js +17 -0
  201. package/lib/commonjs/index.js.map +1 -0
  202. package/lib/commonjs/main/index.js +91 -0
  203. package/lib/commonjs/main/index.js.map +1 -0
  204. package/lib/commonjs/main/index.web.js +51 -0
  205. package/lib/commonjs/main/index.web.js.map +1 -0
  206. package/lib/commonjs/types.js +2 -0
  207. package/lib/commonjs/types.js.map +1 -0
  208. package/lib/commonjs/utils.js +11 -0
  209. package/lib/commonjs/utils.js.map +1 -0
  210. package/lib/module/Canvas.js +46 -0
  211. package/lib/module/Canvas.js.map +1 -0
  212. package/lib/module/NativeWebGPUModule.js +4 -0
  213. package/lib/module/NativeWebGPUModule.js.map +1 -0
  214. package/lib/module/Offscreen.js +96 -0
  215. package/lib/module/Offscreen.js.map +1 -0
  216. package/lib/module/WebGPUViewNativeComponent.js +4 -0
  217. package/lib/module/WebGPUViewNativeComponent.js.map +1 -0
  218. package/lib/module/WebGPUViewNativeComponent.web.js +96 -0
  219. package/lib/module/WebGPUViewNativeComponent.web.js.map +1 -0
  220. package/lib/module/WebPolyfillGPUModule.js +38 -0
  221. package/lib/module/WebPolyfillGPUModule.js.map +1 -0
  222. package/lib/module/external/ModuleProxy.js +28 -0
  223. package/lib/module/external/ModuleProxy.js.map +1 -0
  224. package/lib/module/external/index.js +2 -0
  225. package/lib/module/external/index.js.map +1 -0
  226. package/lib/module/external/reanimated/ReanimatedProxy.js +12 -0
  227. package/lib/module/external/reanimated/ReanimatedProxy.js.map +1 -0
  228. package/lib/module/external/reanimated/index.js +3 -0
  229. package/lib/module/external/reanimated/index.js.map +1 -0
  230. package/lib/module/external/reanimated/registerWebGPUForReanimated.js +42 -0
  231. package/lib/module/external/reanimated/registerWebGPUForReanimated.js.map +1 -0
  232. package/lib/module/hooks.js +70 -0
  233. package/lib/module/hooks.js.map +1 -0
  234. package/lib/module/index.js +5 -0
  235. package/lib/module/index.js.map +1 -0
  236. package/lib/module/main/index.js +33 -0
  237. package/lib/module/main/index.js.map +1 -0
  238. package/lib/module/main/index.web.js +8 -0
  239. package/lib/module/main/index.web.js.map +1 -0
  240. package/lib/module/types.js +2 -0
  241. package/lib/module/types.js.map +1 -0
  242. package/lib/module/utils.js +5 -0
  243. package/lib/module/utils.js.map +1 -0
  244. package/lib/typescript/babel.config.d.ts +3 -0
  245. package/lib/typescript/babel.config.d.ts.map +1 -0
  246. package/lib/typescript/eslint.config.d.mts +3 -0
  247. package/lib/typescript/eslint.config.d.mts.map +1 -0
  248. package/lib/typescript/jest.config.d.ts +9 -0
  249. package/lib/typescript/jest.config.d.ts.map +1 -0
  250. package/lib/typescript/lib/commonjs/Canvas.d.ts +7 -0
  251. package/lib/typescript/lib/commonjs/Canvas.d.ts.map +1 -0
  252. package/lib/typescript/lib/commonjs/NativeWebGPUModule.d.ts +5 -0
  253. package/lib/typescript/lib/commonjs/NativeWebGPUModule.d.ts.map +1 -0
  254. package/lib/typescript/lib/commonjs/Offscreen.d.ts +26 -0
  255. package/lib/typescript/lib/commonjs/Offscreen.d.ts.map +1 -0
  256. package/lib/typescript/lib/commonjs/WebGPUViewNativeComponent.d.ts +5 -0
  257. package/lib/typescript/lib/commonjs/WebGPUViewNativeComponent.d.ts.map +1 -0
  258. package/lib/typescript/lib/commonjs/WebGPUViewNativeComponent.web.d.ts +4 -0
  259. package/lib/typescript/lib/commonjs/WebGPUViewNativeComponent.web.d.ts.map +1 -0
  260. package/lib/typescript/lib/commonjs/WebPolyfillGPUModule.d.ts +2 -0
  261. package/lib/typescript/lib/commonjs/WebPolyfillGPUModule.d.ts.map +1 -0
  262. package/lib/typescript/lib/commonjs/external/ModuleProxy.d.ts +12 -0
  263. package/lib/typescript/lib/commonjs/external/ModuleProxy.d.ts.map +1 -0
  264. package/lib/typescript/lib/commonjs/external/index.d.ts +2 -0
  265. package/lib/typescript/lib/commonjs/external/index.d.ts.map +1 -0
  266. package/lib/typescript/lib/commonjs/external/reanimated/ReanimatedProxy.d.ts +6 -0
  267. package/lib/typescript/lib/commonjs/external/reanimated/ReanimatedProxy.d.ts.map +1 -0
  268. package/lib/typescript/lib/commonjs/external/reanimated/index.d.ts +4 -0
  269. package/lib/typescript/lib/commonjs/external/reanimated/index.d.ts.map +1 -0
  270. package/lib/typescript/lib/commonjs/external/reanimated/registerWebGPUForReanimated.d.ts +9 -0
  271. package/lib/typescript/lib/commonjs/external/reanimated/registerWebGPUForReanimated.d.ts.map +1 -0
  272. package/lib/typescript/lib/commonjs/hooks.d.ts +18 -0
  273. package/lib/typescript/lib/commonjs/hooks.d.ts.map +1 -0
  274. package/lib/typescript/lib/commonjs/index.d.ts +2 -0
  275. package/lib/typescript/lib/commonjs/index.d.ts.map +1 -0
  276. package/lib/typescript/lib/commonjs/main/index.d.ts +3 -0
  277. package/lib/typescript/lib/commonjs/main/index.d.ts.map +1 -0
  278. package/lib/typescript/lib/commonjs/main/index.web.d.ts +2 -0
  279. package/lib/typescript/lib/commonjs/main/index.web.d.ts.map +1 -0
  280. package/lib/typescript/lib/commonjs/types.d.ts +1 -0
  281. package/lib/typescript/lib/commonjs/types.d.ts.map +1 -0
  282. package/lib/typescript/lib/commonjs/utils.d.ts +3 -0
  283. package/lib/typescript/lib/commonjs/utils.d.ts.map +1 -0
  284. package/lib/typescript/lib/module/Canvas.d.ts +8 -0
  285. package/lib/typescript/lib/module/Canvas.d.ts.map +1 -0
  286. package/lib/typescript/lib/module/NativeWebGPUModule.d.ts +3 -0
  287. package/lib/typescript/lib/module/NativeWebGPUModule.d.ts.map +1 -0
  288. package/lib/typescript/lib/module/Offscreen.d.ts +25 -0
  289. package/lib/typescript/lib/module/Offscreen.d.ts.map +1 -0
  290. package/lib/typescript/lib/module/WebGPUViewNativeComponent.d.ts +3 -0
  291. package/lib/typescript/lib/module/WebGPUViewNativeComponent.d.ts.map +1 -0
  292. package/lib/typescript/lib/module/WebGPUViewNativeComponent.web.d.ts +3 -0
  293. package/lib/typescript/lib/module/WebGPUViewNativeComponent.web.d.ts.map +1 -0
  294. package/lib/typescript/lib/module/WebPolyfillGPUModule.d.ts +2 -0
  295. package/lib/typescript/lib/module/WebPolyfillGPUModule.d.ts.map +1 -0
  296. package/lib/typescript/lib/module/external/ModuleProxy.d.ts +7 -0
  297. package/lib/typescript/lib/module/external/ModuleProxy.d.ts.map +1 -0
  298. package/lib/typescript/lib/module/external/index.d.ts +2 -0
  299. package/lib/typescript/lib/module/external/index.d.ts.map +1 -0
  300. package/lib/typescript/lib/module/external/reanimated/ReanimatedProxy.d.ts +5 -0
  301. package/lib/typescript/lib/module/external/reanimated/ReanimatedProxy.d.ts.map +1 -0
  302. package/lib/typescript/lib/module/external/reanimated/index.d.ts +3 -0
  303. package/lib/typescript/lib/module/external/reanimated/index.d.ts.map +1 -0
  304. package/lib/typescript/lib/module/external/reanimated/registerWebGPUForReanimated.d.ts +2 -0
  305. package/lib/typescript/lib/module/external/reanimated/registerWebGPUForReanimated.d.ts.map +1 -0
  306. package/lib/typescript/lib/module/hooks.d.ts +18 -0
  307. package/lib/typescript/lib/module/hooks.d.ts.map +1 -0
  308. package/lib/typescript/lib/module/index.d.ts +2 -0
  309. package/lib/typescript/lib/module/index.d.ts.map +1 -0
  310. package/lib/typescript/lib/module/main/index.d.ts +6 -0
  311. package/lib/typescript/lib/module/main/index.d.ts.map +1 -0
  312. package/lib/typescript/lib/module/main/index.web.d.ts +5 -0
  313. package/lib/typescript/lib/module/main/index.web.d.ts.map +1 -0
  314. package/lib/typescript/lib/module/types.d.ts +1 -0
  315. package/lib/typescript/lib/module/types.d.ts.map +1 -0
  316. package/lib/typescript/lib/module/utils.d.ts +2 -0
  317. package/lib/typescript/lib/module/utils.d.ts.map +1 -0
  318. package/lib/typescript/src/Canvas.d.ts +35 -0
  319. package/lib/typescript/src/Canvas.d.ts.map +1 -0
  320. package/lib/typescript/src/NativeWebGPUModule.d.ts +7 -0
  321. package/lib/typescript/src/NativeWebGPUModule.d.ts.map +1 -0
  322. package/lib/typescript/src/Offscreen.d.ts +30 -0
  323. package/lib/typescript/src/Offscreen.d.ts.map +1 -0
  324. package/lib/typescript/src/WebGPUViewNativeComponent.d.ts +9 -0
  325. package/lib/typescript/src/WebGPUViewNativeComponent.d.ts.map +1 -0
  326. package/lib/typescript/src/WebGPUViewNativeComponent.web.d.ts +9 -0
  327. package/lib/typescript/src/WebGPUViewNativeComponent.web.d.ts.map +1 -0
  328. package/lib/typescript/src/WebPolyfillGPUModule.d.ts +2 -0
  329. package/lib/typescript/src/WebPolyfillGPUModule.d.ts.map +1 -0
  330. package/lib/typescript/src/external/ModuleProxy.d.ts +11 -0
  331. package/lib/typescript/src/external/ModuleProxy.d.ts.map +1 -0
  332. package/lib/typescript/src/external/index.d.ts +2 -0
  333. package/lib/typescript/src/external/index.d.ts.map +1 -0
  334. package/lib/typescript/src/external/reanimated/ReanimatedProxy.d.ts +4 -0
  335. package/lib/typescript/src/external/reanimated/ReanimatedProxy.d.ts.map +1 -0
  336. package/lib/typescript/src/external/reanimated/index.d.ts +3 -0
  337. package/lib/typescript/src/external/reanimated/index.d.ts.map +1 -0
  338. package/lib/typescript/src/external/reanimated/registerWebGPUForReanimated.d.ts +8 -0
  339. package/lib/typescript/src/external/reanimated/registerWebGPUForReanimated.d.ts.map +1 -0
  340. package/lib/typescript/src/hooks.d.ts +27 -0
  341. package/lib/typescript/src/hooks.d.ts.map +1 -0
  342. package/lib/typescript/src/index.d.ts +18 -0
  343. package/lib/typescript/src/index.d.ts.map +1 -0
  344. package/lib/typescript/src/main/index.d.ts +6 -0
  345. package/lib/typescript/src/main/index.d.ts.map +1 -0
  346. package/lib/typescript/src/main/index.web.d.ts +6 -0
  347. package/lib/typescript/src/main/index.web.d.ts.map +1 -0
  348. package/lib/typescript/src/types.d.ts +19 -0
  349. package/lib/typescript/src/types.d.ts.map +1 -0
  350. package/lib/typescript/src/utils.d.ts +2 -0
  351. package/lib/typescript/src/utils.d.ts.map +1 -0
  352. package/libs/android/arm64-v8a/libwebgpu_dawn.so +0 -0
  353. package/libs/android/armeabi-v7a/libwebgpu_dawn.so +0 -0
  354. package/libs/android/x86/libwebgpu_dawn.so +0 -0
  355. package/libs/android/x86_64/libwebgpu_dawn.so +0 -0
  356. package/libs/apple/libwebgpu_dawn.xcframework/Info.plist +59 -0
  357. package/libs/apple/libwebgpu_dawn.xcframework/ios-arm64/libwebgpu_dawn.a +0 -0
  358. package/libs/apple/libwebgpu_dawn.xcframework/ios-arm64_x86_64-simulator/libwebgpu_dawn.a +0 -0
  359. package/libs/apple/libwebgpu_dawn.xcframework/macos-arm64_x86_64/libwebgpu_dawn.a +0 -0
  360. package/package.json +139 -0
  361. package/react-native-wgpu.podspec +47 -0
  362. package/src/Canvas.tsx +91 -0
  363. package/src/NativeWebGPUModule.ts +9 -0
  364. package/src/Offscreen.ts +113 -0
  365. package/src/WebGPUViewNativeComponent.ts +11 -0
  366. package/src/WebGPUViewNativeComponent.web.ts +113 -0
  367. package/src/WebPolyfillGPUModule.ts +53 -0
  368. package/src/external/ModuleProxy.ts +30 -0
  369. package/src/external/index.ts +1 -0
  370. package/src/external/reanimated/ReanimatedProxy.ts +19 -0
  371. package/src/external/reanimated/index.ts +2 -0
  372. package/src/external/reanimated/registerWebGPUForReanimated.ts +43 -0
  373. package/src/hooks.tsx +93 -0
  374. package/src/index.tsx +31 -0
  375. package/src/main/index.tsx +40 -0
  376. package/src/main/index.web.tsx +8 -0
  377. package/src/types.ts +20 -0
  378. package/src/utils.ts +4 -0
@@ -0,0 +1,492 @@
1
+ #include "GPUDevice.h"
2
+
3
+ #include <memory>
4
+ #include <string>
5
+ #include <unordered_set>
6
+ #include <utility>
7
+ #include <vector>
8
+
9
+ #include "Convertors.h"
10
+ #include "JSIConverter.h"
11
+
12
+ #include "GPUFeatures.h"
13
+ #include "GPUInternalError.h"
14
+ #include "GPUOutOfMemoryError.h"
15
+ #include "GPUValidationError.h"
16
+
17
+ namespace rnwgpu {
18
+
19
+ void GPUDevice::notifyDeviceLost(wgpu::DeviceLostReason reason,
20
+ std::string message) {
21
+ if (_lostSettled) {
22
+ return;
23
+ }
24
+
25
+ _lostSettled = true;
26
+ _lostInfo = std::make_shared<GPUDeviceLostInfo>(reason, std::move(message));
27
+
28
+ if (_lostResolve.has_value()) {
29
+ auto resolve = std::move(*_lostResolve);
30
+ _lostResolve.reset();
31
+ resolve([info = _lostInfo](jsi::Runtime &runtime) mutable {
32
+ return JSIConverter<std::shared_ptr<GPUDeviceLostInfo>>::toJSI(runtime,
33
+ info);
34
+ });
35
+ }
36
+
37
+ _lostHandle.reset();
38
+ }
39
+
40
+ void GPUDevice::forceLossForTesting() {
41
+ // wgpu::StringView view("forceLossForTesting invoked from JS");
42
+ _instance.ForceLoss(wgpu::DeviceLostReason::Unknown,
43
+ "forceLossForTesting invoked from JS");
44
+ }
45
+
46
+ std::shared_ptr<GPUBuffer>
47
+ GPUDevice::createBuffer(std::shared_ptr<GPUBufferDescriptor> descriptor) {
48
+ wgpu::BufferDescriptor desc;
49
+ Convertor conv;
50
+ if (!conv(desc, descriptor)) {
51
+ throw std::runtime_error(
52
+ "GPUDevice::createBuffer(): Error with GPUBufferDescriptor");
53
+ }
54
+ auto result = _instance.CreateBuffer(&desc);
55
+ return std::make_shared<GPUBuffer>(result, _async,
56
+ descriptor->label.value_or(""));
57
+ }
58
+
59
+ std::shared_ptr<GPUSupportedLimits> GPUDevice::getLimits() {
60
+ wgpu::Limits limits{};
61
+ if (!_instance.GetLimits(&limits)) {
62
+ throw std::runtime_error("failed to get device limits");
63
+ }
64
+ return std::make_shared<GPUSupportedLimits>(limits);
65
+ }
66
+
67
+ std::shared_ptr<GPUQueue> GPUDevice::getQueue() {
68
+ auto result = _instance.GetQueue();
69
+ return std::make_shared<GPUQueue>(result, _async, _label);
70
+ }
71
+
72
+ std::shared_ptr<GPUCommandEncoder> GPUDevice::createCommandEncoder(
73
+ std::optional<std::shared_ptr<GPUCommandEncoderDescriptor>> descriptor) {
74
+ wgpu::CommandEncoderDescriptor desc;
75
+ Convertor conv;
76
+ if (!conv(desc, descriptor)) {
77
+ throw std::runtime_error("Error with GPUCommandEncoderDescriptor");
78
+ }
79
+ auto result = _instance.CreateCommandEncoder(&desc);
80
+ return std::make_shared<GPUCommandEncoder>(
81
+ result,
82
+ descriptor.has_value() ? descriptor.value()->label.value_or("") : "");
83
+ }
84
+
85
+ void GPUDevice::destroy() {
86
+ _instance.Destroy();
87
+ notifyDeviceLost(wgpu::DeviceLostReason::Destroyed, "device was destroyed");
88
+ }
89
+
90
+ std::shared_ptr<GPUTexture>
91
+ GPUDevice::createTexture(std::shared_ptr<GPUTextureDescriptor> descriptor) {
92
+ wgpu::TextureDescriptor desc;
93
+ Convertor conv;
94
+ if (!conv(desc, descriptor)) {
95
+ throw std::runtime_error("Error with GPUTextureDescriptor");
96
+ }
97
+ auto texture = _instance.CreateTexture(&desc);
98
+ return std::make_shared<GPUTexture>(texture, descriptor->label.value_or(""));
99
+ }
100
+
101
+ std::shared_ptr<GPUShaderModule> GPUDevice::createShaderModule(
102
+ std::shared_ptr<GPUShaderModuleDescriptor> descriptor) {
103
+ wgpu::ShaderSourceWGSL wgsl_desc{};
104
+ wgpu::ShaderModuleDescriptor sm_desc{};
105
+ Convertor conv;
106
+ if (!conv(wgsl_desc.code, descriptor->code) ||
107
+ !conv(sm_desc.label, descriptor->label)) {
108
+ return {};
109
+ }
110
+ sm_desc.nextInChain = &wgsl_desc;
111
+ if (descriptor->code.find('\0') != std::string::npos) {
112
+ auto mod = _instance.CreateErrorShaderModule(
113
+ &sm_desc, "The WGSL shader contains an illegal character '\\0'");
114
+ return std::make_shared<GPUShaderModule>(mod, _async, sm_desc.label.data);
115
+ }
116
+ auto module = _instance.CreateShaderModule(&sm_desc);
117
+ return std::make_shared<GPUShaderModule>(module, _async,
118
+ descriptor->label.value_or(""));
119
+ }
120
+
121
+ std::shared_ptr<GPURenderPipeline> GPUDevice::createRenderPipeline(
122
+ std::shared_ptr<GPURenderPipelineDescriptor> descriptor) {
123
+ wgpu::RenderPipelineDescriptor desc{};
124
+ Convertor conv;
125
+ if (!conv(desc, descriptor)) {
126
+ throw std::runtime_error("Error with GPURenderPipelineDescriptor");
127
+ }
128
+ // assert(desc.fragment != nullptr && "Fragment state must not be null");
129
+ auto renderPipeline = _instance.CreateRenderPipeline(&desc);
130
+ return std::make_shared<GPURenderPipeline>(renderPipeline,
131
+ descriptor->label.value_or(""));
132
+ }
133
+
134
+ std::shared_ptr<GPUBindGroup>
135
+ GPUDevice::createBindGroup(std::shared_ptr<GPUBindGroupDescriptor> descriptor) {
136
+ Convertor conv;
137
+ wgpu::BindGroupDescriptor desc{};
138
+ if (!conv(desc.label, descriptor->label) ||
139
+ !conv(desc.layout, descriptor->layout) ||
140
+ !conv(desc.entries, desc.entryCount, descriptor->entries)) {
141
+ throw std::runtime_error(
142
+ "GPUBindGroup::createBindGroup(): Error with GPUBindGroupDescriptor");
143
+ }
144
+ auto bindGroup = _instance.CreateBindGroup(&desc);
145
+ return std::make_shared<GPUBindGroup>(bindGroup,
146
+ descriptor->label.value_or(""));
147
+ }
148
+
149
+ std::shared_ptr<GPUSampler> GPUDevice::createSampler(
150
+ std::optional<std::shared_ptr<GPUSamplerDescriptor>> descriptor) {
151
+ wgpu::SamplerDescriptor desc;
152
+ Convertor conv;
153
+ if (!conv(desc, descriptor)) {
154
+ throw std::runtime_error("GPUDevice::createSampler(): Error with "
155
+ "GPUSamplerDescriptor");
156
+ }
157
+ auto sampler = _instance.CreateSampler(&desc);
158
+ return std::make_shared<GPUSampler>(
159
+ sampler,
160
+ descriptor.has_value() ? descriptor.value()->label.value_or("") : "");
161
+ }
162
+
163
+ std::shared_ptr<GPUComputePipeline> GPUDevice::createComputePipeline(
164
+ std::shared_ptr<GPUComputePipelineDescriptor> descriptor) {
165
+ wgpu::ComputePipelineDescriptor desc;
166
+ Convertor conv;
167
+ if (!conv(desc, descriptor)) {
168
+ throw std::runtime_error("GPUDevice::createComputePipeline(): Error with "
169
+ "GPUComputePipelineDescriptor");
170
+ }
171
+ auto computePipeline = _instance.CreateComputePipeline(&desc);
172
+ return std::make_shared<GPUComputePipeline>(computePipeline,
173
+ descriptor->label.value_or(""));
174
+ }
175
+
176
+ std::shared_ptr<GPUQuerySet>
177
+ GPUDevice::createQuerySet(std::shared_ptr<GPUQuerySetDescriptor> descriptor) {
178
+ wgpu::QuerySetDescriptor desc;
179
+ Convertor conv;
180
+ if (!conv(desc, descriptor)) {
181
+ throw std::runtime_error("GPUDevice::createQuerySet(): Error with "
182
+ "GPUQuerySetDescriptor");
183
+ }
184
+ auto querySet = _instance.CreateQuerySet(&desc);
185
+ return std::make_shared<GPUQuerySet>(querySet,
186
+ descriptor->label.value_or(""));
187
+ }
188
+
189
+ std::shared_ptr<GPURenderBundleEncoder> GPUDevice::createRenderBundleEncoder(
190
+ std::shared_ptr<GPURenderBundleEncoderDescriptor> descriptor) {
191
+ Convertor conv;
192
+
193
+ wgpu::RenderBundleEncoderDescriptor desc{};
194
+ if (!conv(desc.label, descriptor->label) ||
195
+ !conv(desc.colorFormats, desc.colorFormatCount,
196
+ descriptor->colorFormats) ||
197
+ !conv(desc.depthStencilFormat, descriptor->depthStencilFormat) ||
198
+ !conv(desc.sampleCount, descriptor->sampleCount) ||
199
+ !conv(desc.depthReadOnly, descriptor->depthReadOnly) ||
200
+ !conv(desc.stencilReadOnly, descriptor->stencilReadOnly)) {
201
+ return {};
202
+ }
203
+ return std::make_shared<GPURenderBundleEncoder>(
204
+ _instance.CreateRenderBundleEncoder(&desc),
205
+ descriptor->label.value_or(""));
206
+ }
207
+
208
+ std::shared_ptr<GPUBindGroupLayout> GPUDevice::createBindGroupLayout(
209
+ std::shared_ptr<GPUBindGroupLayoutDescriptor> descriptor) {
210
+ Convertor conv;
211
+
212
+ wgpu::BindGroupLayoutDescriptor desc{};
213
+ if (!conv(desc.label, descriptor->label) ||
214
+ !conv(desc.entries, desc.entryCount, descriptor->entries)) {
215
+ return {};
216
+ }
217
+ return std::make_shared<GPUBindGroupLayout>(
218
+ _instance.CreateBindGroupLayout(&desc), descriptor->label.value_or(""));
219
+ }
220
+
221
+ std::shared_ptr<GPUPipelineLayout> GPUDevice::createPipelineLayout(
222
+ std::shared_ptr<GPUPipelineLayoutDescriptor> descriptor) {
223
+ Convertor conv;
224
+
225
+ wgpu::PipelineLayoutDescriptor desc{};
226
+ if (!conv(desc.label, descriptor->label) ||
227
+ !conv(desc.bindGroupLayouts, desc.bindGroupLayoutCount,
228
+ descriptor->bindGroupLayouts)) {
229
+ return {};
230
+ }
231
+ return std::make_shared<GPUPipelineLayout>(
232
+ _instance.CreatePipelineLayout(&desc), descriptor->label.value_or(""));
233
+ }
234
+
235
+ std::shared_ptr<GPUExternalTexture> GPUDevice::importExternalTexture(
236
+ std::shared_ptr<GPUExternalTextureDescriptor> descriptor) {
237
+ throw std::runtime_error(
238
+ "GPUDevice::importExternalTexture(): Not implemented");
239
+ }
240
+
241
+ async::AsyncTaskHandle GPUDevice::createComputePipelineAsync(
242
+ std::shared_ptr<GPUComputePipelineDescriptor> descriptor) {
243
+ wgpu::ComputePipelineDescriptor desc{};
244
+ Convertor conv;
245
+ if (!conv(desc, descriptor)) {
246
+ throw std::runtime_error("GPUDevice::createComputePipeline(): Error with "
247
+ "GPUComputePipelineDescriptor");
248
+ }
249
+
250
+ auto label = std::string(
251
+ descriptor->label.has_value() ? descriptor->label.value() : "");
252
+ auto pipelineHolder = std::make_shared<GPUComputePipeline>(nullptr, label);
253
+
254
+ return _async->postTask([device = _instance, desc, descriptor,
255
+ pipelineHolder](
256
+ const async::AsyncTaskHandle::ResolveFunction
257
+ &resolve,
258
+ const async::AsyncTaskHandle::RejectFunction
259
+ &reject) {
260
+ (void)descriptor;
261
+ device.CreateComputePipelineAsync(
262
+ &desc, wgpu::CallbackMode::AllowProcessEvents,
263
+ [pipelineHolder, resolve,
264
+ reject](wgpu::CreatePipelineAsyncStatus status,
265
+ wgpu::ComputePipeline pipeline, const char *msg) mutable {
266
+ if (status == wgpu::CreatePipelineAsyncStatus::Success && pipeline) {
267
+ pipelineHolder->_instance = pipeline;
268
+ resolve([pipelineHolder](jsi::Runtime &runtime) mutable {
269
+ return JSIConverter<std::shared_ptr<GPUComputePipeline>>::toJSI(
270
+ runtime, pipelineHolder);
271
+ });
272
+ } else {
273
+ std::string error =
274
+ msg ? std::string(msg) : "Failed to create compute pipeline";
275
+ reject(std::move(error));
276
+ }
277
+ });
278
+ });
279
+ }
280
+
281
+ async::AsyncTaskHandle GPUDevice::createRenderPipelineAsync(
282
+ std::shared_ptr<GPURenderPipelineDescriptor> descriptor) {
283
+ wgpu::RenderPipelineDescriptor desc{};
284
+ Convertor conv;
285
+ if (!conv(desc, descriptor)) {
286
+ throw std::runtime_error(
287
+ "GPUDevice::createRenderPipelineAsync(): Error with "
288
+ "GPURenderPipelineDescriptor");
289
+ }
290
+
291
+ auto label = std::string(
292
+ descriptor->label.has_value() ? descriptor->label.value() : "");
293
+ auto pipelineHolder = std::make_shared<GPURenderPipeline>(nullptr, label);
294
+
295
+ return _async->postTask([device = _instance, desc, descriptor,
296
+ pipelineHolder](
297
+ const async::AsyncTaskHandle::ResolveFunction
298
+ &resolve,
299
+ const async::AsyncTaskHandle::RejectFunction
300
+ &reject) {
301
+ (void)descriptor;
302
+ device.CreateRenderPipelineAsync(
303
+ &desc, wgpu::CallbackMode::AllowProcessEvents,
304
+ [pipelineHolder, resolve,
305
+ reject](wgpu::CreatePipelineAsyncStatus status,
306
+ wgpu::RenderPipeline pipeline, const char *msg) mutable {
307
+ if (status == wgpu::CreatePipelineAsyncStatus::Success && pipeline) {
308
+ pipelineHolder->_instance = pipeline;
309
+ resolve([pipelineHolder](jsi::Runtime &runtime) mutable {
310
+ return JSIConverter<std::shared_ptr<GPURenderPipeline>>::toJSI(
311
+ runtime, pipelineHolder);
312
+ });
313
+ } else {
314
+ std::string error =
315
+ msg ? std::string(msg) : "Failed to create render pipeline";
316
+ reject(std::move(error));
317
+ }
318
+ });
319
+ });
320
+ }
321
+
322
+ void GPUDevice::pushErrorScope(wgpu::ErrorFilter filter) {
323
+ _instance.PushErrorScope(filter);
324
+ }
325
+
326
+ async::AsyncTaskHandle GPUDevice::popErrorScope() {
327
+ auto device = _instance;
328
+
329
+ return _async->postTask([device](const async::AsyncTaskHandle::ResolveFunction
330
+ &resolve,
331
+ const async::AsyncTaskHandle::RejectFunction
332
+ &reject) {
333
+ device.PopErrorScope(
334
+ wgpu::CallbackMode::AllowProcessEvents,
335
+ [resolve, reject](wgpu::PopErrorScopeStatus status,
336
+ wgpu::ErrorType type, wgpu::StringView message) {
337
+ if (status == wgpu::PopErrorScopeStatus::Error ||
338
+ status == wgpu::PopErrorScopeStatus::CallbackCancelled) {
339
+ reject("PopErrorScope failed");
340
+ return;
341
+ }
342
+
343
+ std::string messageString =
344
+ message.length ? std::string(message.data, message.length) : "";
345
+
346
+ switch (type) {
347
+ case wgpu::ErrorType::NoError:
348
+ resolve([](jsi::Runtime &runtime) mutable {
349
+ return jsi::Value::null();
350
+ });
351
+ break;
352
+ case wgpu::ErrorType::Validation: {
353
+ auto error = std::make_shared<GPUValidationError>(messageString);
354
+ resolve([error](jsi::Runtime &runtime) mutable {
355
+ return JSIConverter<std::shared_ptr<GPUValidationError>>::toJSI(
356
+ runtime, error);
357
+ });
358
+ break;
359
+ }
360
+ case wgpu::ErrorType::OutOfMemory: {
361
+ auto error = std::make_shared<GPUOutOfMemoryError>(messageString);
362
+ resolve([error](jsi::Runtime &runtime) mutable {
363
+ return JSIConverter<std::shared_ptr<GPUOutOfMemoryError>>::toJSI(
364
+ runtime, error);
365
+ });
366
+ break;
367
+ }
368
+ case wgpu::ErrorType::Internal:
369
+ case wgpu::ErrorType::Unknown: {
370
+ auto error = std::make_shared<GPUInternalError>(messageString);
371
+ resolve([error](jsi::Runtime &runtime) mutable {
372
+ return JSIConverter<std::shared_ptr<GPUInternalError>>::toJSI(
373
+ runtime, error);
374
+ });
375
+ break;
376
+ }
377
+ default:
378
+ reject("Unhandled GPU error type");
379
+ return;
380
+ }
381
+ });
382
+ });
383
+ }
384
+
385
+ std::unordered_set<std::string> GPUDevice::getFeatures() {
386
+ wgpu::SupportedFeatures supportedFeatures;
387
+ _instance.GetFeatures(&supportedFeatures);
388
+ std::unordered_set<std::string> result;
389
+ for (size_t i = 0; i < supportedFeatures.featureCount; ++i) {
390
+ auto feature = supportedFeatures.features[i];
391
+ std::string name;
392
+ convertEnumToJSUnion(feature, &name);
393
+ result.insert(name);
394
+ }
395
+ return result;
396
+ }
397
+
398
+ async::AsyncTaskHandle GPUDevice::getLost() {
399
+ if (_lostHandle.has_value()) {
400
+ return *_lostHandle;
401
+ }
402
+
403
+ if (_lostSettled && _lostInfo) {
404
+ return _async->postTask(
405
+ [info = _lostInfo](
406
+ const async::AsyncTaskHandle::ResolveFunction &resolve,
407
+ const async::AsyncTaskHandle::RejectFunction & /*reject*/) {
408
+ resolve([info](jsi::Runtime &runtime) mutable {
409
+ return JSIConverter<std::shared_ptr<GPUDeviceLostInfo>>::toJSI(
410
+ runtime, info);
411
+ });
412
+ },
413
+ false);
414
+ }
415
+
416
+ auto handle = _async->postTask(
417
+ [this](const async::AsyncTaskHandle::ResolveFunction &resolve,
418
+ const async::AsyncTaskHandle::RejectFunction & /*reject*/) {
419
+ if (_lostSettled && _lostInfo) {
420
+ resolve([info = _lostInfo](jsi::Runtime &runtime) mutable {
421
+ return JSIConverter<std::shared_ptr<GPUDeviceLostInfo>>::toJSI(
422
+ runtime, info);
423
+ });
424
+ return;
425
+ }
426
+
427
+ _lostResolve = resolve;
428
+ },
429
+ false);
430
+
431
+ _lostHandle = handle;
432
+ return handle;
433
+ }
434
+ void GPUDevice::addEventListener(std::string type, jsi::Function callback) {
435
+ auto funcPtr = std::make_shared<jsi::Function>(std::move(callback));
436
+ _eventListeners[type].push_back(funcPtr);
437
+ }
438
+
439
+ void GPUDevice::removeEventListener(std::string type, jsi::Function callback) {
440
+ // Note: Since jsi::Function doesn't support equality comparison,
441
+ // we cannot reliably remove a specific listener. This is a no-op.
442
+ // Most use cases (like BabylonJS) only need addEventListener to work.
443
+ (void)type;
444
+ (void)callback;
445
+ }
446
+
447
+ void GPUDevice::notifyUncapturedError(wgpu::ErrorType type,
448
+ std::string message) {
449
+ auto it = _eventListeners.find("uncapturederror");
450
+ if (it == _eventListeners.end() || it->second.empty()) {
451
+ return;
452
+ }
453
+
454
+ auto runtime = getCreationRuntime();
455
+ if (runtime == nullptr) {
456
+ return;
457
+ }
458
+
459
+ // Create the appropriate error object based on type
460
+ GPUErrorVariant error;
461
+ switch (type) {
462
+ case wgpu::ErrorType::Validation:
463
+ error = std::make_shared<GPUValidationError>(message);
464
+ break;
465
+ case wgpu::ErrorType::OutOfMemory:
466
+ error = std::make_shared<GPUOutOfMemoryError>(message);
467
+ break;
468
+ case wgpu::ErrorType::Internal:
469
+ case wgpu::ErrorType::Unknown:
470
+ default:
471
+ error = std::make_shared<GPUInternalError>(message);
472
+ break;
473
+ }
474
+
475
+ // Create the event object
476
+ auto event = std::make_shared<GPUUncapturedErrorEvent>(std::move(error));
477
+ auto eventValue =
478
+ JSIConverter<std::shared_ptr<GPUUncapturedErrorEvent>>::toJSI(*runtime,
479
+ event);
480
+
481
+ // Call all registered listeners
482
+ for (const auto &listener : it->second) {
483
+ try {
484
+ listener->call(*runtime, eventValue);
485
+ } catch (const std::exception &e) {
486
+ // Log but don't throw - we don't want one listener to break others
487
+ fprintf(stderr, "Error in uncapturederror listener: %s\n", e.what());
488
+ }
489
+ }
490
+ }
491
+
492
+ } // namespace rnwgpu