@shopify/react-native-skia 2.4.15 → 2.4.17

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 (226) hide show
  1. package/android/CMakeLists.txt +69 -0
  2. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +19 -7
  3. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseViewManager.java +7 -0
  4. package/apple/RNSkApplePlatformContext.mm +4 -0
  5. package/cpp/api/JsiSkApi.h +31 -0
  6. package/cpp/api/JsiSkImageFactory.h +69 -1
  7. package/cpp/api/JsiSkImageFilter.h +1 -0
  8. package/cpp/api/JsiSkPath.h +1 -1
  9. package/cpp/jsi/RuntimeAwareCache.h +0 -2
  10. package/cpp/jsi2/EnumMapper.h +45 -0
  11. package/cpp/jsi2/JSIConverter.h +468 -0
  12. package/cpp/jsi2/NativeObject.h +598 -0
  13. package/cpp/jsi2/Promise.cpp +44 -0
  14. package/cpp/jsi2/Promise.h +35 -0
  15. package/cpp/rnskia/RNDawnContext.h +114 -0
  16. package/cpp/rnskia/RNSkManager.cpp +41 -1
  17. package/cpp/rnwgpu/ArrayBuffer.h +68 -0
  18. package/cpp/rnwgpu/api/Convertors.h +761 -0
  19. package/cpp/rnwgpu/api/External.h +12 -0
  20. package/cpp/rnwgpu/api/GPU.cpp +129 -0
  21. package/cpp/rnwgpu/api/GPU.h +57 -0
  22. package/cpp/rnwgpu/api/GPUAdapter.cpp +178 -0
  23. package/cpp/rnwgpu/api/GPUAdapter.h +59 -0
  24. package/cpp/rnwgpu/api/GPUAdapterInfo.h +57 -0
  25. package/cpp/rnwgpu/api/GPUBindGroup.cpp +3 -0
  26. package/cpp/rnwgpu/api/GPUBindGroup.h +51 -0
  27. package/cpp/rnwgpu/api/GPUBindGroupLayout.h +52 -0
  28. package/cpp/rnwgpu/api/GPUBuffer.cpp +97 -0
  29. package/cpp/rnwgpu/api/GPUBuffer.h +87 -0
  30. package/cpp/rnwgpu/api/GPUCommandBuffer.h +45 -0
  31. package/cpp/rnwgpu/api/GPUCommandEncoder.cpp +179 -0
  32. package/cpp/rnwgpu/api/GPUCommandEncoder.h +111 -0
  33. package/cpp/rnwgpu/api/GPUCompilationInfo.h +79 -0
  34. package/cpp/rnwgpu/api/GPUCompilationMessage.h +36 -0
  35. package/cpp/rnwgpu/api/GPUComputePassEncoder.cpp +60 -0
  36. package/cpp/rnwgpu/api/GPUComputePassEncoder.h +85 -0
  37. package/cpp/rnwgpu/api/GPUComputePipeline.cpp +12 -0
  38. package/cpp/rnwgpu/api/GPUComputePipeline.h +60 -0
  39. package/cpp/rnwgpu/api/GPUDevice.cpp +434 -0
  40. package/cpp/rnwgpu/api/GPUDevice.h +174 -0
  41. package/cpp/rnwgpu/api/GPUDeviceLostInfo.cpp +7 -0
  42. package/cpp/rnwgpu/api/GPUDeviceLostInfo.h +40 -0
  43. package/cpp/rnwgpu/api/GPUError.h +35 -0
  44. package/cpp/rnwgpu/api/GPUExtent3D.h +66 -0
  45. package/cpp/rnwgpu/api/GPUExternalTexture.h +45 -0
  46. package/cpp/rnwgpu/api/GPUFeatures.h +212 -0
  47. package/cpp/rnwgpu/api/GPUInternalError.h +31 -0
  48. package/cpp/rnwgpu/api/GPUOrigin2D.h +55 -0
  49. package/cpp/rnwgpu/api/GPUOrigin3D.h +62 -0
  50. package/cpp/rnwgpu/api/GPUOutOfMemoryError.h +33 -0
  51. package/cpp/rnwgpu/api/GPUPipelineLayout.h +45 -0
  52. package/cpp/rnwgpu/api/GPUQuerySet.cpp +11 -0
  53. package/cpp/rnwgpu/api/GPUQuerySet.h +73 -0
  54. package/cpp/rnwgpu/api/GPUQueue.cpp +169 -0
  55. package/cpp/rnwgpu/api/GPUQueue.h +84 -0
  56. package/cpp/rnwgpu/api/GPURenderBundle.h +44 -0
  57. package/cpp/rnwgpu/api/GPURenderBundleEncoder.cpp +131 -0
  58. package/cpp/rnwgpu/api/GPURenderBundleEncoder.h +110 -0
  59. package/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +165 -0
  60. package/cpp/rnwgpu/api/GPURenderPassEncoder.h +130 -0
  61. package/cpp/rnwgpu/api/GPURenderPipeline.cpp +13 -0
  62. package/cpp/rnwgpu/api/GPURenderPipeline.h +61 -0
  63. package/cpp/rnwgpu/api/GPUSampler.h +44 -0
  64. package/cpp/rnwgpu/api/GPUShaderModule.cpp +51 -0
  65. package/cpp/rnwgpu/api/GPUShaderModule.h +66 -0
  66. package/cpp/rnwgpu/api/GPUSupportedLimits.cpp +129 -0
  67. package/cpp/rnwgpu/api/GPUSupportedLimits.h +131 -0
  68. package/cpp/rnwgpu/api/GPUTexture.cpp +47 -0
  69. package/cpp/rnwgpu/api/GPUTexture.h +150 -0
  70. package/cpp/rnwgpu/api/GPUTextureView.h +44 -0
  71. package/cpp/rnwgpu/api/GPUValidationError.h +32 -0
  72. package/cpp/rnwgpu/api/descriptors/GPUBindGroupDescriptor.h +64 -0
  73. package/cpp/rnwgpu/api/descriptors/GPUBindGroupEntry.h +71 -0
  74. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutDescriptor.h +56 -0
  75. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutEntry.h +97 -0
  76. package/cpp/rnwgpu/api/descriptors/GPUBlendComponent.h +57 -0
  77. package/cpp/rnwgpu/api/descriptors/GPUBlendState.h +52 -0
  78. package/cpp/rnwgpu/api/descriptors/GPUBufferBinding.h +56 -0
  79. package/cpp/rnwgpu/api/descriptors/GPUBufferBindingLayout.h +56 -0
  80. package/cpp/rnwgpu/api/descriptors/GPUBufferDescriptor.h +59 -0
  81. package/cpp/rnwgpu/api/descriptors/GPUBufferUsage.h +39 -0
  82. package/cpp/rnwgpu/api/descriptors/GPUColor.h +66 -0
  83. package/cpp/rnwgpu/api/descriptors/GPUColorTargetState.h +58 -0
  84. package/cpp/rnwgpu/api/descriptors/GPUColorWrite.h +29 -0
  85. package/cpp/rnwgpu/api/descriptors/GPUCommandBufferDescriptor.h +45 -0
  86. package/cpp/rnwgpu/api/descriptors/GPUCommandEncoderDescriptor.h +45 -0
  87. package/cpp/rnwgpu/api/descriptors/GPUComputePassDescriptor.h +56 -0
  88. package/cpp/rnwgpu/api/descriptors/GPUComputePassTimestampWrites.h +58 -0
  89. package/cpp/rnwgpu/api/descriptors/GPUComputePipelineDescriptor.h +67 -0
  90. package/cpp/rnwgpu/api/descriptors/GPUDepthStencilState.h +103 -0
  91. package/cpp/rnwgpu/api/descriptors/GPUDeviceDescriptor.h +99 -0
  92. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureBindingLayout.h +38 -0
  93. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureDescriptor.h +71 -0
  94. package/cpp/rnwgpu/api/descriptors/GPUFragmentState.h +73 -0
  95. package/cpp/rnwgpu/api/descriptors/GPUImageCopyBuffer.h +62 -0
  96. package/cpp/rnwgpu/api/descriptors/GPUImageCopyExternalImage.h +62 -0
  97. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTexture.h +65 -0
  98. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTextureTagged.h +81 -0
  99. package/cpp/rnwgpu/api/descriptors/GPUImageDataLayout.h +54 -0
  100. package/cpp/rnwgpu/api/descriptors/GPUMapMode.h +22 -0
  101. package/cpp/rnwgpu/api/descriptors/GPUMultisampleState.h +54 -0
  102. package/cpp/rnwgpu/api/descriptors/GPUPipelineLayoutDescriptor.h +57 -0
  103. package/cpp/rnwgpu/api/descriptors/GPUPrimitiveState.h +69 -0
  104. package/cpp/rnwgpu/api/descriptors/GPUProgrammableStage.h +61 -0
  105. package/cpp/rnwgpu/api/descriptors/GPUQuerySetDescriptor.h +55 -0
  106. package/cpp/rnwgpu/api/descriptors/GPUQueueDescriptor.h +43 -0
  107. package/cpp/rnwgpu/api/descriptors/GPURenderBundleDescriptor.h +45 -0
  108. package/cpp/rnwgpu/api/descriptors/GPURenderBundleEncoderDescriptor.h +80 -0
  109. package/cpp/rnwgpu/api/descriptors/GPURenderPassColorAttachment.h +81 -0
  110. package/cpp/rnwgpu/api/descriptors/GPURenderPassDepthStencilAttachment.h +101 -0
  111. package/cpp/rnwgpu/api/descriptors/GPURenderPassDescriptor.h +92 -0
  112. package/cpp/rnwgpu/api/descriptors/GPURenderPassTimestampWrites.h +58 -0
  113. package/cpp/rnwgpu/api/descriptors/GPURenderPipelineDescriptor.h +103 -0
  114. package/cpp/rnwgpu/api/descriptors/GPURequestAdapterOptions.h +51 -0
  115. package/cpp/rnwgpu/api/descriptors/GPUSamplerBindingLayout.h +45 -0
  116. package/cpp/rnwgpu/api/descriptors/GPUSamplerDescriptor.h +110 -0
  117. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleCompilationHint.h +60 -0
  118. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleDescriptor.h +62 -0
  119. package/cpp/rnwgpu/api/descriptors/GPUShaderStage.h +25 -0
  120. package/cpp/rnwgpu/api/descriptors/GPUStencilFaceState.h +64 -0
  121. package/cpp/rnwgpu/api/descriptors/GPUStorageTextureBindingLayout.h +59 -0
  122. package/cpp/rnwgpu/api/descriptors/GPUTextureBindingLayout.h +59 -0
  123. package/cpp/rnwgpu/api/descriptors/GPUTextureDescriptor.h +91 -0
  124. package/cpp/rnwgpu/api/descriptors/GPUTextureUsage.h +29 -0
  125. package/cpp/rnwgpu/api/descriptors/GPUTextureViewDescriptor.h +91 -0
  126. package/cpp/rnwgpu/api/descriptors/GPUUncapturedErrorEventInit.h +64 -0
  127. package/cpp/rnwgpu/api/descriptors/GPUVertexAttribute.h +53 -0
  128. package/cpp/rnwgpu/api/descriptors/GPUVertexBufferLayout.h +62 -0
  129. package/cpp/rnwgpu/api/descriptors/GPUVertexState.h +73 -0
  130. package/cpp/rnwgpu/api/descriptors/Unions.h +1984 -0
  131. package/cpp/rnwgpu/async/AsyncDispatcher.h +28 -0
  132. package/cpp/rnwgpu/async/AsyncRunner.cpp +181 -0
  133. package/cpp/rnwgpu/async/AsyncRunner.h +56 -0
  134. package/cpp/rnwgpu/async/AsyncTaskHandle.cpp +181 -0
  135. package/cpp/rnwgpu/async/AsyncTaskHandle.h +55 -0
  136. package/cpp/rnwgpu/async/JSIMicrotaskDispatcher.cpp +23 -0
  137. package/cpp/rnwgpu/async/JSIMicrotaskDispatcher.h +22 -0
  138. package/lib/commonjs/Platform/Platform.web.js +1 -2
  139. package/lib/commonjs/Platform/Platform.web.js.map +1 -1
  140. package/lib/commonjs/external/reanimated/buffers.js.map +1 -1
  141. package/lib/commonjs/external/reanimated/interpolators.d.ts +1 -4
  142. package/lib/commonjs/renderer/Canvas.js +4 -3
  143. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  144. package/lib/commonjs/renderer/components/Group.js +1 -2
  145. package/lib/commonjs/renderer/components/Group.js.map +1 -1
  146. package/lib/commonjs/renderer/components/shapes/FitBox.js +1 -2
  147. package/lib/commonjs/renderer/components/shapes/FitBox.js.map +1 -1
  148. package/lib/commonjs/skia/types/ContourMeasure.js.map +1 -1
  149. package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +20 -0
  150. package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
  151. package/lib/commonjs/skia/types/RuntimeEffect/RuntimeEffect.js.map +1 -1
  152. package/lib/commonjs/skia/types/Skia.d.ts +17 -0
  153. package/lib/commonjs/skia/types/Skia.js.map +1 -1
  154. package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -0
  155. package/lib/commonjs/skia/web/JsiSkImageFactory.js +6 -0
  156. package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
  157. package/lib/commonjs/skia/web/JsiSkParagraphStyle.js +2 -2
  158. package/lib/commonjs/skia/web/JsiSkParagraphStyle.js.map +1 -1
  159. package/lib/commonjs/skia/web/JsiSkia.js +6 -0
  160. package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
  161. package/lib/commonjs/sksg/Recorder/commands/ColorFilters.js.map +1 -1
  162. package/lib/commonjs/sksg/Recorder/commands/ImageFilters.js.map +1 -1
  163. package/lib/commonjs/sksg/Recorder/commands/PathEffects.js.map +1 -1
  164. package/lib/commonjs/sksg/Recorder/commands/Shaders.js.map +1 -1
  165. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.d.ts +2 -0
  166. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.js +2 -0
  167. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  168. package/lib/commonjs/views/SkiaPictureView.web.js +4 -4
  169. package/lib/commonjs/views/SkiaPictureView.web.js.map +1 -1
  170. package/lib/commonjs/web/WithSkiaWeb.js +1 -2
  171. package/lib/commonjs/web/WithSkiaWeb.js.map +1 -1
  172. package/lib/module/external/reanimated/buffers.js.map +1 -1
  173. package/lib/module/external/reanimated/interpolators.d.ts +1 -4
  174. package/lib/module/renderer/Canvas.js +3 -1
  175. package/lib/module/renderer/Canvas.js.map +1 -1
  176. package/lib/module/skia/types/ContourMeasure.js.map +1 -1
  177. package/lib/module/skia/types/Image/ImageFactory.d.ts +20 -0
  178. package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
  179. package/lib/module/skia/types/RuntimeEffect/RuntimeEffect.js.map +1 -1
  180. package/lib/module/skia/types/Skia.d.ts +17 -0
  181. package/lib/module/skia/types/Skia.js.map +1 -1
  182. package/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -0
  183. package/lib/module/skia/web/JsiSkImageFactory.js +6 -0
  184. package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
  185. package/lib/module/skia/web/JsiSkParagraphStyle.js +2 -2
  186. package/lib/module/skia/web/JsiSkParagraphStyle.js.map +1 -1
  187. package/lib/module/skia/web/JsiSkia.js +6 -0
  188. package/lib/module/skia/web/JsiSkia.js.map +1 -1
  189. package/lib/module/sksg/Recorder/commands/ColorFilters.js.map +1 -1
  190. package/lib/module/sksg/Recorder/commands/ImageFilters.js.map +1 -1
  191. package/lib/module/sksg/Recorder/commands/PathEffects.js.map +1 -1
  192. package/lib/module/sksg/Recorder/commands/Shaders.js.map +1 -1
  193. package/lib/module/specs/SkiaPictureViewNativeComponent.d.ts +2 -0
  194. package/lib/module/specs/SkiaPictureViewNativeComponent.js +4 -0
  195. package/lib/module/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  196. package/lib/module/views/SkiaPictureView.web.js +3 -2
  197. package/lib/module/views/SkiaPictureView.web.js.map +1 -1
  198. package/lib/typescript/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -0
  199. package/lib/typescript/lib/commonjs/skia/web/JsiSkia.d.ts +2 -0
  200. package/lib/typescript/lib/module/renderer/Canvas.d.ts +1 -1
  201. package/lib/typescript/lib/module/skia/Skia.web.d.ts +2 -0
  202. package/lib/typescript/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -0
  203. package/lib/typescript/lib/module/skia/web/JsiSkia.d.ts +2 -0
  204. package/lib/typescript/lib/module/views/SkiaPictureView.d.ts +1 -1
  205. package/lib/typescript/src/external/reanimated/interpolators.d.ts +1 -4
  206. package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +20 -0
  207. package/lib/typescript/src/skia/types/Skia.d.ts +17 -0
  208. package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +2 -0
  209. package/lib/typescript/src/specs/SkiaPictureViewNativeComponent.d.ts +2 -0
  210. package/package.json +20 -16
  211. package/react-native-skia.podspec +52 -13
  212. package/scripts/install-skia.mjs +99 -48
  213. package/src/external/reanimated/buffers.ts +1 -1
  214. package/src/renderer/Canvas.tsx +3 -2
  215. package/src/skia/types/ContourMeasure.tsx +1 -2
  216. package/src/skia/types/Image/ImageFactory.ts +22 -0
  217. package/src/skia/types/RuntimeEffect/RuntimeEffect.ts +1 -2
  218. package/src/skia/types/Skia.ts +17 -0
  219. package/src/skia/web/JsiSkImageFactory.ts +8 -0
  220. package/src/skia/web/JsiSkia.ts +6 -0
  221. package/src/sksg/Recorder/commands/ColorFilters.ts +3 -2
  222. package/src/sksg/Recorder/commands/ImageFilters.ts +3 -2
  223. package/src/sksg/Recorder/commands/PathEffects.ts +3 -2
  224. package/src/sksg/Recorder/commands/Shaders.ts +3 -2
  225. package/src/specs/SkiaPictureViewNativeComponent.ts +7 -0
  226. package/src/views/SkiaPictureView.web.tsx +4 -1
