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
package/package.json ADDED
@@ -0,0 +1,139 @@
1
+ {
2
+ "name": "react-native-webgpu",
3
+ "version": "0.5.11",
4
+ "description": "React Native WebGPU",
5
+ "main": "lib/commonjs/index",
6
+ "module": "lib/module/index",
7
+ "types": "lib/typescript/src/index.d.ts",
8
+ "react-native": "src/index",
9
+ "source": "src/index",
10
+ "files": [
11
+ "src/**",
12
+ "lib/**",
13
+ "!**/__tests__/**",
14
+ "android/build.gradle",
15
+ "android/CMakeLists.txt",
16
+ "android/cpp/**",
17
+ "android/src/**",
18
+ "cpp/**/*.{h,cpp}",
19
+ "apple/**",
20
+ "libs/**",
21
+ "*.podspec"
22
+ ],
23
+ "dawn": "chromium/7770",
24
+ "scripts": {
25
+ "test": "NODE_OPTIONS='--experimental-require-module' jest -i",
26
+ "test:ref": "REFERENCE=true NODE_OPTIONS='--experimental-require-module' jest -i",
27
+ "lint": "eslint . --ext .ts,.tsx --max-warnings 0 --cache --fix",
28
+ "tsc": "tsc --noEmit",
29
+ "build": "bob build",
30
+ "build-dawn": "tsx scripts/build/dawn.ts",
31
+ "clean-dawn": "rimraf ./libs && rimraf ../../externals/dawn/out",
32
+ "clang-format": "yarn clang-format-ios && yarn clang-format-android && yarn clang-format-common",
33
+ "clang-format-ios": "find apple/ -iname \"*.h\" -o -iname \"*.mm\" -o -iname \"*.cpp\" | xargs clang-format -i",
34
+ "clang-format-android": "find android/cpp/ -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.cpp\" | xargs clang-format -i",
35
+ "clang-format-common": "find cpp/rnwgpu -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.cpp\" | xargs clang-format -i",
36
+ "cpplint": "cpplint --linelength=230 --filter=-legal/copyright,-whitespace/indent,-whitespace/comments,-whitespace/ending_newline,-build/include_order,-runtime/references,-readability/todo,-whitespace/blank_line,-whitespace/todo,-runtime/int,-build/c++11,-whitespace/parens --exclude=example --exclude=android/.cxx --exclude=cpp/webgpu --exclude=cpp/dawn --exclude=ios --exclude=android/build --exclude=node_modules --recursive .",
37
+ "install-dawn": "tsx scripts/install-dawn.ts",
38
+ "codegen": "tsx scripts/codegen/codegen.ts && yarn clang-format"
39
+ },
40
+ "keywords": [
41
+ "react-native",
42
+ "ios",
43
+ "android"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/wcandillon/react-native-webgpu.git"
48
+ },
49
+ "author": "William Candillon <wcandillon@gmail.com> (https://github.com/wcandillon)",
50
+ "license": "MIT",
51
+ "bugs": {
52
+ "url": "https://github.com/wcandillon/react-native-webgpu/issues"
53
+ },
54
+ "homepage": "https://github.com/wcandillon/react-native-webgpu#readme",
55
+ "publishConfig": {
56
+ "registry": "https://registry.npmjs.org/"
57
+ },
58
+ "devDependencies": {
59
+ "@types/jest": "^29.5.12",
60
+ "@types/lodash": "^4.17.5",
61
+ "@types/node": "^20.14.7",
62
+ "@types/pixelmatch": "5.2.4",
63
+ "@types/pngjs": "^6.0.5",
64
+ "@types/react": "^18.2.44",
65
+ "@types/seedrandom": "^3.0.8",
66
+ "@types/ws": "^8.5.10",
67
+ "@webgpu/types": "0.1.65",
68
+ "baseline-browser-mapping": "^2.9.14",
69
+ "clang-format": "^1.8.0",
70
+ "del-cli": "^5.1.0",
71
+ "eslint": "9.35.0",
72
+ "eslint-config-react-native-wcandillon": "4.0.1",
73
+ "eslint-plugin-import": "2.32.0",
74
+ "eslint-plugin-jest": "^28.8.2",
75
+ "eslint-plugin-prettier": "^5.2.1",
76
+ "jest": "^29.7.0",
77
+ "lodash": "^4.17.21",
78
+ "pixelmatch": "5.3.0",
79
+ "pngjs": "^7.0.0",
80
+ "prettier": "^3.0.3",
81
+ "puppeteer": "24.24.1",
82
+ "react": "19.1.0",
83
+ "react-native": "0.81.4",
84
+ "react-native-builder-bob": "^0.23.2",
85
+ "react-native-reanimated": "^4.2.1",
86
+ "react-native-web": "^0.21.2",
87
+ "react-native-worklets": "^0.7.0",
88
+ "rimraf": "^5.0.7",
89
+ "seedrandom": "^3.0.5",
90
+ "teapot": "^1.0.0",
91
+ "ts-morph": "^22.0.0",
92
+ "tsx": "^4.20.5",
93
+ "typescript": "^5.2.2",
94
+ "wgpu-matrix": "^3.0.2",
95
+ "ws": "^8.18.0",
96
+ "yargs": "^17.7.2"
97
+ },
98
+ "peerDependencies": {
99
+ "react": "*",
100
+ "react-native": ">=0.81.0",
101
+ "react-native-reanimated": ">=4.2.1",
102
+ "react-native-worklets": ">=0.7.2"
103
+ },
104
+ "peerDependenciesMeta": {
105
+ "react-native-reanimated": {
106
+ "optional": true
107
+ },
108
+ "react-native-worklets": {
109
+ "optional": true
110
+ }
111
+ },
112
+ "react-native-builder-bob": {
113
+ "source": "src",
114
+ "output": "lib",
115
+ "targets": [
116
+ "commonjs",
117
+ "module",
118
+ [
119
+ "typescript",
120
+ {
121
+ "project": "tsconfig.build.json"
122
+ }
123
+ ]
124
+ ]
125
+ },
126
+ "codegenConfig": {
127
+ "name": "RNWgpuViewSpec",
128
+ "type": "all",
129
+ "jsSrcsDir": "src",
130
+ "android": {
131
+ "javaPackageName": "com.webgpu"
132
+ },
133
+ "ios": {
134
+ "componentProvider": {
135
+ "WebGPUView": "WebGPUView"
136
+ }
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,47 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+ folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
5
+
6
+ Pod::Spec.new do |s|
7
+ s.name = "react-native-wgpu"
8
+ s.version = package["version"]
9
+ s.summary = package["description"]
10
+ s.homepage = package["homepage"]
11
+ s.license = package["license"]
12
+ s.authors = package["author"]
13
+
14
+ s.platforms = { :ios => min_ios_version_supported, :osx => "10.15", :visionos => "1.0" }
15
+ s.source = { :git => "https://github.com/wcandillon/react-native-webgpu.git", :tag => "#{s.version}" }
16
+
17
+ s.source_files = [
18
+ "apple/**/*.{h,c,cc,cpp,m,mm,swift}",
19
+ "cpp/**/*.{h,cpp}"
20
+ ]
21
+
22
+ s.vendored_frameworks = 'libs/apple/libwebgpu_dawn.xcframework'
23
+
24
+ s.pod_target_xcconfig = {
25
+ 'HEADER_SEARCH_PATHS' => '$(PODS_TARGET_SRCROOT)/cpp',
26
+ }
27
+
28
+ # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
29
+ # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.
30
+ if respond_to?(:install_modules_dependencies, true)
31
+ install_modules_dependencies(s)
32
+ else
33
+ s.dependency "React-Core"
34
+ s.compiler_flags = folly_compiler_flags
35
+ s.pod_target_xcconfig = {
36
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_TARGET_SRCROOT)/cpp\"",
37
+ "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
38
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20"
39
+ }
40
+ s.dependency "React-RCTFabric"
41
+ s.dependency "React-Codegen"
42
+ s.dependency "RCT-Folly"
43
+ s.dependency "RCTRequired"
44
+ s.dependency "RCTTypeSafety"
45
+ s.dependency "ReactCommon/turbomodule/core"
46
+ end
47
+ end
package/src/Canvas.tsx ADDED
@@ -0,0 +1,91 @@
1
+ import React, { useImperativeHandle, useRef, useState } from "react";
2
+ import type { ViewProps } from "react-native";
3
+ import { View } from "react-native";
4
+
5
+ import WebGPUNativeView from "./WebGPUViewNativeComponent";
6
+
7
+ let CONTEXT_COUNTER = 1;
8
+ function generateContextId() {
9
+ return CONTEXT_COUNTER++;
10
+ }
11
+
12
+ declare global {
13
+ var RNWebGPU: {
14
+ gpu: GPU;
15
+ fabric: boolean;
16
+ getNativeSurface: (contextId: number) => NativeCanvas;
17
+ MakeWebGPUCanvasContext: (
18
+ contextId: number,
19
+ width: number,
20
+ height: number,
21
+ ) => RNCanvasContext;
22
+ DecodeToUTF8: (buffer: NodeJS.ArrayBufferView | ArrayBuffer) => string;
23
+ createImageBitmap: typeof createImageBitmap;
24
+ };
25
+ }
26
+
27
+ type SurfacePointer = bigint;
28
+
29
+ export interface NativeCanvas {
30
+ surface: SurfacePointer;
31
+ width: number;
32
+ height: number;
33
+ clientWidth: number;
34
+ clientHeight: number;
35
+ }
36
+
37
+ export type RNCanvasContext = GPUCanvasContext & {
38
+ present: () => void;
39
+ };
40
+
41
+ export interface CanvasRef {
42
+ getContextId: () => number;
43
+ getContext(contextName: "webgpu"): RNCanvasContext | null;
44
+ getNativeSurface: () => NativeCanvas;
45
+ }
46
+
47
+ interface CanvasProps extends ViewProps {
48
+ transparent?: boolean;
49
+ ref?: React.Ref<CanvasRef>;
50
+ }
51
+
52
+ export const Canvas = ({ transparent, ref, ...props }: CanvasProps) => {
53
+ const viewRef = useRef(null);
54
+ const [contextId, _] = useState(() => generateContextId());
55
+ useImperativeHandle(ref, () => ({
56
+ getContextId: () => contextId,
57
+ getNativeSurface: () => {
58
+ return RNWebGPU.getNativeSurface(contextId);
59
+ },
60
+ getContext(contextName: "webgpu"): RNCanvasContext | null {
61
+ if (contextName !== "webgpu") {
62
+ throw new Error(`[WebGPU] Unsupported context: ${contextName}`);
63
+ }
64
+ if (!viewRef.current) {
65
+ throw new Error("[WebGPU] Cannot get context before mount");
66
+ }
67
+ // getBoundingClientRect became stable in RN 0.83
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
+ const view = viewRef.current as any;
70
+ const size =
71
+ "getBoundingClientRect" in view
72
+ ? view.getBoundingClientRect()
73
+ : view.unstable_getBoundingClientRect();
74
+ return RNWebGPU.MakeWebGPUCanvasContext(
75
+ contextId,
76
+ size.width,
77
+ size.height,
78
+ );
79
+ },
80
+ }));
81
+
82
+ return (
83
+ <View collapsable={false} ref={viewRef} {...props}>
84
+ <WebGPUNativeView
85
+ style={{ flex: 1 }}
86
+ contextId={contextId}
87
+ transparent={!!transparent}
88
+ />
89
+ </View>
90
+ );
91
+ };
@@ -0,0 +1,9 @@
1
+ import { TurboModuleRegistry } from "react-native";
2
+ import type { TurboModule } from "react-native";
3
+
4
+ export interface Spec extends TurboModule {
5
+ install: () => boolean;
6
+ }
7
+
8
+ // eslint-disable-next-line import/no-default-export
9
+ export default TurboModuleRegistry.getEnforcing<Spec>("WebGPUModule");
@@ -0,0 +1,113 @@
1
+ export class GPUOffscreenCanvas {
2
+ width: number;
3
+ height: number;
4
+
5
+ private context: GPUOffscreenCanvasContext;
6
+
7
+ constructor(width: number, height: number) {
8
+ this.width = width;
9
+ this.height = height;
10
+ this.context = new GPUOffscreenCanvasContext(this);
11
+ }
12
+
13
+ getContext(contextId: "webgpu"): GPUOffscreenCanvasContext | null {
14
+ if (contextId === "webgpu") {
15
+ return this.context;
16
+ }
17
+ // Implement other context types if necessary
18
+ return null;
19
+ }
20
+
21
+ getImageData() {
22
+ const device = this.context.getDevice();
23
+ const texture = this.context.getTexture();
24
+ const commandEncoder = device.createCommandEncoder();
25
+ const bytesPerRow = this.width * 4;
26
+ const buffer = device.createBuffer({
27
+ size: bytesPerRow * this.height,
28
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
29
+ });
30
+ commandEncoder.copyTextureToBuffer(
31
+ { texture: texture },
32
+ { buffer: buffer, bytesPerRow },
33
+ [this.width, this.height],
34
+ );
35
+ device.queue.submit([commandEncoder.finish()]);
36
+
37
+ return buffer.mapAsync(GPUMapMode.READ).then(() => {
38
+ const arrayBuffer = buffer.getMappedRange();
39
+ const uint8Array = new Uint8Array(arrayBuffer);
40
+ const data = Array.from(uint8Array);
41
+ buffer.unmap();
42
+ return {
43
+ data,
44
+ width: this.width,
45
+ height: this.height,
46
+ format: navigator.gpu.getPreferredCanvasFormat(),
47
+ };
48
+ });
49
+ }
50
+ }
51
+
52
+ class GPUOffscreenCanvasContext implements GPUCanvasContext {
53
+ __brand = "GPUCanvasContext" as const;
54
+
55
+ private textureFormat: GPUTextureFormat;
56
+ private texture: GPUTexture | null = null;
57
+ private device: GPUDevice | null = null;
58
+
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ constructor(public readonly canvas: any) {
61
+ this.textureFormat = navigator.gpu.getPreferredCanvasFormat();
62
+ }
63
+ getConfiguration(): GPUCanvasConfigurationOut | null {
64
+ throw new Error("Method not implemented.");
65
+ }
66
+
67
+ present() {
68
+ // Do nothing
69
+ }
70
+
71
+ getDevice() {
72
+ if (!this.device) {
73
+ throw new Error("Device is not configured.");
74
+ }
75
+ return this.device;
76
+ }
77
+
78
+ getTexture() {
79
+ if (!this.texture) {
80
+ throw new Error("Texture is not configured");
81
+ }
82
+ return this.texture;
83
+ }
84
+
85
+ configure(config: GPUCanvasConfiguration) {
86
+ // Configure the canvas context with the device and format
87
+ this.device = config.device;
88
+ this.texture = config.device.createTexture({
89
+ size: [this.canvas.width, this.canvas.height],
90
+ format: this.textureFormat,
91
+ usage:
92
+ GPUTextureUsage.RENDER_ATTACHMENT |
93
+ GPUTextureUsage.COPY_SRC |
94
+ GPUTextureUsage.TEXTURE_BINDING,
95
+ });
96
+ return undefined;
97
+ }
98
+
99
+ unconfigure() {
100
+ // Unconfigure the canvas context
101
+ if (this.texture) {
102
+ this.texture.destroy();
103
+ }
104
+ return undefined;
105
+ }
106
+
107
+ getCurrentTexture(): GPUTexture {
108
+ if (!this.texture) {
109
+ throw new Error("Texture is not configured");
110
+ }
111
+ return this.texture;
112
+ }
113
+ }
@@ -0,0 +1,11 @@
1
+ import { codegenNativeComponent } from "react-native";
2
+ import type { Int32 } from "react-native/Libraries/Types/CodegenTypes";
3
+ import type { ViewProps } from "react-native";
4
+
5
+ export interface NativeProps extends ViewProps {
6
+ contextId: Int32;
7
+ transparent: boolean;
8
+ }
9
+
10
+ // eslint-disable-next-line import/no-default-export
11
+ export default codegenNativeComponent<NativeProps>("WebGPUView");
@@ -0,0 +1,113 @@
1
+ import React, { useEffect, useRef } from "react";
2
+ import { StyleSheet } from "react-native";
3
+ import type { Int32 } from "react-native/Libraries/Types/CodegenTypes";
4
+ import type { ViewProps } from "react-native";
5
+
6
+ import { contextIdToId } from "./utils";
7
+
8
+ export interface NativeProps extends ViewProps {
9
+ contextId: Int32;
10
+ transparent: boolean;
11
+ }
12
+
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ function debounce<T extends (...args: any[]) => void>(
15
+ func: T,
16
+ wait: number,
17
+ immediate = false,
18
+ ) {
19
+ let timeout: ReturnType<typeof setTimeout> | undefined;
20
+ return function debounced(
21
+ this: ThisParameterType<T>,
22
+ ...args: Parameters<T>
23
+ ) {
24
+ const context = this;
25
+ const callNow = immediate && !timeout;
26
+ if (timeout) {
27
+ clearTimeout(timeout);
28
+ }
29
+ timeout = setTimeout(() => {
30
+ timeout = undefined;
31
+ if (!immediate) {
32
+ func.apply(context, args);
33
+ }
34
+ }, wait);
35
+ if (callNow) {
36
+ func.apply(context, args);
37
+ }
38
+ };
39
+ }
40
+
41
+ function resizeCanvas(canvas: HTMLCanvasElement | null) {
42
+ if (!canvas) {
43
+ return;
44
+ }
45
+
46
+ const dpr = window.devicePixelRatio || 1;
47
+
48
+ const { height, width } = canvas.getBoundingClientRect();
49
+ canvas.setAttribute("height", (height * dpr).toString());
50
+ canvas.setAttribute("width", (width * dpr).toString());
51
+ }
52
+
53
+ // eslint-disable-next-line import/no-default-export
54
+ export default function WebGPUViewNativeComponent(
55
+ props: NativeProps,
56
+ ): React.JSX.Element {
57
+ const { contextId, style, transparent, ...rest } = props;
58
+
59
+ const canvasElm = useRef<HTMLCanvasElement>();
60
+
61
+ useEffect(() => {
62
+ const onResize = debounce(
63
+ () => resizeCanvas(canvasElm.current ?? null),
64
+ 100,
65
+ );
66
+ window.addEventListener("resize", onResize);
67
+ return () => {
68
+ window.removeEventListener("resize", onResize);
69
+ };
70
+ }, []);
71
+
72
+ return React.createElement("canvas", {
73
+ ...rest,
74
+ id: contextIdToId(contextId),
75
+ style: {
76
+ ...styles.view,
77
+ ...styles.flex1,
78
+ ...(transparent === false ? { backgroundColor: "white" } : {}),
79
+ ...(typeof style === "object" ? style : {}),
80
+ },
81
+ ref: (ref: HTMLCanvasElement) => {
82
+ canvasElm.current = ref;
83
+ if (ref) {
84
+ resizeCanvas(ref);
85
+ }
86
+ },
87
+ });
88
+ }
89
+
90
+ const styles = StyleSheet.create({
91
+ flex1: {
92
+ flex: 1,
93
+ },
94
+ view: {
95
+ alignItems: "stretch",
96
+ backgroundColor: "transparent",
97
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
98
+ // @ts-expect-error
99
+ border: "0 solid black",
100
+ boxSizing: "border-box",
101
+ display: "flex",
102
+ flexBasis: "auto",
103
+ flexDirection: "column",
104
+ flexShrink: 0,
105
+ listStyle: "none",
106
+ margin: 0,
107
+ minHeight: 0,
108
+ minWidth: 0,
109
+ padding: 0,
110
+ position: "relative",
111
+ zIndex: 0,
112
+ },
113
+ });
@@ -0,0 +1,53 @@
1
+ import { contextIdToId } from "./utils";
2
+
3
+ const fabric = true;
4
+
5
+ function getNativeSurface(contextId: number) {
6
+ const canvas = document.getElementById(
7
+ contextIdToId(contextId),
8
+ ) as HTMLCanvasElement;
9
+
10
+ const { height, width } = canvas.getBoundingClientRect()!;
11
+
12
+ return {
13
+ surface: BigInt(contextId),
14
+ height,
15
+ width,
16
+ clientHeight: height,
17
+ clientWidth: width,
18
+ };
19
+ }
20
+
21
+ function makeWebGPUCanvasContext(
22
+ contextId: number,
23
+ width: number,
24
+ height: number,
25
+ ) {
26
+ const canvas = document.getElementById(
27
+ contextIdToId(contextId),
28
+ ) as HTMLCanvasElement;
29
+
30
+ const dpr = window.devicePixelRatio || 1;
31
+ const pixelWidth = (width * dpr).toString();
32
+ const pixelHeight = (height * dpr).toString();
33
+
34
+ if (
35
+ canvas.getAttribute("width") !== pixelWidth ||
36
+ canvas.getAttribute("height") !== pixelHeight
37
+ ) {
38
+ canvas.setAttribute("width", pixelWidth);
39
+ canvas.setAttribute("height", pixelHeight);
40
+ }
41
+
42
+ const context = canvas.getContext("webgpu")!;
43
+ return Object.assign(context, {
44
+ present: () => {},
45
+ });
46
+ }
47
+
48
+ // @ts-expect-error - polyfill for RNWebGPU native module
49
+ window.RNWebGPU = {
50
+ getNativeSurface,
51
+ MakeWebGPUCanvasContext: makeWebGPUCanvasContext,
52
+ fabric,
53
+ };
@@ -0,0 +1,30 @@
1
+ // https://github.com/mrousavy/react-native-vision-camera/blob/main/package/src/dependencies/ModuleProxy.ts
2
+ type ImportType = ReturnType<typeof require>;
3
+
4
+ /**
5
+ * Create a lazily-imported module proxy.
6
+ * This is useful for lazily requiring optional dependencies.
7
+ */
8
+ export const createModuleProxy = <TModule>(
9
+ getModule: () => ImportType,
10
+ ): TModule => {
11
+ const holder: { module: TModule | undefined } = { module: undefined };
12
+
13
+ const proxy = new Proxy(holder, {
14
+ get: (target, property) => {
15
+ if (target.module == null) {
16
+ // lazy initialize module via require()
17
+ // caller needs to make sure the require() call is wrapped in a try/catch
18
+ target.module = getModule() as TModule;
19
+ }
20
+ return target.module[property as keyof typeof holder.module];
21
+ },
22
+ });
23
+ return proxy as unknown as TModule;
24
+ };
25
+
26
+ export class OptionalDependencyNotInstalledError extends Error {
27
+ constructor(name: string) {
28
+ super(`${name} is not installed!`);
29
+ }
30
+ }
@@ -0,0 +1 @@
1
+ export * from "./reanimated";
@@ -0,0 +1,19 @@
1
+ import type * as ReanimatedT from "react-native-reanimated";
2
+
3
+ import {
4
+ OptionalDependencyNotInstalledError,
5
+ createModuleProxy,
6
+ } from "../ModuleProxy";
7
+
8
+ type TReanimated = typeof ReanimatedT;
9
+
10
+ const Reanimated = createModuleProxy<TReanimated>(() => {
11
+ try {
12
+ return require("react-native-reanimated");
13
+ } catch (e) {
14
+ throw new OptionalDependencyNotInstalledError("react-native-reanimated");
15
+ }
16
+ });
17
+
18
+ // eslint-disable-next-line import/no-default-export
19
+ export default Reanimated;
@@ -0,0 +1,2 @@
1
+ export { registerWebGPUForReanimated } from "./registerWebGPUForReanimated";
2
+ export { default as Reanimated } from "./ReanimatedProxy";
@@ -0,0 +1,43 @@
1
+ // Declare global WebGPU worklet helper functions (installed by native module)
2
+ declare function __webgpuIsWebGPUObject(obj: unknown): boolean;
3
+ declare function __webgpuBox(obj: object): {
4
+ unbox: () => object;
5
+ __boxedWebGPU: true;
6
+ };
7
+
8
+ let isRegistered = false;
9
+
10
+ /**
11
+ * Register WebGPU objects for Worklets serialization.
12
+ * This allows GPUDevice, GPUCanvasContext, etc. to be passed to worklets.
13
+ *
14
+ * This is called automatically when the module loads if react-native-worklets is installed.
15
+ */
16
+ export const registerWebGPUForReanimated = () => {
17
+ if (isRegistered) {
18
+ return;
19
+ }
20
+ isRegistered = true;
21
+
22
+ try {
23
+ const { registerCustomSerializable } = require("react-native-worklets");
24
+
25
+ registerCustomSerializable({
26
+ name: "WebGPU",
27
+ determine: (value: object): value is object => {
28
+ "worklet";
29
+ return __webgpuIsWebGPUObject(value);
30
+ },
31
+ pack: (value: object) => {
32
+ "worklet";
33
+ return __webgpuBox(value);
34
+ },
35
+ unpack: (boxed: { unbox: () => object }) => {
36
+ "worklet";
37
+ return boxed.unbox();
38
+ },
39
+ });
40
+ } catch {
41
+ // react-native-worklets not installed, skip registration
42
+ }
43
+ };