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,50 @@
1
+ package com.webgpu;
2
+
3
+ import android.util.Log;
4
+
5
+ import androidx.annotation.OptIn;
6
+
7
+ import java.util.HashSet;
8
+ import java.util.Set;
9
+
10
+ import com.facebook.proguard.annotations.DoNotStrip;
11
+ import com.facebook.react.bridge.ReactApplicationContext;
12
+ import com.facebook.react.bridge.JavaScriptContextHolder;
13
+ import com.facebook.react.bridge.ReactMethod;
14
+ import com.facebook.react.common.annotations.FrameworkAPI;
15
+ import com.facebook.react.module.annotations.ReactModule;
16
+ import com.facebook.react.modules.blob.BlobModule;
17
+ import com.facebook.react.modules.blob.BlobProvider;
18
+ import com.facebook.react.turbomodule.core.CallInvokerHolderImpl;
19
+ import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder;
20
+
21
+ @ReactModule(name = WebGPUModule.NAME)
22
+ public class WebGPUModule extends NativeWebGPUModuleSpec {
23
+ static {
24
+ System.loadLibrary("react-native-wgpu"); // Load the C++ library
25
+ }
26
+
27
+ public WebGPUModule(ReactApplicationContext reactContext) {
28
+ super(reactContext);
29
+ // Initialize the C++ module
30
+ initialize();
31
+ }
32
+
33
+ @OptIn(markerClass = FrameworkAPI.class)
34
+ @ReactMethod(isBlockingSynchronousMethod = true)
35
+ public boolean install() {
36
+ ReactApplicationContext context = getReactApplicationContext();
37
+ JavaScriptContextHolder jsContext = context.getJavaScriptContextHolder();
38
+ CallInvokerHolder callInvokerHolder = context.getCatalystInstance().getJSCallInvokerHolder();
39
+ BlobModule blobModule = getReactApplicationContext().getNativeModule(BlobModule.class);
40
+ if (blobModule == null) {
41
+ throw new RuntimeException("React Native's BlobModule was not found!");
42
+ }
43
+ initializeNative(jsContext.get(), (CallInvokerHolderImpl) callInvokerHolder, blobModule);
44
+ return true;
45
+ }
46
+
47
+ @OptIn(markerClass = FrameworkAPI.class)
48
+ @DoNotStrip
49
+ private native void initializeNative(long jsRuntime, CallInvokerHolderImpl jsInvoker, BlobModule blobModule);
50
+ }
@@ -0,0 +1,41 @@
1
+ package com.webgpu;
2
+
3
+ import android.annotation.SuppressLint;
4
+ import android.content.Context;
5
+ import android.view.SurfaceHolder;
6
+ import android.view.SurfaceView;
7
+
8
+ import androidx.annotation.NonNull;
9
+
10
+ @SuppressLint("ViewConstructor")
11
+ public class WebGPUSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
12
+
13
+ WebGPUAPI mApi;
14
+
15
+ public WebGPUSurfaceView(Context context, WebGPUAPI api) {
16
+ super(context);
17
+ mApi = api;
18
+ getHolder().addCallback(this);
19
+ }
20
+
21
+ @Override
22
+ protected void onDetachedFromWindow() {
23
+ super.onDetachedFromWindow();
24
+ mApi.surfaceDestroyed();
25
+ }
26
+
27
+ @Override
28
+ public void surfaceCreated(@NonNull SurfaceHolder holder) {
29
+ mApi.surfaceCreated(holder.getSurface());
30
+ }
31
+
32
+ @Override
33
+ public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
34
+ mApi.surfaceChanged(holder.getSurface());
35
+ }
36
+
37
+ @Override
38
+ public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
39
+ mApi.surfaceOffscreen();
40
+ }
41
+ }
@@ -0,0 +1,79 @@
1
+ package com.webgpu;
2
+
3
+ import android.annotation.SuppressLint;
4
+ import android.content.Context;
5
+ import android.graphics.PixelFormat;
6
+ import android.os.Build;
7
+ import android.view.Surface;
8
+ import android.view.SurfaceControl;
9
+ import android.view.SurfaceHolder;
10
+ import android.view.SurfaceView;
11
+
12
+ import androidx.annotation.NonNull;
13
+ import androidx.annotation.RequiresApi;
14
+
15
+
16
+ @SuppressLint("ViewConstructor")
17
+ @RequiresApi(api = Build.VERSION_CODES.Q)
18
+ public class WebGPUSurfaceViewWithSC extends SurfaceView implements SurfaceHolder.Callback {
19
+
20
+ WebGPUAPI mApi;
21
+ SurfaceControl mSurfaceControl;
22
+ Surface mSurface;
23
+
24
+ public WebGPUSurfaceViewWithSC(Context context, WebGPUAPI api) {
25
+ super(context);
26
+ mApi = api;
27
+ getHolder().addCallback(this);
28
+ }
29
+
30
+ @Override
31
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
32
+ super.onLayout(changed, left, top, right, bottom);
33
+
34
+ }
35
+
36
+ @Override
37
+ protected void onDetachedFromWindow() {
38
+ super.onDetachedFromWindow();
39
+ }
40
+
41
+ @Override
42
+ public void surfaceCreated(@NonNull SurfaceHolder holder) {
43
+ if (mSurfaceControl != null) {
44
+ SurfaceControl.Transaction tr = new SurfaceControl.Transaction();
45
+ tr.setVisibility(mSurfaceControl, true);
46
+ tr.reparent(mSurfaceControl, getSurfaceControl());
47
+ tr.apply();
48
+ } else {
49
+ SurfaceControl.Builder scb = new SurfaceControl.Builder();
50
+ scb.setName("WebGPUView");
51
+ scb.setOpaque(true);
52
+ scb.setBufferSize(getWidth(), getHeight());
53
+ scb.setParent(getSurfaceControl());
54
+ scb.setFormat(PixelFormat.RGBA_8888);
55
+ mSurfaceControl = scb.build();
56
+ mSurface = new Surface(mSurfaceControl);
57
+ mApi.surfaceCreated(mSurface);
58
+ }
59
+ SurfaceControl.Transaction tr = new SurfaceControl.Transaction();
60
+ tr.setVisibility(mSurfaceControl, true);
61
+ tr.apply();
62
+ }
63
+
64
+ @Override
65
+ public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
66
+ mApi.surfaceChanged(mSurface);
67
+ SurfaceControl.Transaction tr = new SurfaceControl.Transaction();
68
+ tr.setVisibility(mSurfaceControl, true);
69
+ tr.setBufferSize(mSurfaceControl, getWidth(), getHeight());
70
+ tr.apply();
71
+ }
72
+
73
+ @Override
74
+ public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
75
+ SurfaceControl.Transaction tr = new SurfaceControl.Transaction();
76
+ tr.reparent(mSurfaceControl, null);
77
+ tr.apply();
78
+ }
79
+ }
@@ -0,0 +1,46 @@
1
+ package com.webgpu;
2
+
3
+ import android.annotation.SuppressLint;
4
+ import android.content.Context;
5
+ import android.graphics.SurfaceTexture;
6
+ import android.view.Surface;
7
+ import android.view.TextureView;
8
+ import androidx.annotation.NonNull;
9
+
10
+ import org.w3c.dom.Text;
11
+
12
+ @SuppressLint("ViewConstructor")
13
+ public class WebGPUTextureView extends TextureView implements TextureView.SurfaceTextureListener {
14
+
15
+ WebGPUAPI mApi;
16
+
17
+ public WebGPUTextureView(Context context, WebGPUAPI api) {
18
+ super(context);
19
+ mApi = api;
20
+ setOpaque(false);
21
+ setSurfaceTextureListener(this);
22
+ }
23
+
24
+ @Override
25
+ public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int width, int height) {
26
+ Surface surface = new Surface(surfaceTexture);
27
+ mApi.surfaceCreated(surface);
28
+ }
29
+
30
+ @Override
31
+ public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int width, int height) {
32
+ Surface surface = new Surface(surfaceTexture);
33
+ mApi.surfaceChanged(surface);
34
+ }
35
+
36
+ @Override
37
+ public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) {
38
+ mApi.surfaceDestroyed();
39
+ return true;
40
+ }
41
+
42
+ @Override
43
+ public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) {
44
+ // No implementation needed
45
+ }
46
+ }
@@ -0,0 +1,108 @@
1
+ package com.webgpu;
2
+
3
+ import android.content.Context;
4
+ import android.os.Build;
5
+ import android.view.Surface;
6
+ import android.view.View;
7
+
8
+ import com.facebook.proguard.annotations.DoNotStrip;
9
+ import com.facebook.react.uimanager.ThemedReactContext;
10
+ import com.facebook.react.views.view.ReactViewGroup;
11
+
12
+ public class WebGPUView extends ReactViewGroup implements WebGPUAPI {
13
+
14
+
15
+ private int mContextId;
16
+ private boolean mTransparent = false;
17
+ private WebGPUModule mModule;
18
+ private View mView = null;
19
+
20
+ WebGPUView(Context context) {
21
+ super(context);
22
+ }
23
+
24
+ public void setContextId(int contextId) {
25
+ if (mModule == null) {
26
+ Context context = getContext();
27
+ if (context instanceof ThemedReactContext) {
28
+ mModule = ((ThemedReactContext) context).getReactApplicationContext().getNativeModule(WebGPUModule.class);
29
+ }
30
+ }
31
+ mContextId = contextId;
32
+ }
33
+
34
+ public void setTransparent(boolean value) {
35
+ Context ctx = getContext();
36
+ if (value != mTransparent || mView == null) {
37
+ if (mView != null) {
38
+ removeView(mView);
39
+ }
40
+ mTransparent = value;
41
+ if (mTransparent) {
42
+ // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
43
+ // mView = new WebGPUAHBView(ctx, this);
44
+ // } else {
45
+ mView = new WebGPUTextureView(ctx, this);
46
+ // }
47
+ } else {
48
+ mView = new WebGPUSurfaceView(ctx, this);
49
+ }
50
+ addView(mView);
51
+ }
52
+ }
53
+
54
+ @Override
55
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
56
+ super.onLayout(changed, left, top, right, bottom);
57
+ mView.layout(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight());
58
+ }
59
+
60
+ @Override
61
+ public void surfaceCreated(Surface surface) {
62
+ float density = getResources().getDisplayMetrics().density;
63
+ float width = getWidth() / density;
64
+ float height = getHeight() / density;
65
+ onSurfaceCreate(surface, mContextId, width, height);
66
+ }
67
+
68
+ @Override
69
+ public void surfaceChanged(Surface surface) {
70
+ float density = getResources().getDisplayMetrics().density;
71
+ float width = getWidth() / density;
72
+ float height = getHeight() / density;
73
+ onSurfaceChanged(surface, mContextId, width, height);
74
+ }
75
+
76
+ @Override
77
+ public void surfaceDestroyed() {
78
+ onSurfaceDestroy(mContextId);
79
+ }
80
+
81
+ @Override
82
+ public void surfaceOffscreen() {
83
+ switchToOffscreenSurface(mContextId);
84
+ }
85
+
86
+ @DoNotStrip
87
+ private native void onSurfaceCreate(
88
+ Surface surface,
89
+ int contextId,
90
+ float width,
91
+ float height
92
+ );
93
+
94
+ @DoNotStrip
95
+ private native void onSurfaceChanged(
96
+ Surface surface,
97
+ int contextId,
98
+ float width,
99
+ float height
100
+ );
101
+
102
+ @DoNotStrip
103
+ private native void onSurfaceDestroy(int contextId);
104
+
105
+ @DoNotStrip
106
+ private native void switchToOffscreenSurface(int contextId);
107
+
108
+ }
@@ -0,0 +1,38 @@
1
+ package com.webgpu;
2
+
3
+ import androidx.annotation.NonNull;
4
+ import androidx.annotation.Nullable;
5
+
6
+ import com.facebook.react.module.annotations.ReactModule;
7
+ import com.facebook.react.uimanager.ThemedReactContext;
8
+ import com.facebook.react.uimanager.annotations.ReactProp;
9
+
10
+ @ReactModule(name = WebGPUViewManager.NAME)
11
+ public class WebGPUViewManager extends WebGPUViewManagerSpec<WebGPUView> {
12
+
13
+ public static final String NAME = "WebGPUView";
14
+
15
+ @NonNull
16
+ @Override
17
+ public String getName() {
18
+ return NAME;
19
+ }
20
+
21
+ @NonNull
22
+ @Override
23
+ public WebGPUView createViewInstance(@NonNull ThemedReactContext context) {
24
+ return new WebGPUView(context);
25
+ }
26
+
27
+ @Override
28
+ @ReactProp(name = "transparent")
29
+ public void setTransparent(WebGPUView view, boolean value) {
30
+ view.setTransparent(value);
31
+ }
32
+
33
+ @Override
34
+ @ReactProp(name = "contextId")
35
+ public void setContextId(WebGPUView view, int value) {
36
+ view.setContextId(value);
37
+ }
38
+ }
@@ -0,0 +1,50 @@
1
+
2
+ package com.webgpu;
3
+
4
+ import com.facebook.react.TurboReactPackage;
5
+ import com.facebook.react.bridge.NativeModule;
6
+ import com.facebook.react.bridge.ReactApplicationContext;
7
+ import com.facebook.react.module.annotations.ReactModule;
8
+ import com.facebook.react.module.model.ReactModuleInfo;
9
+ import com.facebook.react.module.model.ReactModuleInfoProvider;
10
+ import com.facebook.react.uimanager.ViewManager;
11
+
12
+ import java.util.Collections;
13
+ import java.util.HashMap;
14
+ import java.util.List;
15
+ import java.util.Map;
16
+
17
+ public class WebGPUViewPackage extends TurboReactPackage {
18
+ @Override
19
+ public NativeModule getModule(String name, ReactApplicationContext reactContext) {
20
+ if (name.equals(WebGPUModule.NAME)) {
21
+ return new WebGPUModule(reactContext);
22
+ }
23
+ return null;
24
+ }
25
+
26
+ @Override
27
+ public ReactModuleInfoProvider getReactModuleInfoProvider() {
28
+ return () -> {
29
+ Map<String, ReactModuleInfo> map = new HashMap<>();
30
+ map.put(
31
+ WebGPUModule.NAME,
32
+ new ReactModuleInfo(
33
+ WebGPUModule.NAME,
34
+ WebGPUModule.class.getName(),
35
+ false,
36
+ false,
37
+ false,
38
+ false,
39
+ true // isTurboModule
40
+ )
41
+ );
42
+ return map;
43
+ };
44
+ }
45
+
46
+ @Override
47
+ public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
48
+ return Collections.singletonList(new WebGPUViewManager());
49
+ }
50
+ }
@@ -0,0 +1,24 @@
1
+ package com.webgpu;
2
+
3
+ import android.view.View;
4
+
5
+ import androidx.annotation.Nullable;
6
+
7
+ import com.facebook.react.uimanager.SimpleViewManager;
8
+ import com.facebook.react.uimanager.ViewManagerDelegate;
9
+ import com.facebook.react.viewmanagers.WebGPUViewManagerDelegate;
10
+ import com.facebook.react.viewmanagers.WebGPUViewManagerInterface;
11
+
12
+ public abstract class WebGPUViewManagerSpec<T extends View> extends SimpleViewManager<T> implements WebGPUViewManagerInterface<T> {
13
+ private final ViewManagerDelegate<T> mDelegate;
14
+
15
+ public WebGPUViewManagerSpec() {
16
+ mDelegate = new WebGPUViewManagerDelegate(this);
17
+ }
18
+
19
+ @Nullable
20
+ @Override
21
+ protected ViewManagerDelegate<T> getDelegate() {
22
+ return mDelegate;
23
+ }
24
+ }
@@ -0,0 +1,31 @@
1
+ #pragma once
2
+
3
+ #include "PlatformContext.h"
4
+ #include <string>
5
+
6
+ namespace rnwgpu {
7
+
8
+ class ApplePlatformContext : public PlatformContext {
9
+ public:
10
+ ApplePlatformContext();
11
+ ~ApplePlatformContext() = default;
12
+
13
+ wgpu::Surface makeSurface(wgpu::Instance instance, void *surface, int width,
14
+ int height) override;
15
+
16
+ ImageData createImageBitmap(std::string blobId, double offset,
17
+ double size) override;
18
+
19
+ void
20
+ createImageBitmapAsync(std::string blobId, double offset, double size,
21
+ std::function<void(ImageData)> onSuccess,
22
+ std::function<void(std::string)> onError) override;
23
+
24
+ ImageData createImageBitmapFromData(std::span<const uint8_t> data) override;
25
+
26
+ void createImageBitmapFromDataAsync(
27
+ std::span<const uint8_t> data, std::function<void(ImageData)> onSuccess,
28
+ std::function<void(std::string)> onError) override;
29
+ };
30
+
31
+ } // namespace rnwgpu
@@ -0,0 +1,157 @@
1
+ #include "ApplePlatformContext.h"
2
+
3
+ #include <TargetConditionals.h>
4
+
5
+ #import <React/RCTBlobManager.h>
6
+ #import <React/RCTBridge+Private.h>
7
+ #import <ReactCommon/RCTTurboModule.h>
8
+
9
+ #include "RNWebGPUManager.h"
10
+ #include "WebGPUModule.h"
11
+
12
+ namespace rnwgpu {
13
+
14
+ void checkIfUsingSimulatorWithAPIValidation() {
15
+ #if TARGET_OS_SIMULATOR
16
+ NSDictionary *environment = [[NSProcessInfo processInfo] environment];
17
+ NSString *metalDeviceWrapperType = environment[@"METAL_DEVICE_WRAPPER_TYPE"];
18
+
19
+ if ([metalDeviceWrapperType isEqualToString:@"1"]) {
20
+ throw std::runtime_error(
21
+ "To use React Native WebGPU project on the iOS simulator, you need to "
22
+ "disable the Metal validation API. In 'Edit Scheme,' uncheck 'Metal "
23
+ "Validation.'");
24
+ }
25
+ #endif
26
+ }
27
+
28
+ ApplePlatformContext::ApplePlatformContext() {
29
+ checkIfUsingSimulatorWithAPIValidation();
30
+ }
31
+
32
+ wgpu::Surface ApplePlatformContext::makeSurface(wgpu::Instance instance,
33
+ void *surface, int width,
34
+ int height) {
35
+ wgpu::SurfaceSourceMetalLayer metalSurfaceDesc;
36
+ metalSurfaceDesc.layer = surface;
37
+ wgpu::SurfaceDescriptor surfaceDescriptor;
38
+ surfaceDescriptor.nextInChain = &metalSurfaceDesc;
39
+ return instance.CreateSurface(&surfaceDescriptor);
40
+ }
41
+
42
+ static std::span<const uint8_t> nsDataToSpan(NSData *data) {
43
+ return {static_cast<const uint8_t *>(data.bytes), data.length};
44
+ }
45
+
46
+ ImageData ApplePlatformContext::createImageBitmap(std::string blobId,
47
+ double offset, double size) {
48
+ RCTBlobManager *blobManager =
49
+ [[RCTBridge currentBridge] moduleForClass:RCTBlobManager.class];
50
+ NSData *blobData =
51
+ [blobManager resolve:[NSString stringWithUTF8String:blobId.c_str()]
52
+ offset:(long)offset
53
+ size:(long)size];
54
+
55
+ if (!blobData) {
56
+ throw std::runtime_error("Couldn't retrieve blob data");
57
+ }
58
+
59
+ return createImageBitmapFromData(nsDataToSpan(blobData));
60
+ }
61
+
62
+ void ApplePlatformContext::createImageBitmapAsync(
63
+ std::string blobId, double offset, double size,
64
+ std::function<void(ImageData)> onSuccess,
65
+ std::function<void(std::string)> onError) {
66
+ // Resolve blob on current thread (requires RCTBridge access)
67
+ RCTBlobManager *blobManager =
68
+ [[RCTBridge currentBridge] moduleForClass:RCTBlobManager.class];
69
+ NSData *blobData =
70
+ [blobManager resolve:[NSString stringWithUTF8String:blobId.c_str()]
71
+ offset:(long)offset
72
+ size:(long)size];
73
+
74
+ if (!blobData) {
75
+ onError("Couldn't retrieve blob data");
76
+ return;
77
+ }
78
+
79
+ // blobData is alive during this synchronous call;
80
+ // createImageBitmapFromDataAsync copies the span before dispatching
81
+ createImageBitmapFromDataAsync(nsDataToSpan(blobData), std::move(onSuccess),
82
+ std::move(onError));
83
+ }
84
+
85
+ ImageData
86
+ ApplePlatformContext::createImageBitmapFromData(std::span<const uint8_t> data) {
87
+ // This avoids a copy by assuming the UIImage/NSImage constructors
88
+ // decode `nsData` eagerly before the memory for the wrapped `data`
89
+ // is freed.
90
+ //
91
+ // Since we get the `CGImageRef` from `image` and then throw
92
+ // it away, that's a fairly safe assumption.
93
+ NSData *nsData =
94
+ [NSData dataWithBytesNoCopy:const_cast<uint8_t *>(data.data())
95
+ length:data.size()
96
+ freeWhenDone:NO];
97
+
98
+ #if !TARGET_OS_OSX
99
+ UIImage *image = [UIImage imageWithData:nsData];
100
+ #else
101
+ NSImage *image = [[NSImage alloc] initWithData:nsData];
102
+ #endif
103
+ if (!image) {
104
+ throw std::runtime_error("Couldn't decode image");
105
+ }
106
+
107
+ #if !TARGET_OS_OSX
108
+ CGImageRef cgImage = image.CGImage;
109
+ #else
110
+ CGImageRef cgImage = [image CGImageForProposedRect:NULL
111
+ context:NULL
112
+ hints:NULL];
113
+ #endif
114
+ size_t width = CGImageGetWidth(cgImage);
115
+ size_t height = CGImageGetHeight(cgImage);
116
+ size_t bitsPerComponent = 8;
117
+ size_t bytesPerRow = width * 4;
118
+
119
+ ImageData result;
120
+ result.width = static_cast<int>(width);
121
+ result.height = static_cast<int>(height);
122
+ result.data.resize(height * bytesPerRow);
123
+ result.format = wgpu::TextureFormat::RGBA8Unorm;
124
+
125
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
126
+ CGContextRef context = CGBitmapContextCreate(
127
+ result.data.data(), width, height, bitsPerComponent, bytesPerRow,
128
+ colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
129
+
130
+ CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage);
131
+
132
+ CGContextRelease(context);
133
+ CGColorSpaceRelease(colorSpace);
134
+
135
+ return result;
136
+ }
137
+
138
+ void ApplePlatformContext::createImageBitmapFromDataAsync(
139
+ std::span<const uint8_t> data, std::function<void(ImageData)> onSuccess,
140
+ std::function<void(std::string)> onError) {
141
+ // Copy span data into shared_ptr so the dispatch_async block owns the memory
142
+ auto ownedData =
143
+ std::make_shared<std::vector<uint8_t>>(data.begin(), data.end());
144
+
145
+ dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
146
+ @autoreleasepool {
147
+ try {
148
+ auto result = createImageBitmapFromData(*ownedData);
149
+ onSuccess(std::move(result));
150
+ } catch (const std::exception &e) {
151
+ onError(e.what());
152
+ }
153
+ }
154
+ });
155
+ }
156
+
157
+ } // namespace rnwgpu
@@ -0,0 +1,13 @@
1
+ #pragma once
2
+
3
+ #import "RNWGUIKit.h"
4
+ #import "WebGPUModule.h"
5
+
6
+ @interface MetalView : RNWGPlatformView
7
+
8
+ @property NSNumber *contextId;
9
+
10
+ - (void)configure;
11
+ - (void)update;
12
+
13
+ @end
@@ -0,0 +1,50 @@
1
+ #import "MetalView.h"
2
+ #import "webgpu/webgpu_cpp.h"
3
+
4
+ @implementation MetalView {
5
+ BOOL _isConfigured;
6
+ }
7
+
8
+ #if !TARGET_OS_OSX
9
+ + (Class)layerClass {
10
+ return [CAMetalLayer class];
11
+ }
12
+ #else // !TARGET_OS_OSX
13
+ - (instancetype)init {
14
+ self = [super init];
15
+ if (self) {
16
+ self.wantsLayer = true;
17
+ self.layer = [CAMetalLayer layer];
18
+ }
19
+ return self;
20
+ }
21
+ #endif // !TARGET_OS_OSX
22
+
23
+ - (void)configure {
24
+ auto size = self.frame.size;
25
+ std::shared_ptr<rnwgpu::RNWebGPUManager> manager = [WebGPUModule getManager];
26
+ void *nativeSurface = (__bridge void *)self.layer;
27
+ auto &registry = rnwgpu::SurfaceRegistry::getInstance();
28
+ auto gpu = manager->_gpu;
29
+ auto surface = manager->_platformContext->makeSurface(
30
+ gpu, nativeSurface, size.width, size.height);
31
+ registry
32
+ .getSurfaceInfoOrCreate([_contextId intValue], gpu, size.width,
33
+ size.height)
34
+ ->switchToOnscreen(nativeSurface, surface);
35
+ }
36
+
37
+ - (void)update {
38
+ auto size = self.frame.size;
39
+ auto &registry = rnwgpu::SurfaceRegistry::getInstance();
40
+ registry.getSurfaceInfo([_contextId intValue])
41
+ ->resize(size.width, size.height);
42
+ }
43
+
44
+ - (void)dealloc {
45
+ auto &registry = rnwgpu::SurfaceRegistry::getInstance();
46
+ // Remove the surface info from the registry
47
+ registry.removeSurfaceInfo([_contextId intValue]);
48
+ }
49
+
50
+ @end