@shopify/react-native-skia 2.9.1 → 2.10.1

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 (387) hide show
  1. package/android/CMakeLists.txt +8 -46
  2. package/android/build.gradle +33 -0
  3. package/android/src/main/java/com/shopify/reactnative/skia/RNSkiaPackage.java +1 -2
  4. package/cpp/api/JsiNativeBuffer.h +23 -24
  5. package/cpp/api/JsiSkAnimatedImage.h +24 -25
  6. package/cpp/api/JsiSkAnimatedImageFactory.h +18 -17
  7. package/cpp/api/JsiSkApi.h +254 -96
  8. package/cpp/api/JsiSkCanvas.h +141 -266
  9. package/cpp/api/JsiSkColor.h +7 -5
  10. package/cpp/api/JsiSkColorFilter.h +15 -8
  11. package/cpp/api/JsiSkColorFilterFactory.h +49 -67
  12. package/cpp/api/JsiSkContourMeasure.h +31 -38
  13. package/cpp/api/JsiSkContourMeasureIter.h +20 -23
  14. package/cpp/api/JsiSkConverters.h +410 -0
  15. package/cpp/api/JsiSkData.h +13 -7
  16. package/cpp/api/JsiSkDataFactory.h +27 -32
  17. package/cpp/api/JsiSkFont.h +123 -192
  18. package/cpp/api/JsiSkFontMgr.h +33 -26
  19. package/cpp/api/JsiSkFontMgrFactory.h +12 -11
  20. package/cpp/api/JsiSkFontStyle.h +14 -12
  21. package/cpp/api/JsiSkImage.h +90 -79
  22. package/cpp/api/JsiSkImageFactory.h +93 -95
  23. package/cpp/api/JsiSkImageFilter.h +21 -11
  24. package/cpp/api/JsiSkImageFilterFactory.h +375 -629
  25. package/cpp/api/JsiSkImageInfo.h +25 -25
  26. package/cpp/api/JsiSkMaskFilter.h +21 -11
  27. package/cpp/api/JsiSkMaskFilterFactory.h +17 -17
  28. package/cpp/api/JsiSkMatrix.h +51 -88
  29. package/cpp/api/JsiSkNativeObjects.h +387 -0
  30. package/cpp/api/JsiSkPaint.h +104 -142
  31. package/cpp/api/JsiSkParagraph.h +54 -64
  32. package/cpp/api/JsiSkParagraphBuilder.h +43 -68
  33. package/cpp/api/JsiSkParagraphBuilderFactory.h +20 -24
  34. package/cpp/api/JsiSkPath.h +242 -350
  35. package/cpp/api/JsiSkPathBuilder.h +153 -273
  36. package/cpp/api/JsiSkPathBuilderFactory.h +19 -20
  37. package/cpp/api/JsiSkPathEffect.h +21 -11
  38. package/cpp/api/JsiSkPathEffectFactory.h +61 -80
  39. package/cpp/api/JsiSkPathFactory.h +148 -238
  40. package/cpp/api/JsiSkPicture.h +32 -27
  41. package/cpp/api/JsiSkPictureFactory.h +21 -26
  42. package/cpp/api/JsiSkPictureRecorder.h +27 -29
  43. package/cpp/api/JsiSkPoint.h +20 -23
  44. package/cpp/api/JsiSkRRect.h +24 -32
  45. package/cpp/api/JsiSkRSXform.h +31 -48
  46. package/cpp/api/JsiSkRect.h +40 -50
  47. package/cpp/api/JsiSkRuntimeEffect.h +85 -92
  48. package/cpp/api/JsiSkRuntimeEffectFactory.h +14 -18
  49. package/cpp/api/JsiSkRuntimeShaderBuilder.h +28 -30
  50. package/cpp/api/JsiSkSVG.h +15 -15
  51. package/cpp/api/JsiSkSVGFactory.h +17 -20
  52. package/cpp/api/JsiSkShader.h +15 -8
  53. package/cpp/api/JsiSkShaderFactory.h +159 -238
  54. package/cpp/api/JsiSkSkottie.h +131 -143
  55. package/cpp/api/JsiSkSurface.h +29 -32
  56. package/cpp/api/JsiSkSurfaceFactory.h +18 -20
  57. package/cpp/api/JsiSkTextBlob.h +15 -8
  58. package/cpp/api/JsiSkTextBlobFactory.h +40 -66
  59. package/cpp/api/JsiSkTypeface.h +25 -22
  60. package/cpp/api/JsiSkTypefaceFactory.h +17 -15
  61. package/cpp/api/JsiSkTypefaceFontProvider.h +43 -39
  62. package/cpp/api/JsiSkTypefaceFontProviderFactory.h +13 -12
  63. package/cpp/api/JsiSkVertices.h +23 -22
  64. package/cpp/api/JsiSkiaContext.h +22 -23
  65. package/cpp/api/JsiSkottieFactory.h +16 -17
  66. package/cpp/api/JsiVideo.h +43 -81
  67. package/cpp/api/recorder/Convertor.h +31 -61
  68. package/cpp/api/recorder/DataTypes.h +8 -16
  69. package/cpp/api/recorder/JsiRecorder.h +83 -55
  70. package/cpp/api/recorder/RNRecorder.h +1 -1
  71. package/cpp/jsi/BoxedNativeObject.h +146 -0
  72. package/cpp/{jsi2 → jsi}/EnumMapper.h +4 -1
  73. package/cpp/{jsi2 → jsi}/JSIConverter.h +0 -31
  74. package/cpp/{jsi2 → jsi}/NativeObject.h +131 -152
  75. package/cpp/jsi/RuntimeAwareCache.cpp +1 -1
  76. package/cpp/jsi/RuntimeAwareCache.h +26 -8
  77. package/cpp/jsi/ViewProperty.h +5 -11
  78. package/cpp/rnskia/RNDawnContext.h +18 -2
  79. package/cpp/rnskia/RNDawnInterop.cpp +19 -0
  80. package/cpp/rnskia/RNDawnUtils.h +18 -1
  81. package/cpp/rnskia/RNSkJsiViewApi.h +20 -11
  82. package/cpp/rnskia/RNSkManager.cpp +9 -168
  83. package/cpp/rnskia/RNSkPictureView.h +1 -1
  84. package/cpp/skia/include/gpu/ganesh/GrDriverBugWorkaroundsAutogen.h +2 -0
  85. package/lib/commonjs/external/reanimated/renderHelpers.d.ts +15 -0
  86. package/lib/commonjs/external/reanimated/renderHelpers.js +30 -1
  87. package/lib/commonjs/external/reanimated/renderHelpers.js.map +1 -1
  88. package/lib/commonjs/mock/index.js +0 -1
  89. package/lib/commonjs/mock/index.js.map +1 -1
  90. package/lib/commonjs/skia/NativeSetup.js +4 -0
  91. package/lib/commonjs/skia/NativeSetup.js.map +1 -1
  92. package/lib/commonjs/skia/SkiaWorkletSerialization.d.ts +1 -0
  93. package/lib/commonjs/skia/SkiaWorkletSerialization.js +66 -0
  94. package/lib/commonjs/skia/SkiaWorkletSerialization.js.map +1 -0
  95. package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +15 -6
  96. package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
  97. package/lib/commonjs/skia/types/Skia.d.ts +5 -15
  98. package/lib/commonjs/skia/types/Skia.js.map +1 -1
  99. package/lib/commonjs/skia/types/index.d.ts +0 -1
  100. package/lib/commonjs/skia/types/index.js +0 -11
  101. package/lib/commonjs/skia/types/index.js.map +1 -1
  102. package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -2
  103. package/lib/commonjs/skia/web/JsiSkImageFactory.js +2 -2
  104. package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
  105. package/lib/commonjs/skia/web/JsiSkia.js +1 -4
  106. package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
  107. package/lib/commonjs/sksg/Container.native.js +20 -1
  108. package/lib/commonjs/sksg/Container.native.js.map +1 -1
  109. package/lib/commonjs/views/index.d.ts +0 -1
  110. package/lib/commonjs/views/index.js +0 -11
  111. package/lib/commonjs/views/index.js.map +1 -1
  112. package/lib/module/external/reanimated/renderHelpers.d.ts +15 -0
  113. package/lib/module/external/reanimated/renderHelpers.js +29 -0
  114. package/lib/module/external/reanimated/renderHelpers.js.map +1 -1
  115. package/lib/module/mock/index.js +0 -1
  116. package/lib/module/mock/index.js.map +1 -1
  117. package/lib/module/skia/NativeSetup.js +4 -0
  118. package/lib/module/skia/NativeSetup.js.map +1 -1
  119. package/lib/module/skia/SkiaWorkletSerialization.d.ts +1 -0
  120. package/lib/module/skia/SkiaWorkletSerialization.js +59 -0
  121. package/lib/module/skia/SkiaWorkletSerialization.js.map +1 -0
  122. package/lib/module/skia/types/Image/ImageFactory.d.ts +15 -6
  123. package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
  124. package/lib/module/skia/types/Skia.d.ts +5 -15
  125. package/lib/module/skia/types/Skia.js.map +1 -1
  126. package/lib/module/skia/types/index.d.ts +0 -1
  127. package/lib/module/skia/types/index.js +0 -1
  128. package/lib/module/skia/types/index.js.map +1 -1
  129. package/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -2
  130. package/lib/module/skia/web/JsiSkImageFactory.js +2 -2
  131. package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
  132. package/lib/module/skia/web/JsiSkia.js +1 -4
  133. package/lib/module/skia/web/JsiSkia.js.map +1 -1
  134. package/lib/module/sksg/Container.native.js +21 -2
  135. package/lib/module/sksg/Container.native.js.map +1 -1
  136. package/lib/module/views/index.d.ts +0 -1
  137. package/lib/module/views/index.js +0 -1
  138. package/lib/module/views/index.js.map +1 -1
  139. package/lib/typescript/lib/commonjs/external/reanimated/renderHelpers.d.ts +2 -0
  140. package/lib/typescript/lib/commonjs/mock/index.d.ts +0 -1
  141. package/lib/typescript/lib/commonjs/skia/SkiaWorkletSerialization.d.ts +2 -0
  142. package/lib/typescript/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -2
  143. package/lib/typescript/lib/commonjs/skia/web/JsiSkia.d.ts +1 -2
  144. package/lib/typescript/lib/module/external/reanimated/renderHelpers.d.ts +15 -0
  145. package/lib/typescript/lib/module/mock/index.d.ts +0 -2
  146. package/lib/typescript/lib/module/skia/Skia.web.d.ts +1 -2
  147. package/lib/typescript/lib/module/skia/SkiaWorkletSerialization.d.ts +1 -0
  148. package/lib/typescript/lib/module/skia/types/index.d.ts +0 -1
  149. package/lib/typescript/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -2
  150. package/lib/typescript/lib/module/skia/web/JsiSkia.d.ts +1 -2
  151. package/lib/typescript/lib/module/views/index.d.ts +0 -1
  152. package/lib/typescript/src/external/reanimated/renderHelpers.d.ts +15 -0
  153. package/lib/typescript/src/skia/SkiaWorkletSerialization.d.ts +1 -0
  154. package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +15 -6
  155. package/lib/typescript/src/skia/types/Skia.d.ts +5 -15
  156. package/lib/typescript/src/skia/types/index.d.ts +0 -1
  157. package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +2 -2
  158. package/lib/typescript/src/views/index.d.ts +0 -1
  159. package/package.json +8 -5
  160. package/react-native-skia.podspec +38 -5
  161. package/src/external/reanimated/renderHelpers.ts +30 -0
  162. package/src/mock/index.ts +0 -1
  163. package/src/skia/NativeSetup.ts +5 -0
  164. package/src/skia/SkiaWorkletSerialization.ts +67 -0
  165. package/src/skia/types/Image/ImageFactory.ts +15 -6
  166. package/src/skia/types/Skia.ts +5 -15
  167. package/src/skia/types/index.ts +0 -1
  168. package/src/skia/web/JsiSkImageFactory.ts +3 -3
  169. package/src/skia/web/JsiSkia.ts +2 -5
  170. package/src/sksg/Container.native.ts +40 -2
  171. package/src/views/index.ts +0 -1
  172. package/android/cpp/jni/JniWebGPUView.cpp +0 -112
  173. package/android/cpp/rnskia-android/SkiaPlatformContext.h +0 -26
  174. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUSurfaceView.java +0 -43
  175. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUTextureView.java +0 -50
  176. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUView.java +0 -98
  177. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUViewAPI.java +0 -19
  178. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUViewManager.java +0 -58
  179. package/apple/RNWebGPUAppleNativeBuffer.mm +0 -33
  180. package/apple/SkiaPlatformContext.h +0 -20
  181. package/apple/SkiaPlatformContext.mm +0 -21
  182. package/apple/SkiaWebGPUView.mm +0 -81
  183. package/apple/WebGPUMetalView.mm +0 -136
  184. package/cpp/api/JsiSkHostObjects.h +0 -257
  185. package/cpp/jsi/JsiHostObject.cpp +0 -137
  186. package/cpp/jsi/JsiHostObject.h +0 -385
  187. package/cpp/rnwgpu/ArrayBuffer.h +0 -117
  188. package/cpp/rnwgpu/Canvas.h +0 -50
  189. package/cpp/rnwgpu/PlatformContext.h +0 -18
  190. package/cpp/rnwgpu/SurfaceRegistry.h +0 -605
  191. package/cpp/rnwgpu/api/AppleNativeBuffer.h +0 -22
  192. package/cpp/rnwgpu/api/Convertors.h +0 -783
  193. package/cpp/rnwgpu/api/External.h +0 -12
  194. package/cpp/rnwgpu/api/GPU.cpp +0 -162
  195. package/cpp/rnwgpu/api/GPU.h +0 -60
  196. package/cpp/rnwgpu/api/GPUAdapter.cpp +0 -240
  197. package/cpp/rnwgpu/api/GPUAdapter.h +0 -60
  198. package/cpp/rnwgpu/api/GPUAdapterInfo.h +0 -57
  199. package/cpp/rnwgpu/api/GPUBindGroup.cpp +0 -3
  200. package/cpp/rnwgpu/api/GPUBindGroup.h +0 -51
  201. package/cpp/rnwgpu/api/GPUBindGroupLayout.h +0 -52
  202. package/cpp/rnwgpu/api/GPUBuffer.cpp +0 -107
  203. package/cpp/rnwgpu/api/GPUBuffer.h +0 -88
  204. package/cpp/rnwgpu/api/GPUCanvasContext.cpp +0 -75
  205. package/cpp/rnwgpu/api/GPUCanvasContext.h +0 -70
  206. package/cpp/rnwgpu/api/GPUCommandBuffer.h +0 -45
  207. package/cpp/rnwgpu/api/GPUCommandEncoder.cpp +0 -179
  208. package/cpp/rnwgpu/api/GPUCommandEncoder.h +0 -111
  209. package/cpp/rnwgpu/api/GPUCompilationInfo.h +0 -79
  210. package/cpp/rnwgpu/api/GPUCompilationMessage.h +0 -36
  211. package/cpp/rnwgpu/api/GPUComputePassEncoder.cpp +0 -60
  212. package/cpp/rnwgpu/api/GPUComputePassEncoder.h +0 -85
  213. package/cpp/rnwgpu/api/GPUComputePipeline.cpp +0 -12
  214. package/cpp/rnwgpu/api/GPUComputePipeline.h +0 -60
  215. package/cpp/rnwgpu/api/GPUDevice.cpp +0 -614
  216. package/cpp/rnwgpu/api/GPUDevice.h +0 -258
  217. package/cpp/rnwgpu/api/GPUDeviceLostInfo.cpp +0 -7
  218. package/cpp/rnwgpu/api/GPUDeviceLostInfo.h +0 -40
  219. package/cpp/rnwgpu/api/GPUError.h +0 -35
  220. package/cpp/rnwgpu/api/GPUExtent3D.h +0 -66
  221. package/cpp/rnwgpu/api/GPUExternalTexture.cpp +0 -139
  222. package/cpp/rnwgpu/api/GPUExternalTexture.h +0 -95
  223. package/cpp/rnwgpu/api/GPUFeatures.h +0 -203
  224. package/cpp/rnwgpu/api/GPUInternalError.h +0 -31
  225. package/cpp/rnwgpu/api/GPUOrigin2D.h +0 -55
  226. package/cpp/rnwgpu/api/GPUOrigin3D.h +0 -62
  227. package/cpp/rnwgpu/api/GPUOutOfMemoryError.h +0 -33
  228. package/cpp/rnwgpu/api/GPUPipelineLayout.h +0 -45
  229. package/cpp/rnwgpu/api/GPUQuerySet.cpp +0 -11
  230. package/cpp/rnwgpu/api/GPUQuerySet.h +0 -73
  231. package/cpp/rnwgpu/api/GPUQueue.cpp +0 -179
  232. package/cpp/rnwgpu/api/GPUQueue.h +0 -84
  233. package/cpp/rnwgpu/api/GPURenderBundle.h +0 -44
  234. package/cpp/rnwgpu/api/GPURenderBundleEncoder.cpp +0 -131
  235. package/cpp/rnwgpu/api/GPURenderBundleEncoder.h +0 -110
  236. package/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +0 -165
  237. package/cpp/rnwgpu/api/GPURenderPassEncoder.h +0 -130
  238. package/cpp/rnwgpu/api/GPURenderPipeline.cpp +0 -13
  239. package/cpp/rnwgpu/api/GPURenderPipeline.h +0 -61
  240. package/cpp/rnwgpu/api/GPUSampler.h +0 -44
  241. package/cpp/rnwgpu/api/GPUShaderModule.cpp +0 -56
  242. package/cpp/rnwgpu/api/GPUShaderModule.h +0 -66
  243. package/cpp/rnwgpu/api/GPUSharedFence.cpp +0 -80
  244. package/cpp/rnwgpu/api/GPUSharedFence.h +0 -53
  245. package/cpp/rnwgpu/api/GPUSharedTextureMemory.cpp +0 -135
  246. package/cpp/rnwgpu/api/GPUSharedTextureMemory.h +0 -75
  247. package/cpp/rnwgpu/api/GPUSupportedLimits.cpp +0 -129
  248. package/cpp/rnwgpu/api/GPUSupportedLimits.h +0 -131
  249. package/cpp/rnwgpu/api/GPUTexture.cpp +0 -47
  250. package/cpp/rnwgpu/api/GPUTexture.h +0 -162
  251. package/cpp/rnwgpu/api/GPUTextureView.h +0 -44
  252. package/cpp/rnwgpu/api/GPUUncapturedErrorEvent.h +0 -60
  253. package/cpp/rnwgpu/api/GPUValidationError.h +0 -32
  254. package/cpp/rnwgpu/api/ImageBitmap.h +0 -62
  255. package/cpp/rnwgpu/api/NativeBufferUtils.h +0 -87
  256. package/cpp/rnwgpu/api/RNWebGPU.h +0 -82
  257. package/cpp/rnwgpu/api/WebGPUConstants.h +0 -36
  258. package/cpp/rnwgpu/api/descriptors/GPUBindGroupDescriptor.h +0 -64
  259. package/cpp/rnwgpu/api/descriptors/GPUBindGroupEntry.h +0 -78
  260. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutDescriptor.h +0 -56
  261. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutEntry.h +0 -97
  262. package/cpp/rnwgpu/api/descriptors/GPUBlendComponent.h +0 -57
  263. package/cpp/rnwgpu/api/descriptors/GPUBlendState.h +0 -52
  264. package/cpp/rnwgpu/api/descriptors/GPUBufferBinding.h +0 -56
  265. package/cpp/rnwgpu/api/descriptors/GPUBufferBindingLayout.h +0 -56
  266. package/cpp/rnwgpu/api/descriptors/GPUBufferDescriptor.h +0 -59
  267. package/cpp/rnwgpu/api/descriptors/GPUBufferUsage.h +0 -39
  268. package/cpp/rnwgpu/api/descriptors/GPUCanvasConfiguration.h +0 -76
  269. package/cpp/rnwgpu/api/descriptors/GPUColor.h +0 -66
  270. package/cpp/rnwgpu/api/descriptors/GPUColorTargetState.h +0 -58
  271. package/cpp/rnwgpu/api/descriptors/GPUColorWrite.h +0 -29
  272. package/cpp/rnwgpu/api/descriptors/GPUCommandBufferDescriptor.h +0 -45
  273. package/cpp/rnwgpu/api/descriptors/GPUCommandEncoderDescriptor.h +0 -45
  274. package/cpp/rnwgpu/api/descriptors/GPUComputePassDescriptor.h +0 -56
  275. package/cpp/rnwgpu/api/descriptors/GPUComputePassTimestampWrites.h +0 -58
  276. package/cpp/rnwgpu/api/descriptors/GPUComputePipelineDescriptor.h +0 -67
  277. package/cpp/rnwgpu/api/descriptors/GPUDawnTogglesDescriptor.h +0 -56
  278. package/cpp/rnwgpu/api/descriptors/GPUDepthStencilState.h +0 -103
  279. package/cpp/rnwgpu/api/descriptors/GPUDeviceDescriptor.h +0 -109
  280. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureBindingLayout.h +0 -38
  281. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureDescriptor.h +0 -90
  282. package/cpp/rnwgpu/api/descriptors/GPUFragmentState.h +0 -73
  283. package/cpp/rnwgpu/api/descriptors/GPUImageCopyBuffer.h +0 -62
  284. package/cpp/rnwgpu/api/descriptors/GPUImageCopyExternalImage.h +0 -63
  285. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTexture.h +0 -65
  286. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTextureTagged.h +0 -81
  287. package/cpp/rnwgpu/api/descriptors/GPUImageDataLayout.h +0 -54
  288. package/cpp/rnwgpu/api/descriptors/GPUMapMode.h +0 -22
  289. package/cpp/rnwgpu/api/descriptors/GPUMultisampleState.h +0 -54
  290. package/cpp/rnwgpu/api/descriptors/GPUPipelineLayoutDescriptor.h +0 -57
  291. package/cpp/rnwgpu/api/descriptors/GPUPrimitiveState.h +0 -69
  292. package/cpp/rnwgpu/api/descriptors/GPUProgrammableStage.h +0 -61
  293. package/cpp/rnwgpu/api/descriptors/GPUQuerySetDescriptor.h +0 -55
  294. package/cpp/rnwgpu/api/descriptors/GPUQueueDescriptor.h +0 -43
  295. package/cpp/rnwgpu/api/descriptors/GPURenderBundleDescriptor.h +0 -45
  296. package/cpp/rnwgpu/api/descriptors/GPURenderBundleEncoderDescriptor.h +0 -80
  297. package/cpp/rnwgpu/api/descriptors/GPURenderPassColorAttachment.h +0 -81
  298. package/cpp/rnwgpu/api/descriptors/GPURenderPassDepthStencilAttachment.h +0 -101
  299. package/cpp/rnwgpu/api/descriptors/GPURenderPassDescriptor.h +0 -92
  300. package/cpp/rnwgpu/api/descriptors/GPURenderPassTimestampWrites.h +0 -58
  301. package/cpp/rnwgpu/api/descriptors/GPURenderPipelineDescriptor.h +0 -103
  302. package/cpp/rnwgpu/api/descriptors/GPURequestAdapterOptions.h +0 -51
  303. package/cpp/rnwgpu/api/descriptors/GPUSamplerBindingLayout.h +0 -45
  304. package/cpp/rnwgpu/api/descriptors/GPUSamplerDescriptor.h +0 -110
  305. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleCompilationHint.h +0 -60
  306. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleDescriptor.h +0 -62
  307. package/cpp/rnwgpu/api/descriptors/GPUShaderStage.h +0 -25
  308. package/cpp/rnwgpu/api/descriptors/GPUSharedFenceDescriptor.h +0 -58
  309. package/cpp/rnwgpu/api/descriptors/GPUSharedFenceState.h +0 -51
  310. package/cpp/rnwgpu/api/descriptors/GPUSharedTextureMemoryDescriptor.h +0 -73
  311. package/cpp/rnwgpu/api/descriptors/GPUStencilFaceState.h +0 -64
  312. package/cpp/rnwgpu/api/descriptors/GPUStorageTextureBindingLayout.h +0 -59
  313. package/cpp/rnwgpu/api/descriptors/GPUTextureBindingLayout.h +0 -59
  314. package/cpp/rnwgpu/api/descriptors/GPUTextureDescriptor.h +0 -91
  315. package/cpp/rnwgpu/api/descriptors/GPUTextureUsage.h +0 -29
  316. package/cpp/rnwgpu/api/descriptors/GPUTextureViewDescriptor.h +0 -91
  317. package/cpp/rnwgpu/api/descriptors/GPUUncapturedErrorEventInit.h +0 -64
  318. package/cpp/rnwgpu/api/descriptors/GPUVertexAttribute.h +0 -53
  319. package/cpp/rnwgpu/api/descriptors/GPUVertexBufferLayout.h +0 -62
  320. package/cpp/rnwgpu/api/descriptors/GPUVertexState.h +0 -73
  321. package/cpp/rnwgpu/api/descriptors/Unions.h +0 -1969
  322. package/cpp/rnwgpu/async/AsyncTaskHandle.cpp +0 -214
  323. package/cpp/rnwgpu/async/AsyncTaskHandle.h +0 -58
  324. package/cpp/rnwgpu/async/RuntimeContext.cpp +0 -199
  325. package/cpp/rnwgpu/async/RuntimeContext.h +0 -134
  326. package/lib/commonjs/skia/types/WebGPU.d.ts +0 -184
  327. package/lib/commonjs/skia/types/WebGPU.js +0 -105
  328. package/lib/commonjs/skia/types/WebGPU.js.map +0 -1
  329. package/lib/commonjs/specs/WebGPUViewNativeComponent.d.ts +0 -8
  330. package/lib/commonjs/specs/WebGPUViewNativeComponent.js +0 -10
  331. package/lib/commonjs/specs/WebGPUViewNativeComponent.js.map +0 -1
  332. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  333. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.js +0 -103
  334. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.js.map +0 -1
  335. package/lib/commonjs/specs/utils.d.ts +0 -1
  336. package/lib/commonjs/specs/utils.js +0 -11
  337. package/lib/commonjs/specs/utils.js.map +0 -1
  338. package/lib/commonjs/views/WebGPUCanvas.d.ts +0 -33
  339. package/lib/commonjs/views/WebGPUCanvas.js +0 -79
  340. package/lib/commonjs/views/WebGPUCanvas.js.map +0 -1
  341. package/lib/commonjs/views/WebGPUCanvas.web.d.ts +0 -23
  342. package/lib/commonjs/views/WebGPUCanvas.web.js +0 -20
  343. package/lib/commonjs/views/WebGPUCanvas.web.js.map +0 -1
  344. package/lib/module/skia/types/WebGPU.d.ts +0 -184
  345. package/lib/module/skia/types/WebGPU.js +0 -99
  346. package/lib/module/skia/types/WebGPU.js.map +0 -1
  347. package/lib/module/specs/WebGPUViewNativeComponent.d.ts +0 -8
  348. package/lib/module/specs/WebGPUViewNativeComponent.js +0 -4
  349. package/lib/module/specs/WebGPUViewNativeComponent.js.map +0 -1
  350. package/lib/module/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  351. package/lib/module/specs/WebGPUViewNativeComponent.web.js +0 -96
  352. package/lib/module/specs/WebGPUViewNativeComponent.web.js.map +0 -1
  353. package/lib/module/specs/utils.d.ts +0 -1
  354. package/lib/module/specs/utils.js +0 -5
  355. package/lib/module/specs/utils.js.map +0 -1
  356. package/lib/module/views/WebGPUCanvas.d.ts +0 -33
  357. package/lib/module/views/WebGPUCanvas.js +0 -70
  358. package/lib/module/views/WebGPUCanvas.js.map +0 -1
  359. package/lib/module/views/WebGPUCanvas.web.d.ts +0 -23
  360. package/lib/module/views/WebGPUCanvas.web.js +0 -12
  361. package/lib/module/views/WebGPUCanvas.web.js.map +0 -1
  362. package/lib/typescript/lib/commonjs/skia/types/WebGPU.d.ts +0 -2
  363. package/lib/typescript/lib/commonjs/specs/WebGPUViewNativeComponent.d.ts +0 -4
  364. package/lib/typescript/lib/commonjs/specs/WebGPUViewNativeComponent.web.d.ts +0 -3
  365. package/lib/typescript/lib/commonjs/specs/utils.d.ts +0 -2
  366. package/lib/typescript/lib/commonjs/views/WebGPUCanvas.d.ts +0 -6
  367. package/lib/typescript/lib/commonjs/views/WebGPUCanvas.web.d.ts +0 -6
  368. package/lib/typescript/lib/module/skia/types/WebGPU.d.ts +0 -31
  369. package/lib/typescript/lib/module/specs/WebGPUViewNativeComponent.d.ts +0 -2
  370. package/lib/typescript/lib/module/specs/WebGPUViewNativeComponent.web.d.ts +0 -2
  371. package/lib/typescript/lib/module/specs/utils.d.ts +0 -1
  372. package/lib/typescript/lib/module/views/WebGPUCanvas.d.ts +0 -7
  373. package/lib/typescript/lib/module/views/WebGPUCanvas.web.d.ts +0 -8
  374. package/lib/typescript/src/skia/types/WebGPU.d.ts +0 -184
  375. package/lib/typescript/src/specs/WebGPUViewNativeComponent.d.ts +0 -8
  376. package/lib/typescript/src/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  377. package/lib/typescript/src/specs/utils.d.ts +0 -1
  378. package/lib/typescript/src/views/WebGPUCanvas.d.ts +0 -33
  379. package/lib/typescript/src/views/WebGPUCanvas.web.d.ts +0 -23
  380. package/src/skia/types/WebGPU.ts +0 -226
  381. package/src/specs/WebGPUViewNativeComponent.ts +0 -11
  382. package/src/specs/WebGPUViewNativeComponent.web.ts +0 -110
  383. package/src/specs/utils.ts +0 -4
  384. package/src/views/WebGPUCanvas.tsx +0 -125
  385. package/src/views/WebGPUCanvas.web.tsx +0 -36
  386. /package/cpp/{jsi2 → jsi}/Promise.cpp +0 -0
  387. /package/cpp/{jsi2 → jsi}/Promise.h +0 -0