@@ -174,6 +174,120 @@ public:
174
174
  return surface;
175
175
  }
176
176
 
177
+ // Get the wgpu::Instance for WebGPU bindings
178
+ wgpu::Instance getWGPUInstance() {
179
+ return wgpu::Instance(instance->Get());
180
+ }
181
+
182
+ // Get the wgpu::Device for WebGPU bindings
183
+ wgpu::Device getWGPUDevice() {
184
+ return backendContext.fDevice;
185
+ }
186
+
187
+ // Create an SkImage from a WebGPU texture
188
+ // The texture must have TextureBinding usage
189
+ sk_sp<SkImage> MakeImageFromTexture(wgpu::Texture texture, int width,
190
+ int height,
191
+ wgpu::TextureFormat format) {
192
+ if (!texture) {
193
+ return nullptr;
194
+ }
195
+
196
+ // Map WebGPU format to Skia color type
197
+ SkColorType colorType;
198
+ switch (format) {
199
+ case wgpu::TextureFormat::RGBA8Unorm:
200
+ colorType = kRGBA_8888_SkColorType;
201
+ break;
202
+ case wgpu::TextureFormat::BGRA8Unorm:
203
+ colorType = kBGRA_8888_SkColorType;
204
+ break;
205
+ case wgpu::TextureFormat::RGBA16Float:
206
+ colorType = kRGBA_F16_SkColorType;
207
+ break;
208
+ case wgpu::TextureFormat::R8Unorm:
209
+ colorType = kGray_8_SkColorType;
210
+ break;
211
+ default:
212
+ // Use preferred color type for unsupported formats
213
+ colorType = DawnUtils::PreferedColorType;
214
+ break;
215
+ }
216
+
217
+ skgpu::graphite::BackendTexture backendTexture =
218
+ skgpu::graphite::BackendTextures::MakeDawn(texture.Get());
219
+
220
+ // Wrap the texture - we use a release proc that adds a reference to the
221
+ // texture to prevent it from being destroyed while the SkImage is alive
222
+ struct TextureRef {
223
+ wgpu::Texture texture;
224
+ };
225
+ auto textureRef = new TextureRef{texture};
226
+
227
+ return SkImages::WrapTexture(
228
+ getRecorder(), backendTexture, colorType, kPremul_SkAlphaType, nullptr,
229
+ [](void *context) {
230
+ auto ref = static_cast<TextureRef *>(context);
231
+ delete ref;
232
+ },
233
+ textureRef);
234
+ }
235
+
236
+ // Create a WebGPU texture from an SkImage
237
+ // Returns a texture with CopySrc and TextureBinding usage
238
+ wgpu::Texture MakeTextureFromImage(sk_sp<SkImage> image) {
239
+ if (!image) {
240
+ return nullptr;
241
+ }
242
+
243
+ int width = image->width();
244
+ int height = image->height();
245
+
246
+ // Create a texture with the appropriate format
247
+ wgpu::TextureDescriptor textureDesc;
248
+ textureDesc.label = "SkImage Texture";
249
+ textureDesc.size = {static_cast<uint32_t>(width),
250
+ static_cast<uint32_t>(height), 1};
251
+ textureDesc.format = DawnUtils::PreferredTextureFormat;
252
+ textureDesc.usage = wgpu::TextureUsage::CopyDst |
253
+ wgpu::TextureUsage::CopySrc |
254
+ wgpu::TextureUsage::TextureBinding |
255
+ wgpu::TextureUsage::RenderAttachment;
256
+ textureDesc.dimension = wgpu::TextureDimension::e2D;
257
+ textureDesc.mipLevelCount = 1;
258
+ textureDesc.sampleCount = 1;
259
+
260
+ wgpu::Texture texture = backendContext.fDevice.CreateTexture(&textureDesc);
261
+ if (!texture) {
262
+ return nullptr;
263
+ }
264
+
265
+ // Create a surface backed by this texture
266
+ skgpu::graphite::BackendTexture backendTexture =
267
+ skgpu::graphite::BackendTextures::MakeDawn(texture.Get());
268
+
269
+ sk_sp<SkSurface> surface = SkSurfaces::WrapBackendTexture(
270
+ getRecorder(), backendTexture, DawnUtils::PreferedColorType,
271
+ nullptr, // colorspace
272
+ nullptr); // surfaceProps
273
+
274
+ if (!surface) {
275
+ return nullptr;
276
+ }
277
+
278
+ // Draw the image onto the surface
279
+ SkCanvas *canvas = surface->getCanvas();
280
+ canvas->drawImage(image, 0, 0);
281
+
282
+ // Flush the surface to ensure the image is rendered
283
+ auto recording = getRecorder()->snap();
284
+ if (recording) {
285
+ submitRecording(recording.get(), skgpu::graphite::SyncToCpu::kYes);
286
+ }
287
+
288
+ return texture;
289
+ }
290
+
177
291
  // Create onscreen surface with window
178
292
  std::unique_ptr<WindowContext> MakeWindow(void *window, int width,
179
293
  int height) {
@@ -11,6 +11,16 @@
11
11
 
12
12
  #include "RuntimeAwareCache.h"
13
13
 
14
+ #ifdef SK_GRAPHITE
15
+ #include "RNDawnContext.h"
16
+ #include "rnwgpu/api/GPU.h"
17
+ #include "rnwgpu/api/descriptors/GPUBufferUsage.h"
18
+ #include "rnwgpu/api/descriptors/GPUColorWrite.h"
19
+ #include "rnwgpu/api/descriptors/GPUMapMode.h"
20
+ #include "rnwgpu/api/descriptors/GPUShaderStage.h"
21
+ #include "rnwgpu/api/descriptors/GPUTextureUsage.h"
22
+ #endif
23
+
14
24
  namespace RNSkia {
15
25
  namespace jsi = facebook::jsi;
16
26
 
@@ -22,7 +32,7 @@ RNSkManager::RNSkManager(
22
32
  _jsCallInvoker(jsCallInvoker),
23
33
  _viewApi(std::make_shared<RNSkJsiViewApi>(platformContext)) {
24
34
 
25
- // Register main runtime
35
+ // Register main runtime (used by both Skia and WebGPU bindings)
26
36
  RNJsi::BaseRuntimeAwareCache::setMainJsRuntime(_jsRuntime);
27
37
 
28
38
  // Install bindings
@@ -61,5 +71,35 @@ void RNSkManager::installBindings() {
61
71
  _jsRuntime->global().setProperty(
62
72
  *_jsRuntime, "SkiaViewApi",
63
73
  jsi::Object::createFromHostObject(*_jsRuntime, _viewApi));
74
+
75
+ #ifdef SK_GRAPHITE
76
+ // Install WebGPU GPU constructor
77
+ rnwgpu::GPU::installConstructor(*_jsRuntime);
78
+ // Create and expose navigator.gpu using DawnContext's instance
79
+ auto &dawnContext = DawnContext::getInstance();
80
+ auto gpu = std::make_shared<rnwgpu::GPU>(*_jsRuntime, dawnContext.getWGPUInstance());
81
+ auto navigatorValue = _jsRuntime->global().getProperty(*_jsRuntime, "navigator");
82
+ if (navigatorValue.isObject()) {
83
+ auto navigator = navigatorValue.asObject(*_jsRuntime);
84
+ navigator.setProperty(*_jsRuntime, "gpu", rnwgpu::GPU::create(*_jsRuntime, gpu));
85
+ } else {
86
+ // Create navigator object if it doesn't exist
87
+ jsi::Object navigator(*_jsRuntime);
88
+ navigator.setProperty(*_jsRuntime, "gpu", rnwgpu::GPU::create(*_jsRuntime, gpu));
89
+ _jsRuntime->global().setProperty(*_jsRuntime, "navigator", std::move(navigator));
90
+ }
91
+
92
+ // Install WebGPU constant objects as plain JS objects
93
+ _jsRuntime->global().setProperty(*_jsRuntime, "GPUBufferUsage",
94
+ rnwgpu::GPUBufferUsage::create(*_jsRuntime));
95
+ _jsRuntime->global().setProperty(*_jsRuntime, "GPUColorWrite",
96
+ rnwgpu::GPUColorWrite::create(*_jsRuntime));
97
+ _jsRuntime->global().setProperty(*_jsRuntime, "GPUMapMode",
98
+ rnwgpu::GPUMapMode::create(*_jsRuntime));
99
+ _jsRuntime->global().setProperty(*_jsRuntime, "GPUShaderStage",
100
+ rnwgpu::GPUShaderStage::create(*_jsRuntime));
101
+ _jsRuntime->global().setProperty(*_jsRuntime, "GPUTextureUsage",
102
+ rnwgpu::GPUTextureUsage::create(*_jsRuntime));
103
+ #endif
64
104
  }
65
105
  } // namespace RNSkia
@@ -0,0 +1,68 @@
1
+ #pragma once
2
+ #include <jsi/jsi.h>
3
+
4
+ #include <memory>
5
+
6
+ #include "jsi2/JSIConverter.h"
7
+
8
+ namespace rnwgpu {
9
+
10
+ namespace jsi = facebook::jsi;
11
+
12
+ struct ArrayBuffer : jsi::MutableBuffer {
13
+ ArrayBuffer(void *data, size_t size, size_t bytesPerElement)
14
+ : _data(data), _size(size), _bytesPerElement(bytesPerElement) {}
15
+
16
+ ~ArrayBuffer() override {}
17
+
18
+ size_t size() const override { return _size; }
19
+
20
+ uint8_t *data() override { return static_cast<uint8_t *>(_data); }
21
+
22
+ void *_data;
23
+ size_t _size;
24
+ size_t _bytesPerElement;
25
+ };
26
+
27
+ static std::shared_ptr<ArrayBuffer>
28
+ createArrayBufferFromJSI(jsi::Runtime &runtime,
29
+ const jsi::ArrayBuffer &arrayBuffer,
30
+ size_t bytesPerElement) {
31
+ auto size = arrayBuffer.size(runtime);
32
+ return std::make_shared<ArrayBuffer>(arrayBuffer.data(runtime), size,
33
+ bytesPerElement);
34
+ }
35
+
36
+ template <> struct JSIConverter<std::shared_ptr<ArrayBuffer>> {
37
+ static std::shared_ptr<ArrayBuffer>
38
+ fromJSI(jsi::Runtime &runtime, const jsi::Value &arg, bool outOfBound) {
39
+ if (arg.isObject()) {
40
+ auto obj = arg.getObject(runtime);
41
+ if (obj.isArrayBuffer(runtime)) {
42
+ return createArrayBufferFromJSI(runtime, obj.getArrayBuffer(runtime),
43
+ 1);
44
+ }
45
+ if (obj.hasProperty(runtime, "buffer")) {
46
+ auto bufferProp = obj.getProperty(runtime, "buffer");
47
+ if (bufferProp.isObject() &&
48
+ bufferProp.getObject(runtime).isArrayBuffer(runtime)) {
49
+ auto buff = bufferProp.getObject(runtime);
50
+ auto bytesPerElements =
51
+ obj.getProperty(runtime, "BYTES_PER_ELEMENT").asNumber();
52
+ return createArrayBufferFromJSI(
53
+ runtime, buff.getArrayBuffer(runtime),
54
+ static_cast<size_t>(bytesPerElements));
55
+ }
56
+ }
57
+ }
58
+ throw std::runtime_error("ArrayBuffer::fromJSI: argument is not an object "
59
+ "with an ArrayBuffer 'buffer' property");
60
+ }
61
+
62
+ static jsi::Value toJSI(jsi::Runtime &runtime,
63
+ std::shared_ptr<ArrayBuffer> arg) {
64
+ return jsi::ArrayBuffer(runtime, arg);
65
+ }
66
+ };
67
+
68
+ } // namespace rnwgpu