@@ -1,214 +0,0 @@
1
- #include "AsyncTaskHandle.h"
2
-
3
- #include <memory>
4
- #include <string>
5
- #include <utility>
6
-
7
- #include <ReactCommon/CallInvoker.h>
8
-
9
- #include "jsi2/Promise.h"
10
-
11
- #include "RuntimeContext.h"
12
-
13
- namespace rnwgpu::async {
14
-
15
- using Action = std::function<void(jsi::Runtime &, rnwgpu::Promise &)>;
16
-
17
- struct AsyncTaskHandle::State
18
- : public std::enable_shared_from_this<AsyncTaskHandle::State> {
19
- State(std::shared_ptr<RuntimeContext> context, bool keepPumping)
20
- : context(std::move(context)), keepPumping(keepPumping) {}
21
-
22
- void settle(Action action);
23
- void attachPromise(const std::shared_ptr<rnwgpu::Promise> &promise);
24
- void schedule(Action action);
25
-
26
- ResolveFunction createResolveFunction();
27
- RejectFunction createRejectFunction();
28
-
29
- std::shared_ptr<rnwgpu::Promise> currentPromise();
30
-
31
- std::mutex mutex;
32
- std::shared_ptr<RuntimeContext> context;
33
- bool keepPumping;
34
- std::shared_ptr<rnwgpu::Promise> promise;
35
- std::optional<Action> pendingAction;
36
- bool settled = false;
37
- std::shared_ptr<State> keepAlive;
38
- };
39
-
40
- // MARK: - State helpers
41
-
42
- void AsyncTaskHandle::State::settle(Action action) {
43
- std::optional<Action> actionToSchedule;
44
-
45
- {
46
- std::lock_guard<std::mutex> lock(mutex);
47
- if (settled) {
48
- return;
49
- }
50
- settled = true;
51
-
52
- if (promise) {
53
- actionToSchedule = std::move(action);
54
- } else {
55
- pendingAction = std::move(action);
56
- }
57
- }
58
-
59
- if (actionToSchedule.has_value()) {
60
- schedule(std::move(*actionToSchedule));
61
- }
62
- }
63
-
64
- void AsyncTaskHandle::State::attachPromise(
65
- const std::shared_ptr<rnwgpu::Promise> &newPromise) {
66
- std::optional<Action> actionToSchedule;
67
- {
68
- std::lock_guard<std::mutex> lock(mutex);
69
- promise = newPromise;
70
- keepAlive = shared_from_this();
71
- if (pendingAction.has_value()) {
72
- actionToSchedule = std::move(pendingAction);
73
- pendingAction.reset();
74
- }
75
- }
76
-
77
- if (actionToSchedule.has_value()) {
78
- schedule(std::move(*actionToSchedule));
79
- }
80
- }
81
-
82
- void AsyncTaskHandle::State::schedule(Action action) {
83
- auto promiseRef = currentPromise();
84
- if (!promiseRef) {
85
- return;
86
- }
87
-
88
- if (!context) {
89
- // No context (shouldn't happen): best-effort inline settle.
90
- action(promiseRef->runtime, *promiseRef);
91
- std::lock_guard<std::mutex> lock(mutex);
92
- keepAlive.reset();
93
- return;
94
- }
95
-
96
- auto self = shared_from_this();
97
-
98
- if (!keepPumping) {
99
- // Spontaneous task (e.g. device.lost): not driven by the ProcessEvents pump.
100
- // Settle on the owning runtime's JS thread via its CallInvoker, which is
101
- // wired only for the main JS runtime. A device created on a worklet runtime
102
- // has no invoker, so its device.lost is dropped (best-effort; see the
103
- // Threading model). invokeAsync runs the closure on the main JS thread,
104
- // where promiseRef->runtime lives for a main-runtime device.
105
- auto invoker = context->callInvoker();
106
- if (invoker) {
107
- invoker->invokeAsync(
108
- [self, action = std::move(action), promiseRef]() mutable {
109
- action(promiseRef->runtime, *promiseRef);
110
- std::lock_guard<std::mutex> lock(self->mutex);
111
- self->keepAlive.reset();
112
- });
113
- } else {
114
- std::lock_guard<std::mutex> lock(mutex);
115
- keepAlive.reset();
116
- }
117
- return;
118
- }
119
-
120
- // Pumping task (request/response op). The resolve/reject callback may fire on
121
- // a thread that is NOT the owning runtime's thread: with a shared
122
- // wgpu::Instance, another runtime's ProcessEvents() pump can consume this Dawn
123
- // event. Touching the Promise's runtime off-thread would corrupt Hermes. So we
124
- // deposit the actual settle (the only JSI-touching work) into the owning
125
- // context's mailbox; the context drains it on its own thread during its next
126
- // tick. The deposited closure captures only C++ state and runs no JSI until
127
- // drained, so depositing from any thread is safe.
128
- context->postSettle(
129
- [self, action = std::move(action), promiseRef]() mutable {
130
- action(promiseRef->runtime, *promiseRef);
131
- if (self->context) {
132
- self->context->onTaskSettled(/*keepPumping=*/true);
133
- }
134
- std::lock_guard<std::mutex> lock(self->mutex);
135
- self->keepAlive.reset();
136
- });
137
- }
138
-
139
- AsyncTaskHandle::ResolveFunction
140
- AsyncTaskHandle::State::createResolveFunction() {
141
- auto weakSelf = std::weak_ptr<State>(shared_from_this());
142
- return [weakSelf](ValueFactory factory) {
143
- if (auto self = weakSelf.lock()) {
144
- ValueFactory resolvedFactory =
145
- factory ? std::move(factory) : [](jsi::Runtime &runtime) {
146
- return jsi::Value::undefined();
147
- };
148
- self->settle(
149
- [factory = std::move(resolvedFactory)](
150
- jsi::Runtime &runtime, rnwgpu::Promise &promise) mutable {
151
- auto value = factory(runtime);
152
- promise.resolve(std::move(value));
153
- });
154
- }
155
- };
156
- }
157
-
158
- AsyncTaskHandle::RejectFunction AsyncTaskHandle::State::createRejectFunction() {
159
- auto weakSelf = std::weak_ptr<State>(shared_from_this());
160
- return [weakSelf](std::string reason) {
161
- if (auto self = weakSelf.lock()) {
162
- self->settle([reason = std::move(reason)](jsi::Runtime & /*runtime*/,
163
- rnwgpu::Promise &promise) {
164
- promise.reject(reason);
165
- });
166
- }
167
- };
168
- }
169
-
170
- std::shared_ptr<rnwgpu::Promise> AsyncTaskHandle::State::currentPromise() {
171
- std::lock_guard<std::mutex> lock(mutex);
172
- return promise;
173
- }
174
-
175
- // MARK: - AsyncTaskHandle
176
-
177
- AsyncTaskHandle::AsyncTaskHandle() = default;
178
-
179
- AsyncTaskHandle::AsyncTaskHandle(std::shared_ptr<State> state)
180
- : _state(std::move(state)) {}
181
-
182
- bool AsyncTaskHandle::valid() const { return _state != nullptr; }
183
-
184
- AsyncTaskHandle
185
- AsyncTaskHandle::create(const std::shared_ptr<RuntimeContext> &context,
186
- bool keepPumping) {
187
- auto state = std::make_shared<State>(context, keepPumping);
188
- state->keepAlive = state;
189
- return AsyncTaskHandle(std::move(state));
190
- }
191
-
192
- AsyncTaskHandle::ResolveFunction
193
- AsyncTaskHandle::createResolveFunction() const {
194
- if (!_state) {
195
- return [](ValueFactory) {};
196
- }
197
- return _state->createResolveFunction();
198
- }
199
-
200
- AsyncTaskHandle::RejectFunction AsyncTaskHandle::createRejectFunction() const {
201
- if (!_state) {
202
- return [](std::string) {};
203
- }
204
- return _state->createRejectFunction();
205
- }
206
-
207
- void AsyncTaskHandle::attachPromise(
208
- const std::shared_ptr<rnwgpu::Promise> &promise) const {
209
- if (_state) {
210
- _state->attachPromise(promise);
211
- }
212
- }
213
-
214
- } // namespace rnwgpu::async
@@ -1,58 +0,0 @@
1
- #pragma once
2
-
3
- #include <functional>
4
- #include <memory>
5
- #include <mutex>
6
- #include <optional>
7
- #include <string>
8
-
9
- #include <jsi/jsi.h>
10
-
11
- namespace rnwgpu {
12
- class Promise;
13
- }
14
-
15
- namespace rnwgpu::async {
16
-
17
- class RuntimeContext;
18
-
19
- /**
20
- * Represents a pending asynchronous WebGPU operation that can be converted into
21
- * a JavaScript Promise.
22
- *
23
- * In the ProcessEvents model the resolve/reject callbacks are invoked on the
24
- * owning runtime's own thread (synchronously from instance.ProcessEvents()
25
- * during the RuntimeContext tick, or synchronously from postTask), so the
26
- * Promise is settled directly without any thread marshalling.
27
- */
28
- class AsyncTaskHandle {
29
- public:
30
- struct State;
31
-
32
- using ValueFactory =
33
- std::function<facebook::jsi::Value(facebook::jsi::Runtime &)>;
34
- using ResolveFunction = std::function<void(ValueFactory)>;
35
- using RejectFunction = std::function<void(std::string)>;
36
-
37
- AsyncTaskHandle();
38
-
39
- /**
40
- * Internal constructor used by RuntimeContext.
41
- */
42
- explicit AsyncTaskHandle(std::shared_ptr<State> state);
43
-
44
- bool valid() const;
45
-
46
- ResolveFunction createResolveFunction() const;
47
- RejectFunction createRejectFunction() const;
48
-
49
- void attachPromise(const std::shared_ptr<rnwgpu::Promise> &promise) const;
50
-
51
- static AsyncTaskHandle create(const std::shared_ptr<RuntimeContext> &context,
52
- bool keepPumping);
53
-
54
- private:
55
- std::shared_ptr<State> _state;
56
- };
57
-
58
- } // namespace rnwgpu::async
@@ -1,199 +0,0 @@
1
- #include "RuntimeContext.h"
2
-
3
- #include <memory>
4
- #include <stdexcept>
5
- #include <utility>
6
-
7
- #include <ReactCommon/CallInvoker.h>
8
-
9
- #include "AsyncTaskHandle.h"
10
-
11
- namespace rnwgpu::async {
12
-
13
- namespace {
14
- struct RuntimeData {
15
- std::shared_ptr<RuntimeContext> context;
16
- };
17
-
18
- // The main JS runtime and its CallInvoker, registered once on install. The
19
- // context created for sMainRuntime gets sMainInvoker; spontaneous events
20
- // (device.lost) on a main-runtime device are delivered through it without the
21
- // pump. Worklet runtimes have no invoker (best-effort, see the header doc).
22
- jsi::Runtime *sMainRuntime = nullptr;
23
- std::shared_ptr<facebook::react::CallInvoker> sMainInvoker;
24
-
25
- // Serializes ProcessEvents() across all runtimes that share a wgpu::Instance.
26
- // Held only across the ProcessEvents call itself, never while running JS /
27
- // mailbox settle-actions, so it cannot deadlock against the per-context mailbox
28
- // mutex.
29
- std::mutex &processEventsMutex() {
30
- static std::mutex mutex;
31
- return mutex;
32
- }
33
- } // namespace
34
-
35
- void RuntimeContext::registerMainRuntime(
36
- jsi::Runtime *runtime,
37
- std::shared_ptr<facebook::react::CallInvoker> invoker) {
38
- sMainRuntime = runtime;
39
- sMainInvoker = std::move(invoker);
40
- }
41
-
42
- std::shared_ptr<facebook::react::CallInvoker>
43
- RuntimeContext::mainCallInvoker() {
44
- return sMainInvoker;
45
- }
46
-
47
- RuntimeContext::RuntimeContext(jsi::Runtime &runtime, wgpu::Instance instance)
48
- : _runtime(runtime), _instance(std::move(instance)) {}
49
-
50
- std::shared_ptr<RuntimeContext> RuntimeContext::get(jsi::Runtime &runtime) {
51
- auto data = runtime.getRuntimeData(runtimeDataUUID());
52
- if (!data) {
53
- return nullptr;
54
- }
55
- return std::static_pointer_cast<RuntimeData>(data)->context;
56
- }
57
-
58
- std::shared_ptr<RuntimeContext>
59
- RuntimeContext::getOrCreate(jsi::Runtime &runtime, wgpu::Instance instance) {
60
- if (auto existing = get(runtime)) {
61
- return existing;
62
- }
63
- auto context = std::make_shared<RuntimeContext>(runtime, std::move(instance));
64
- // Only the main JS runtime's context carries the CallInvoker; it is used to
65
- // deliver spontaneous events (device.lost) without the pump.
66
- if (&runtime == sMainRuntime) {
67
- context->_callInvoker = sMainInvoker;
68
- }
69
- auto data = std::make_shared<RuntimeData>();
70
- data->context = context;
71
- runtime.setRuntimeData(runtimeDataUUID(), data);
72
- return context;
73
- }
74
-
75
- AsyncTaskHandle RuntimeContext::postTask(const TaskCallback &callback,
76
- bool keepPumping) {
77
- auto handle = AsyncTaskHandle::create(shared_from_this(), keepPumping);
78
- if (!handle.valid()) {
79
- throw std::runtime_error("Failed to create AsyncTaskHandle.");
80
- }
81
-
82
- // Only pumping tasks (request/response ops) drive the ProcessEvents pump.
83
- // Spontaneous tasks (keepPumping == false, e.g. device.lost) never touch the
84
- // pump: they settle via the CallInvoker (see AsyncTaskHandle::State::schedule).
85
- if (keepPumping) {
86
- _pumpTasks.fetch_add(1, std::memory_order_acq_rel);
87
- requestTick();
88
- }
89
-
90
- auto resolve = handle.createResolveFunction();
91
- auto reject = handle.createRejectFunction();
92
- try {
93
- callback(resolve, reject);
94
- } catch (const std::exception &exception) {
95
- reject(exception.what());
96
- } catch (...) {
97
- reject("Unknown native error in RuntimeContext::postTask.");
98
- }
99
- return handle;
100
- }
101
-
102
- void RuntimeContext::onTaskSettled(bool keepPumping) {
103
- if (keepPumping) {
104
- _pumpTasks.fetch_sub(1, std::memory_order_acq_rel);
105
- }
106
- }
107
-
108
- void RuntimeContext::postSettle(std::function<void()> job) {
109
- if (!job) {
110
- return;
111
- }
112
- std::lock_guard<std::mutex> lock(_mailboxMutex);
113
- _mailbox.push_back(std::move(job));
114
- }
115
-
116
- void RuntimeContext::drainMailbox() {
117
- std::vector<std::function<void()>> jobs;
118
- {
119
- std::lock_guard<std::mutex> lock(_mailboxMutex);
120
- jobs.swap(_mailbox);
121
- }
122
- // Run settle-actions on this (the owning) thread, NOT under the ProcessEvents
123
- // mutex, so JS continuations never execute while the pump lock is held.
124
- for (auto &job : jobs) {
125
- job();
126
- }
127
- }
128
-
129
- void RuntimeContext::requestTick() {
130
- bool expected = false;
131
- if (!_tickScheduled.compare_exchange_strong(expected, true,
132
- std::memory_order_acq_rel)) {
133
- return;
134
- }
135
-
136
- // The pump only ever runs while a request/response op is outstanding, so it
137
- // always schedules as soon as possible (delay 0). postTask and tick both run
138
- // on the owning runtime's thread, so we schedule the next tick directly via
139
- // that runtime's own timer. setTimeout is available on the main RN runtime and
140
- // on worklet runtimes (backed by the worklets EventLoop); setImmediate /
141
- // queueMicrotask are fallbacks. We do NOT use queueMicrotask as the primary
142
- // mechanism: a self-rescheduling microtask never yields the microtask
143
- // checkpoint, starving the runtime's task loop.
144
- auto self = shared_from_this();
145
- jsi::Runtime &rt = _runtime;
146
- auto tickCallback = jsi::Function::createFromHostFunction(
147
- rt, jsi::PropNameID::forAscii(rt, "RNWGPUAsyncTick"), 0,
148
- [self](jsi::Runtime & /*runtime*/, const jsi::Value & /*thisVal*/,
149
- const jsi::Value * /*args*/, size_t /*count*/) -> jsi::Value {
150
- self->tick();
151
- return jsi::Value::undefined();
152
- });
153
-
154
- auto global = rt.global();
155
- auto setTimeoutValue = global.getProperty(rt, "setTimeout");
156
- if (setTimeoutValue.isObject() &&
157
- setTimeoutValue.asObject(rt).isFunction(rt)) {
158
- setTimeoutValue.asObject(rt).asFunction(rt).call(
159
- rt, jsi::Value(rt, tickCallback), jsi::Value(0.0));
160
- return;
161
- }
162
- auto setImmediateValue = global.getProperty(rt, "setImmediate");
163
- if (setImmediateValue.isObject() &&
164
- setImmediateValue.asObject(rt).isFunction(rt)) {
165
- setImmediateValue.asObject(rt).asFunction(rt).call(
166
- rt, jsi::Value(rt, tickCallback));
167
- return;
168
- }
169
- rt.queueMicrotask(std::move(tickCallback));
170
- }
171
-
172
- void RuntimeContext::tick() {
173
- _tickScheduled.store(false, std::memory_order_release);
174
- {
175
- // Serialize ProcessEvents across runtimes sharing this instance. Callbacks
176
- // fired here only deposit into mailboxes (postSettle), they do not run JS.
177
- std::lock_guard<std::mutex> lock(processEventsMutex());
178
- _instance.ProcessEvents();
179
- }
180
- // Settle this runtime's ready promises on this thread, outside the pump lock.
181
- drainMailbox();
182
- // Keep pumping only while a "pumping" task (active async work) is outstanding.
183
- // Non-pumping tasks (e.g. device.lost) intentionally do NOT keep the pump
184
- // alive: we prioritise battery over catching a device.lost fired while idle.
185
- if (_pumpTasks.load(std::memory_order_acquire) > 0) {
186
- requestTick();
187
- }
188
- }
189
-
190
- jsi::UUID RuntimeContext::runtimeDataUUID() {
191
- // Fixed, unique key for storing the RuntimeContext in the runtime's
192
- // runtimeData. Must not collide with other runtimeData consumers (e.g.
193
- // react-native-worklets' weakRuntimeUUID).
194
- static const jsi::UUID uuid{0x7b9a3c10, 0x4d2e, 0x4f8a, 0x9c3d,
195
- 0x1f6e5a2b8c40};
196
- return uuid;
197
- }
198
-
199
- } // namespace rnwgpu::async
@@ -1,134 +0,0 @@
1
- #pragma once
2
-
3
- #include <atomic>
4
- #include <cstddef>
5
- #include <functional>
6
- #include <memory>
7
- #include <mutex>
8
- #include <vector>
9
-
10
- #include <jsi/jsi.h>
11
-
12
- #include "AsyncTaskHandle.h"
13
-
14
- #include "webgpu/webgpu_cpp.h"
15
-
16
- namespace jsi = facebook::jsi;
17
-
18
- namespace facebook::react {
19
- class CallInvoker;
20
- } // namespace facebook::react
21
-
22
- namespace rnwgpu::async {
23
-
24
- /**
25
- * Per-runtime coordinator for asynchronous WebGPU operations.
26
- *
27
- * Each JS runtime that uses WebGPU gets its own RuntimeContext, stored in the
28
- * runtime's runtimeData. Async Dawn operations are registered with
29
- * CallbackMode::AllowProcessEvents and driven to completion by pumping
30
- * `instance.ProcessEvents()` on the runtime's OWN thread via a self-
31
- * rescheduling tick (scheduled through that runtime's setTimeout). Because
32
- * ProcessEvents invokes the Dawn callbacks synchronously on the pumping thread,
33
- * the JS Promise is settled directly on the owning runtime, with no background
34
- * thread and no cross-thread hop.
35
- *
36
- * The pump only runs while at least one "pumping" task is outstanding, so it
37
- * costs nothing when idle and stops cleanly.
38
- *
39
- * Spontaneous events (keepPumping = false): events that may fire at any time,
40
- * independent of any request/response op (today only GPUDevice::getLost, whose
41
- * Dawn callback is registered AllowSpontaneous). These are NOT driven by the
42
- * pump. Instead their settle is marshalled onto the owning runtime's JS thread
43
- * via that runtime's CallInvoker, which is wired only for the MAIN JS runtime
44
- * (callInvoker()). A device created on a worklet runtime has no invoker, so its
45
- * device.lost is best-effort and may never fire.
46
- *
47
- * Shared-instance safety (mailbox): multiple runtimes may share one
48
- * wgpu::Instance. ProcessEvents() drains the whole instance queue and fires
49
- * callbacks on the calling thread, which may NOT be the owning runtime's thread
50
- * for a given promise. So a settled callback never touches JSI inline; it
51
- * deposits a settle-action (a plain C++ closure, no JSI) into the OWNING
52
- * context's thread-safe mailbox via postSettle(), and each context drains its
53
- * own mailbox on its own thread during tick(). ProcessEvents() itself is
54
- * serialized across runtimes by a process-wide mutex, since concurrent
55
- * ProcessEvents on one instance is not guaranteed reentrant.
56
- *
57
- * Threading contract: a RuntimeContext must only be pumped from the runtime it
58
- * was created for. Request/response async entry points (mapAsync,
59
- * onSubmittedWorkDone, popErrorScope, createComputePipelineAsync,
60
- * createRenderPipelineAsync, getCompilationInfo, requestAdapter,
61
- * requestDevice) must NOT use a context captured when the object was created —
62
- * the object may have been boxed across to another runtime. They resolve the
63
- * CALLING runtime's context via getOrCreate(runtime, instance) so the promise
64
- * is settled on the thread it was created on. Spontaneous events (device.lost,
65
- * uncapturederror) remain bound to the device's own context (best-effort, main
66
- * runtime only; see the class doc above).
67
- */
68
- class RuntimeContext : public std::enable_shared_from_this<RuntimeContext> {
69
- public:
70
- using TaskCallback =
71
- std::function<void(const AsyncTaskHandle::ResolveFunction &,
72
- const AsyncTaskHandle::RejectFunction &)>;
73
-
74
- RuntimeContext(jsi::Runtime &runtime, wgpu::Instance instance);
75
-
76
- static std::shared_ptr<RuntimeContext> get(jsi::Runtime &runtime);
77
- static std::shared_ptr<RuntimeContext> getOrCreate(jsi::Runtime &runtime,
78
- wgpu::Instance instance);
79
-
80
- // Register the main JS runtime and its CallInvoker. The RuntimeContext created
81
- // for this runtime gets the invoker (callInvoker() returns it); every other
82
- // runtime's context returns null. Called once from RNSkManager on install.
83
- static void
84
- registerMainRuntime(jsi::Runtime *runtime,
85
- std::shared_ptr<facebook::react::CallInvoker> invoker);
86
-
87
- // CallInvoker for this runtime's JS thread, or null. Non-null only for the
88
- // main JS runtime; used to deliver spontaneous events (device.lost) without
89
- // the pump. See the class doc.
90
- const std::shared_ptr<facebook::react::CallInvoker> &callInvoker() const {
91
- return _callInvoker;
92
- }
93
-
94
- // The main JS runtime's CallInvoker (registered on install), or null before
95
- // install. Used by the platform views to apply latched surface attaches from
96
- // the JS thread for contexts that are not actively rendering (see
97
- // SurfaceInfo::applyPendingAttach).
98
- static std::shared_ptr<facebook::react::CallInvoker> mainCallInvoker();
99
-
100
- // The wgpu::Instance bound to this runtime.
101
- wgpu::Instance instance() const { return _instance; }
102
-
103
- AsyncTaskHandle postTask(const TaskCallback &callback,
104
- bool keepPumping = true);
105
-
106
- // Deposit a settle-action to run on THIS context's runtime thread. Thread-safe
107
- // (callable from any thread, e.g. another runtime that pumped ProcessEvents).
108
- // The job must not touch JSI until it runs (it runs during drainMailbox on the
109
- // owning thread).
110
- void postSettle(std::function<void()> job);
111
-
112
- // Invoked by a drained settle-action when its task settles. Runs on the owning
113
- // runtime's thread.
114
- void onTaskSettled(bool keepPumping);
115
-
116
- private:
117
- static jsi::UUID runtimeDataUUID();
118
-
119
- void requestTick();
120
- void tick();
121
- void drainMailbox();
122
-
123
- jsi::Runtime &_runtime;
124
- wgpu::Instance _instance;
125
- // Non-null only for the main JS runtime's context (see registerMainRuntime).
126
- std::shared_ptr<facebook::react::CallInvoker> _callInvoker;
127
- std::atomic<std::size_t> _pumpTasks{0};
128
- std::atomic<bool> _tickScheduled{false};
129
-
130
- std::mutex _mailboxMutex;
131
- std::vector<std::function<void()>> _mailbox;
132
- };
133
-
134
- } // namespace rnwgpu::async