@shopify/react-native-skia 2.10.0 → 2.10.2

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 (332) hide show
  1. package/android/CMakeLists.txt +7 -41
  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 +14 -20
  5. package/cpp/api/JsiSkAnimatedImage.h +13 -16
  6. package/cpp/api/JsiSkAnimatedImageFactory.h +9 -7
  7. package/cpp/api/JsiSkApi.h +94 -90
  8. package/cpp/api/JsiSkCanvas.h +108 -251
  9. package/cpp/api/JsiSkColorFilterFactory.h +45 -63
  10. package/cpp/api/JsiSkContourMeasure.h +19 -29
  11. package/cpp/api/JsiSkContourMeasureIter.h +6 -6
  12. package/cpp/api/JsiSkConverters.h +410 -0
  13. package/cpp/api/JsiSkDataFactory.h +9 -15
  14. package/cpp/api/JsiSkFont.h +99 -180
  15. package/cpp/api/JsiSkFontMgr.h +19 -21
  16. package/cpp/api/JsiSkFontMgrFactory.h +4 -5
  17. package/cpp/api/JsiSkImage.h +66 -66
  18. package/cpp/api/JsiSkImageFactory.h +66 -63
  19. package/cpp/api/JsiSkImageFilterFactory.h +354 -608
  20. package/cpp/api/JsiSkImageInfo.h +10 -13
  21. package/cpp/api/JsiSkMaskFilterFactory.h +8 -11
  22. package/cpp/api/JsiSkMatrix.h +36 -73
  23. package/cpp/api/JsiSkNativeObjects.h +64 -96
  24. package/cpp/api/JsiSkPaint.h +73 -131
  25. package/cpp/api/JsiSkParagraph.h +36 -53
  26. package/cpp/api/JsiSkParagraphBuilder.h +36 -64
  27. package/cpp/api/JsiSkParagraphBuilderFactory.h +11 -16
  28. package/cpp/api/JsiSkPath.h +216 -349
  29. package/cpp/api/JsiSkPathBuilder.h +133 -269
  30. package/cpp/api/JsiSkPathBuilderFactory.h +11 -11
  31. package/cpp/api/JsiSkPathEffectFactory.h +52 -72
  32. package/cpp/api/JsiSkPathFactory.h +129 -195
  33. package/cpp/api/JsiSkPicture.h +12 -18
  34. package/cpp/api/JsiSkPictureRecorder.h +14 -15
  35. package/cpp/api/JsiSkPoint.h +4 -4
  36. package/cpp/api/JsiSkRRect.h +7 -8
  37. package/cpp/api/JsiSkRSXform.h +10 -23
  38. package/cpp/api/JsiSkRect.h +23 -31
  39. package/cpp/api/JsiSkRuntimeEffect.h +67 -83
  40. package/cpp/api/JsiSkRuntimeEffectFactory.h +6 -10
  41. package/cpp/api/JsiSkRuntimeShaderBuilder.h +5 -14
  42. package/cpp/api/JsiSkSVG.h +4 -4
  43. package/cpp/api/JsiSkShaderFactory.h +153 -225
  44. package/cpp/api/JsiSkSkottie.h +104 -126
  45. package/cpp/api/JsiSkSurface.h +11 -14
  46. package/cpp/api/JsiSkSurfaceFactory.h +6 -7
  47. package/cpp/api/JsiSkTextBlobFactory.h +31 -54
  48. package/cpp/api/JsiSkTypeface.h +8 -12
  49. package/cpp/api/JsiSkTypefaceFactory.h +9 -7
  50. package/cpp/api/JsiSkTypefaceFontProvider.h +22 -23
  51. package/cpp/api/JsiSkTypefaceFontProviderFactory.h +5 -6
  52. package/cpp/api/JsiSkVertices.h +6 -8
  53. package/cpp/api/JsiSkiaContext.h +10 -11
  54. package/cpp/api/JsiVideo.h +31 -71
  55. package/cpp/jsi/EnumMapper.h +2 -2
  56. package/cpp/jsi/JSIConverter.h +2 -33
  57. package/cpp/jsi/NativeObject.h +24 -19
  58. package/cpp/jsi/Promise.cpp +2 -2
  59. package/cpp/jsi/Promise.h +2 -2
  60. package/cpp/rnskia/RNDawnContext.h +18 -2
  61. package/cpp/rnskia/RNDawnInterop.cpp +19 -0
  62. package/cpp/rnskia/RNDawnUtils.h +18 -1
  63. package/cpp/rnskia/RNSkManager.cpp +5 -162
  64. package/cpp/skia/include/gpu/ganesh/GrDriverBugWorkaroundsAutogen.h +2 -0
  65. package/lib/commonjs/mock/index.js +0 -1
  66. package/lib/commonjs/mock/index.js.map +1 -1
  67. package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +15 -6
  68. package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
  69. package/lib/commonjs/skia/types/Skia.d.ts +5 -15
  70. package/lib/commonjs/skia/types/Skia.js.map +1 -1
  71. package/lib/commonjs/skia/types/index.d.ts +0 -1
  72. package/lib/commonjs/skia/types/index.js +0 -11
  73. package/lib/commonjs/skia/types/index.js.map +1 -1
  74. package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -2
  75. package/lib/commonjs/skia/web/JsiSkImageFactory.js +2 -2
  76. package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
  77. package/lib/commonjs/skia/web/JsiSkia.js +1 -4
  78. package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
  79. package/lib/commonjs/views/index.d.ts +0 -1
  80. package/lib/commonjs/views/index.js +0 -11
  81. package/lib/commonjs/views/index.js.map +1 -1
  82. package/lib/module/mock/index.js +0 -1
  83. package/lib/module/mock/index.js.map +1 -1
  84. package/lib/module/skia/types/Image/ImageFactory.d.ts +15 -6
  85. package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
  86. package/lib/module/skia/types/Skia.d.ts +5 -15
  87. package/lib/module/skia/types/Skia.js.map +1 -1
  88. package/lib/module/skia/types/index.d.ts +0 -1
  89. package/lib/module/skia/types/index.js +0 -1
  90. package/lib/module/skia/types/index.js.map +1 -1
  91. package/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -2
  92. package/lib/module/skia/web/JsiSkImageFactory.js +2 -2
  93. package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
  94. package/lib/module/skia/web/JsiSkia.js +1 -4
  95. package/lib/module/skia/web/JsiSkia.js.map +1 -1
  96. package/lib/module/views/index.d.ts +0 -1
  97. package/lib/module/views/index.js +0 -1
  98. package/lib/module/views/index.js.map +1 -1
  99. package/lib/typescript/lib/commonjs/mock/index.d.ts +0 -1
  100. package/lib/typescript/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -2
  101. package/lib/typescript/lib/commonjs/skia/web/JsiSkia.d.ts +1 -2
  102. package/lib/typescript/lib/module/mock/index.d.ts +0 -2
  103. package/lib/typescript/lib/module/skia/Skia.web.d.ts +1 -2
  104. package/lib/typescript/lib/module/skia/types/index.d.ts +0 -1
  105. package/lib/typescript/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -2
  106. package/lib/typescript/lib/module/skia/web/JsiSkia.d.ts +1 -2
  107. package/lib/typescript/lib/module/views/index.d.ts +0 -1
  108. package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +15 -6
  109. package/lib/typescript/src/skia/types/Skia.d.ts +5 -15
  110. package/lib/typescript/src/skia/types/index.d.ts +0 -1
  111. package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +2 -2
  112. package/lib/typescript/src/views/index.d.ts +0 -1
  113. package/package.json +3 -4
  114. package/react-native-skia.podspec +38 -4
  115. package/src/mock/index.ts +0 -1
  116. package/src/skia/types/Image/ImageFactory.ts +15 -6
  117. package/src/skia/types/Skia.ts +5 -15
  118. package/src/skia/types/index.ts +0 -1
  119. package/src/skia/web/JsiSkImageFactory.ts +3 -3
  120. package/src/skia/web/JsiSkia.ts +2 -5
  121. package/src/views/index.ts +0 -1
  122. package/android/cpp/jni/JniWebGPUView.cpp +0 -112
  123. package/android/cpp/rnskia-android/SkiaPlatformContext.h +0 -26
  124. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUSurfaceView.java +0 -43
  125. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUTextureView.java +0 -50
  126. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUView.java +0 -98
  127. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUViewAPI.java +0 -19
  128. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUViewManager.java +0 -58
  129. package/apple/RNWebGPUAppleNativeBuffer.mm +0 -33
  130. package/apple/SkiaPlatformContext.h +0 -20
  131. package/apple/SkiaPlatformContext.mm +0 -21
  132. package/apple/SkiaWebGPUView.mm +0 -81
  133. package/apple/WebGPUMetalView.mm +0 -136
  134. package/cpp/rnwgpu/ArrayBuffer.h +0 -116
  135. package/cpp/rnwgpu/Canvas.h +0 -52
  136. package/cpp/rnwgpu/PlatformContext.h +0 -18
  137. package/cpp/rnwgpu/SurfaceRegistry.h +0 -605
  138. package/cpp/rnwgpu/api/AppleNativeBuffer.h +0 -22
  139. package/cpp/rnwgpu/api/Convertors.h +0 -783
  140. package/cpp/rnwgpu/api/External.h +0 -12
  141. package/cpp/rnwgpu/api/GPU.cpp +0 -162
  142. package/cpp/rnwgpu/api/GPU.h +0 -60
  143. package/cpp/rnwgpu/api/GPUAdapter.cpp +0 -239
  144. package/cpp/rnwgpu/api/GPUAdapter.h +0 -60
  145. package/cpp/rnwgpu/api/GPUAdapterInfo.h +0 -57
  146. package/cpp/rnwgpu/api/GPUBindGroup.cpp +0 -3
  147. package/cpp/rnwgpu/api/GPUBindGroup.h +0 -51
  148. package/cpp/rnwgpu/api/GPUBindGroupLayout.h +0 -52
  149. package/cpp/rnwgpu/api/GPUBuffer.cpp +0 -107
  150. package/cpp/rnwgpu/api/GPUBuffer.h +0 -88
  151. package/cpp/rnwgpu/api/GPUCanvasContext.cpp +0 -75
  152. package/cpp/rnwgpu/api/GPUCanvasContext.h +0 -70
  153. package/cpp/rnwgpu/api/GPUCommandBuffer.h +0 -45
  154. package/cpp/rnwgpu/api/GPUCommandEncoder.cpp +0 -179
  155. package/cpp/rnwgpu/api/GPUCommandEncoder.h +0 -111
  156. package/cpp/rnwgpu/api/GPUCompilationInfo.h +0 -79
  157. package/cpp/rnwgpu/api/GPUCompilationMessage.h +0 -36
  158. package/cpp/rnwgpu/api/GPUComputePassEncoder.cpp +0 -60
  159. package/cpp/rnwgpu/api/GPUComputePassEncoder.h +0 -85
  160. package/cpp/rnwgpu/api/GPUComputePipeline.cpp +0 -12
  161. package/cpp/rnwgpu/api/GPUComputePipeline.h +0 -60
  162. package/cpp/rnwgpu/api/GPUDevice.cpp +0 -613
  163. package/cpp/rnwgpu/api/GPUDevice.h +0 -258
  164. package/cpp/rnwgpu/api/GPUDeviceLostInfo.cpp +0 -7
  165. package/cpp/rnwgpu/api/GPUDeviceLostInfo.h +0 -40
  166. package/cpp/rnwgpu/api/GPUError.h +0 -35
  167. package/cpp/rnwgpu/api/GPUExtent3D.h +0 -66
  168. package/cpp/rnwgpu/api/GPUExternalTexture.cpp +0 -139
  169. package/cpp/rnwgpu/api/GPUExternalTexture.h +0 -95
  170. package/cpp/rnwgpu/api/GPUFeatures.h +0 -203
  171. package/cpp/rnwgpu/api/GPUInternalError.h +0 -31
  172. package/cpp/rnwgpu/api/GPUOrigin2D.h +0 -55
  173. package/cpp/rnwgpu/api/GPUOrigin3D.h +0 -62
  174. package/cpp/rnwgpu/api/GPUOutOfMemoryError.h +0 -33
  175. package/cpp/rnwgpu/api/GPUPipelineLayout.h +0 -45
  176. package/cpp/rnwgpu/api/GPUQuerySet.cpp +0 -11
  177. package/cpp/rnwgpu/api/GPUQuerySet.h +0 -73
  178. package/cpp/rnwgpu/api/GPUQueue.cpp +0 -179
  179. package/cpp/rnwgpu/api/GPUQueue.h +0 -84
  180. package/cpp/rnwgpu/api/GPURenderBundle.h +0 -44
  181. package/cpp/rnwgpu/api/GPURenderBundleEncoder.cpp +0 -131
  182. package/cpp/rnwgpu/api/GPURenderBundleEncoder.h +0 -110
  183. package/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +0 -165
  184. package/cpp/rnwgpu/api/GPURenderPassEncoder.h +0 -130
  185. package/cpp/rnwgpu/api/GPURenderPipeline.cpp +0 -13
  186. package/cpp/rnwgpu/api/GPURenderPipeline.h +0 -61
  187. package/cpp/rnwgpu/api/GPUSampler.h +0 -44
  188. package/cpp/rnwgpu/api/GPUShaderModule.cpp +0 -56
  189. package/cpp/rnwgpu/api/GPUShaderModule.h +0 -66
  190. package/cpp/rnwgpu/api/GPUSharedFence.cpp +0 -80
  191. package/cpp/rnwgpu/api/GPUSharedFence.h +0 -53
  192. package/cpp/rnwgpu/api/GPUSharedTextureMemory.cpp +0 -135
  193. package/cpp/rnwgpu/api/GPUSharedTextureMemory.h +0 -75
  194. package/cpp/rnwgpu/api/GPUSupportedLimits.cpp +0 -129
  195. package/cpp/rnwgpu/api/GPUSupportedLimits.h +0 -131
  196. package/cpp/rnwgpu/api/GPUTexture.cpp +0 -47
  197. package/cpp/rnwgpu/api/GPUTexture.h +0 -162
  198. package/cpp/rnwgpu/api/GPUTextureView.h +0 -44
  199. package/cpp/rnwgpu/api/GPUUncapturedErrorEvent.h +0 -60
  200. package/cpp/rnwgpu/api/GPUValidationError.h +0 -32
  201. package/cpp/rnwgpu/api/ImageBitmap.h +0 -62
  202. package/cpp/rnwgpu/api/NativeBufferUtils.h +0 -87
  203. package/cpp/rnwgpu/api/RNWebGPU.h +0 -82
  204. package/cpp/rnwgpu/api/WebGPUConstants.h +0 -36
  205. package/cpp/rnwgpu/api/descriptors/GPUBindGroupDescriptor.h +0 -64
  206. package/cpp/rnwgpu/api/descriptors/GPUBindGroupEntry.h +0 -78
  207. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutDescriptor.h +0 -56
  208. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutEntry.h +0 -97
  209. package/cpp/rnwgpu/api/descriptors/GPUBlendComponent.h +0 -57
  210. package/cpp/rnwgpu/api/descriptors/GPUBlendState.h +0 -52
  211. package/cpp/rnwgpu/api/descriptors/GPUBufferBinding.h +0 -56
  212. package/cpp/rnwgpu/api/descriptors/GPUBufferBindingLayout.h +0 -56
  213. package/cpp/rnwgpu/api/descriptors/GPUBufferDescriptor.h +0 -59
  214. package/cpp/rnwgpu/api/descriptors/GPUBufferUsage.h +0 -39
  215. package/cpp/rnwgpu/api/descriptors/GPUCanvasConfiguration.h +0 -76
  216. package/cpp/rnwgpu/api/descriptors/GPUColor.h +0 -66
  217. package/cpp/rnwgpu/api/descriptors/GPUColorTargetState.h +0 -58
  218. package/cpp/rnwgpu/api/descriptors/GPUColorWrite.h +0 -29
  219. package/cpp/rnwgpu/api/descriptors/GPUCommandBufferDescriptor.h +0 -45
  220. package/cpp/rnwgpu/api/descriptors/GPUCommandEncoderDescriptor.h +0 -45
  221. package/cpp/rnwgpu/api/descriptors/GPUComputePassDescriptor.h +0 -56
  222. package/cpp/rnwgpu/api/descriptors/GPUComputePassTimestampWrites.h +0 -58
  223. package/cpp/rnwgpu/api/descriptors/GPUComputePipelineDescriptor.h +0 -67
  224. package/cpp/rnwgpu/api/descriptors/GPUDawnTogglesDescriptor.h +0 -56
  225. package/cpp/rnwgpu/api/descriptors/GPUDepthStencilState.h +0 -103
  226. package/cpp/rnwgpu/api/descriptors/GPUDeviceDescriptor.h +0 -109
  227. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureBindingLayout.h +0 -38
  228. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureDescriptor.h +0 -90
  229. package/cpp/rnwgpu/api/descriptors/GPUFragmentState.h +0 -73
  230. package/cpp/rnwgpu/api/descriptors/GPUImageCopyBuffer.h +0 -62
  231. package/cpp/rnwgpu/api/descriptors/GPUImageCopyExternalImage.h +0 -63
  232. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTexture.h +0 -65
  233. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTextureTagged.h +0 -81
  234. package/cpp/rnwgpu/api/descriptors/GPUImageDataLayout.h +0 -54
  235. package/cpp/rnwgpu/api/descriptors/GPUMapMode.h +0 -22
  236. package/cpp/rnwgpu/api/descriptors/GPUMultisampleState.h +0 -54
  237. package/cpp/rnwgpu/api/descriptors/GPUPipelineLayoutDescriptor.h +0 -57
  238. package/cpp/rnwgpu/api/descriptors/GPUPrimitiveState.h +0 -69
  239. package/cpp/rnwgpu/api/descriptors/GPUProgrammableStage.h +0 -61
  240. package/cpp/rnwgpu/api/descriptors/GPUQuerySetDescriptor.h +0 -55
  241. package/cpp/rnwgpu/api/descriptors/GPUQueueDescriptor.h +0 -43
  242. package/cpp/rnwgpu/api/descriptors/GPURenderBundleDescriptor.h +0 -45
  243. package/cpp/rnwgpu/api/descriptors/GPURenderBundleEncoderDescriptor.h +0 -80
  244. package/cpp/rnwgpu/api/descriptors/GPURenderPassColorAttachment.h +0 -81
  245. package/cpp/rnwgpu/api/descriptors/GPURenderPassDepthStencilAttachment.h +0 -101
  246. package/cpp/rnwgpu/api/descriptors/GPURenderPassDescriptor.h +0 -92
  247. package/cpp/rnwgpu/api/descriptors/GPURenderPassTimestampWrites.h +0 -58
  248. package/cpp/rnwgpu/api/descriptors/GPURenderPipelineDescriptor.h +0 -103
  249. package/cpp/rnwgpu/api/descriptors/GPURequestAdapterOptions.h +0 -51
  250. package/cpp/rnwgpu/api/descriptors/GPUSamplerBindingLayout.h +0 -45
  251. package/cpp/rnwgpu/api/descriptors/GPUSamplerDescriptor.h +0 -110
  252. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleCompilationHint.h +0 -60
  253. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleDescriptor.h +0 -62
  254. package/cpp/rnwgpu/api/descriptors/GPUShaderStage.h +0 -25
  255. package/cpp/rnwgpu/api/descriptors/GPUSharedFenceDescriptor.h +0 -58
  256. package/cpp/rnwgpu/api/descriptors/GPUSharedFenceState.h +0 -51
  257. package/cpp/rnwgpu/api/descriptors/GPUSharedTextureMemoryDescriptor.h +0 -73
  258. package/cpp/rnwgpu/api/descriptors/GPUStencilFaceState.h +0 -64
  259. package/cpp/rnwgpu/api/descriptors/GPUStorageTextureBindingLayout.h +0 -59
  260. package/cpp/rnwgpu/api/descriptors/GPUTextureBindingLayout.h +0 -59
  261. package/cpp/rnwgpu/api/descriptors/GPUTextureDescriptor.h +0 -91
  262. package/cpp/rnwgpu/api/descriptors/GPUTextureUsage.h +0 -29
  263. package/cpp/rnwgpu/api/descriptors/GPUTextureViewDescriptor.h +0 -91
  264. package/cpp/rnwgpu/api/descriptors/GPUUncapturedErrorEventInit.h +0 -64
  265. package/cpp/rnwgpu/api/descriptors/GPUVertexAttribute.h +0 -53
  266. package/cpp/rnwgpu/api/descriptors/GPUVertexBufferLayout.h +0 -62
  267. package/cpp/rnwgpu/api/descriptors/GPUVertexState.h +0 -73
  268. package/cpp/rnwgpu/api/descriptors/Unions.h +0 -1969
  269. package/cpp/rnwgpu/async/AsyncTaskHandle.cpp +0 -213
  270. package/cpp/rnwgpu/async/AsyncTaskHandle.h +0 -58
  271. package/cpp/rnwgpu/async/RuntimeContext.cpp +0 -199
  272. package/cpp/rnwgpu/async/RuntimeContext.h +0 -134
  273. package/lib/commonjs/skia/types/WebGPU.d.ts +0 -184
  274. package/lib/commonjs/skia/types/WebGPU.js +0 -105
  275. package/lib/commonjs/skia/types/WebGPU.js.map +0 -1
  276. package/lib/commonjs/specs/WebGPUViewNativeComponent.d.ts +0 -8
  277. package/lib/commonjs/specs/WebGPUViewNativeComponent.js +0 -10
  278. package/lib/commonjs/specs/WebGPUViewNativeComponent.js.map +0 -1
  279. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  280. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.js +0 -103
  281. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.js.map +0 -1
  282. package/lib/commonjs/specs/utils.d.ts +0 -1
  283. package/lib/commonjs/specs/utils.js +0 -11
  284. package/lib/commonjs/specs/utils.js.map +0 -1
  285. package/lib/commonjs/views/WebGPUCanvas.d.ts +0 -33
  286. package/lib/commonjs/views/WebGPUCanvas.js +0 -79
  287. package/lib/commonjs/views/WebGPUCanvas.js.map +0 -1
  288. package/lib/commonjs/views/WebGPUCanvas.web.d.ts +0 -23
  289. package/lib/commonjs/views/WebGPUCanvas.web.js +0 -20
  290. package/lib/commonjs/views/WebGPUCanvas.web.js.map +0 -1
  291. package/lib/module/skia/types/WebGPU.d.ts +0 -184
  292. package/lib/module/skia/types/WebGPU.js +0 -99
  293. package/lib/module/skia/types/WebGPU.js.map +0 -1
  294. package/lib/module/specs/WebGPUViewNativeComponent.d.ts +0 -8
  295. package/lib/module/specs/WebGPUViewNativeComponent.js +0 -4
  296. package/lib/module/specs/WebGPUViewNativeComponent.js.map +0 -1
  297. package/lib/module/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  298. package/lib/module/specs/WebGPUViewNativeComponent.web.js +0 -96
  299. package/lib/module/specs/WebGPUViewNativeComponent.web.js.map +0 -1
  300. package/lib/module/specs/utils.d.ts +0 -1
  301. package/lib/module/specs/utils.js +0 -5
  302. package/lib/module/specs/utils.js.map +0 -1
  303. package/lib/module/views/WebGPUCanvas.d.ts +0 -33
  304. package/lib/module/views/WebGPUCanvas.js +0 -70
  305. package/lib/module/views/WebGPUCanvas.js.map +0 -1
  306. package/lib/module/views/WebGPUCanvas.web.d.ts +0 -23
  307. package/lib/module/views/WebGPUCanvas.web.js +0 -12
  308. package/lib/module/views/WebGPUCanvas.web.js.map +0 -1
  309. package/lib/typescript/lib/commonjs/skia/types/WebGPU.d.ts +0 -2
  310. package/lib/typescript/lib/commonjs/specs/WebGPUViewNativeComponent.d.ts +0 -4
  311. package/lib/typescript/lib/commonjs/specs/WebGPUViewNativeComponent.web.d.ts +0 -3
  312. package/lib/typescript/lib/commonjs/specs/utils.d.ts +0 -2
  313. package/lib/typescript/lib/commonjs/views/WebGPUCanvas.d.ts +0 -6
  314. package/lib/typescript/lib/commonjs/views/WebGPUCanvas.web.d.ts +0 -6
  315. package/lib/typescript/lib/module/skia/types/WebGPU.d.ts +0 -31
  316. package/lib/typescript/lib/module/specs/WebGPUViewNativeComponent.d.ts +0 -2
  317. package/lib/typescript/lib/module/specs/WebGPUViewNativeComponent.web.d.ts +0 -2
  318. package/lib/typescript/lib/module/specs/utils.d.ts +0 -1
  319. package/lib/typescript/lib/module/views/WebGPUCanvas.d.ts +0 -7
  320. package/lib/typescript/lib/module/views/WebGPUCanvas.web.d.ts +0 -8
  321. package/lib/typescript/src/skia/types/WebGPU.d.ts +0 -184
  322. package/lib/typescript/src/specs/WebGPUViewNativeComponent.d.ts +0 -8
  323. package/lib/typescript/src/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  324. package/lib/typescript/src/specs/utils.d.ts +0 -1
  325. package/lib/typescript/src/views/WebGPUCanvas.d.ts +0 -33
  326. package/lib/typescript/src/views/WebGPUCanvas.web.d.ts +0 -23
  327. package/src/skia/types/WebGPU.ts +0 -226
  328. package/src/specs/WebGPUViewNativeComponent.ts +0 -11
  329. package/src/specs/WebGPUViewNativeComponent.web.ts +0 -110
  330. package/src/specs/utils.ts +0 -4
  331. package/src/views/WebGPUCanvas.tsx +0 -125
  332. package/src/views/WebGPUCanvas.web.tsx +0 -36
@@ -1,58 +0,0 @@
1
- package com.shopify.reactnative.skia;
2
-
3
- import com.facebook.react.module.annotations.ReactModule;
4
- import com.facebook.react.uimanager.ThemedReactContext;
5
- import com.facebook.react.uimanager.annotations.ReactProp;
6
- import com.facebook.react.views.view.ReactViewGroup;
7
- import com.facebook.react.views.view.ReactViewManager;
8
- import com.facebook.react.viewmanagers.SkiaWebGPUViewManagerDelegate;
9
- import com.facebook.react.viewmanagers.SkiaWebGPUViewManagerInterface;
10
-
11
- import androidx.annotation.NonNull;
12
- import androidx.annotation.Nullable;
13
-
14
- @ReactModule(name = WebGPUViewManager.NAME)
15
- public class WebGPUViewManager extends ReactViewManager implements SkiaWebGPUViewManagerInterface<WebGPUView> {
16
-
17
- public static final String NAME = "SkiaWebGPUView";
18
-
19
- protected SkiaWebGPUViewManagerDelegate mDelegate;
20
-
21
- public WebGPUViewManager() {
22
- mDelegate = new SkiaWebGPUViewManagerDelegate(this);
23
- }
24
-
25
- protected SkiaWebGPUViewManagerDelegate getDelegate() {
26
- return mDelegate;
27
- }
28
-
29
- @NonNull
30
- @Override
31
- public String getName() {
32
- return NAME;
33
- }
34
-
35
- @NonNull
36
- @Override
37
- public WebGPUView createViewInstance(@NonNull ThemedReactContext context) {
38
- return new WebGPUView(context);
39
- }
40
-
41
- @Override
42
- @ReactProp(name = "transparent")
43
- public void setTransparent(WebGPUView view, boolean value) {
44
- view.setTransparent(value);
45
- }
46
-
47
- @Override
48
- @ReactProp(name = "contextId")
49
- public void setContextId(WebGPUView view, int value) {
50
- view.setContextId(value);
51
- }
52
-
53
- @Override
54
- public void onDropViewInstance(@NonNull ReactViewGroup view) {
55
- super.onDropViewInstance(view);
56
- ((WebGPUView) view).destroy();
57
- }
58
- }
@@ -1,33 +0,0 @@
1
- #ifdef SK_GRAPHITE
2
-
3
- #import <CoreVideo/CoreVideo.h>
4
-
5
- #include "rnwgpu/api/AppleNativeBuffer.h"
6
-
7
- namespace rnwgpu {
8
-
9
- void *GetIOSurfaceFromNativeBuffer(void *cvPixelBuffer, uint32_t *outWidth,
10
- uint32_t *outHeight) {
11
- auto pixelBuffer = reinterpret_cast<CVPixelBufferRef>(cvPixelBuffer);
12
- if (pixelBuffer == nullptr) {
13
- if (outWidth != nullptr) {
14
- *outWidth = 0;
15
- }
16
- if (outHeight != nullptr) {
17
- *outHeight = 0;
18
- }
19
- return nullptr;
20
- }
21
- if (outWidth != nullptr) {
22
- *outWidth = static_cast<uint32_t>(CVPixelBufferGetWidth(pixelBuffer));
23
- }
24
- if (outHeight != nullptr) {
25
- *outHeight = static_cast<uint32_t>(CVPixelBufferGetHeight(pixelBuffer));
26
- }
27
- // The IOSurface is owned by the CVPixelBuffer; we don't retain it here.
28
- return CVPixelBufferGetIOSurface(pixelBuffer);
29
- }
30
-
31
- } // namespace rnwgpu
32
-
33
- #endif // SK_GRAPHITE
@@ -1,20 +0,0 @@
1
- #pragma once
2
-
3
- #ifdef SK_GRAPHITE
4
-
5
- #include "rnwgpu/PlatformContext.h"
6
-
7
- namespace rnwgpu {
8
-
9
- class SkiaPlatformContext : public PlatformContext {
10
- public:
11
- SkiaPlatformContext() = default;
12
- ~SkiaPlatformContext() = default;
13
-
14
- wgpu::Surface makeSurface(wgpu::Instance instance, void *surface, int width,
15
- int height) override;
16
- };
17
-
18
- } // namespace rnwgpu
19
-
20
- #endif // SK_GRAPHITE
@@ -1,21 +0,0 @@
1
- #ifdef SK_GRAPHITE
2
-
3
- #include "SkiaPlatformContext.h"
4
-
5
- #include <TargetConditionals.h>
6
-
7
- namespace rnwgpu {
8
-
9
- wgpu::Surface SkiaPlatformContext::makeSurface(wgpu::Instance instance,
10
- void *surface, int width,
11
- int height) {
12
- wgpu::SurfaceSourceMetalLayer metalSurfaceDesc;
13
- metalSurfaceDesc.layer = surface;
14
- wgpu::SurfaceDescriptor surfaceDescriptor;
15
- surfaceDescriptor.nextInChain = &metalSurfaceDesc;
16
- return instance.CreateSurface(&surfaceDescriptor);
17
- }
18
-
19
- } // namespace rnwgpu
20
-
21
- #endif // SK_GRAPHITE
@@ -1,81 +0,0 @@
1
- #ifdef RCT_NEW_ARCH_ENABLED
2
-
3
- #import "SkiaWebGPUView.h"
4
-
5
- #import <react/renderer/components/rnskia/ComponentDescriptors.h>
6
- #import <react/renderer/components/rnskia/EventEmitters.h>
7
- #import <react/renderer/components/rnskia/Props.h>
8
- #import <react/renderer/components/rnskia/RCTComponentViewHelpers.h>
9
-
10
- #import "RCTFabricComponentsPlugins.h"
11
- #import "WebGPUMetalView.h"
12
-
13
- using namespace facebook::react;
14
-
15
- @implementation SkiaWebGPUView
16
-
17
- - (instancetype)initWithFrame:(CGRect)frame {
18
- if (self = [super initWithFrame:frame]) {
19
- static const auto defaultProps =
20
- std::make_shared<const SkiaWebGPUViewProps>();
21
- _props = defaultProps;
22
- }
23
- return self;
24
- }
25
-
26
- + (ComponentDescriptorProvider)componentDescriptorProvider {
27
- return concreteComponentDescriptorProvider<
28
- SkiaWebGPUViewComponentDescriptor>();
29
- }
30
-
31
- - (void)prepareForRecycle {
32
- [super prepareForRecycle];
33
- /*
34
- It's important to destroy the Metal Layer before releasing a view
35
- to the recycled pool to prevent displaying outdated content from
36
- the last usage in the new context.
37
- */
38
- self.contentView = nil;
39
- }
40
-
41
- - (WebGPUMetalView *)getContentView {
42
- if (!self.contentView) {
43
- self.contentView = [WebGPUMetalView new];
44
- }
45
- return (WebGPUMetalView *)self.contentView;
46
- }
47
-
48
- - (void)updateProps:(const Props::Shared &)props
49
- oldProps:(const Props::Shared &)oldProps {
50
- const auto &oldViewProps =
51
- *std::static_pointer_cast<const SkiaWebGPUViewProps>(_props);
52
- const auto &newViewProps =
53
- *std::static_pointer_cast<const SkiaWebGPUViewProps>(props);
54
-
55
- if (newViewProps.contextId != oldViewProps.contextId) {
56
- /*
57
- The context is set only once during mounting the component
58
- and never changes because it isn't available for users to modify.
59
- */
60
- WebGPUMetalView *metalView = [WebGPUMetalView new];
61
- self.contentView = metalView;
62
- [metalView setContextId:@(newViewProps.contextId)];
63
- [metalView configure];
64
- }
65
-
66
- [super updateProps:props oldProps:oldProps];
67
- }
68
-
69
- - (void)updateLayoutMetrics:(const LayoutMetrics &)layoutMetrics
70
- oldLayoutMetrics:(const LayoutMetrics &)oldLayoutMetrics {
71
- [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
72
- [(WebGPUMetalView *)self.contentView update];
73
- }
74
-
75
- @end
76
-
77
- Class<RCTComponentViewProtocol> SkiaWebGPUViewCls(void) {
78
- return SkiaWebGPUView.class;
79
- }
80
-
81
- #endif // RCT_NEW_ARCH_ENABLED
@@ -1,136 +0,0 @@
1
- #import "WebGPUMetalView.h"
2
-
3
- #ifdef SK_GRAPHITE
4
-
5
- #import "webgpu/webgpu_cpp.h"
6
- #import <QuartzCore/CAMetalLayer.h>
7
-
8
- #import <ReactCommon/CallInvoker.h>
9
-
10
- #import "rnskia/RNDawnContext.h"
11
- #import "rnwgpu/SurfaceRegistry.h"
12
- #import "rnwgpu/async/RuntimeContext.h"
13
-
14
- namespace {
15
- // Applies a surface attach latched by the platform UI thread (see
16
- // SurfaceInfo::applyPendingAttach) from the JS thread. Surface attaches are
17
- // normally adopted at the next frame boundary by whichever thread renders;
18
- // this flush covers contexts that are not actively rendering (static
19
- // content), so the last offscreen frame still makes it on screen. Mirrors
20
- // react-native-webgpu's RNWebGPUManager::flushPendingSurfaceTransition.
21
- void flushPendingSurfaceTransition(std::shared_ptr<rnwgpu::SurfaceInfo> info) {
22
- if (info == nullptr) {
23
- return;
24
- }
25
- auto invoker = rnwgpu::async::RuntimeContext::mainCallInvoker();
26
- if (invoker == nullptr) {
27
- return;
28
- }
29
- invoker->invokeAsync([info = std::move(info)] { info->applyPendingAttach(); });
30
- }
31
- } // namespace
32
-
33
- @implementation WebGPUMetalView {
34
- BOOL _isConfigured;
35
- }
36
-
37
- #if !TARGET_OS_OSX
38
- + (Class)layerClass {
39
- return [CAMetalLayer class];
40
- }
41
- #else // !TARGET_OS_OSX
42
- - (instancetype)init {
43
- self = [super init];
44
- if (self) {
45
- self.wantsLayer = true;
46
- self.layer = [CAMetalLayer layer];
47
- }
48
- return self;
49
- }
50
- #endif // !TARGET_OS_OSX
51
-
52
- - (void)configure {
53
- auto size = self.frame.size;
54
- // Retain the layer for as long as SurfaceInfo holds the pointer: the
55
- // latched attach (and the flush lambda that adopts it) can outlive this
56
- // view, e.g. across a dev reload where the registry is cleared before
57
- // dealloc runs. Balanced by the releaser below.
58
- void *nativeSurface = (void *)CFBridgingRetain(self.layer);
59
- auto &registry = rnwgpu::SurfaceRegistry::getInstance();
60
- auto &dawnContext = RNSkia::DawnContext::getInstance();
61
- auto gpu = dawnContext.getWGPUInstance();
62
-
63
- // Create the surface using Dawn's API directly
64
- wgpu::SurfaceSourceMetalLayer metalSurfaceDesc;
65
- metalSurfaceDesc.layer = nativeSurface;
66
- wgpu::SurfaceDescriptor surfaceDescriptor;
67
- surfaceDescriptor.nextInChain = &metalSurfaceDesc;
68
- auto surface = gpu.CreateSurface(&surfaceDescriptor);
69
-
70
- // Find-or-create + attach runs atomically under the registry lock so a
71
- // concurrent destroyContext cannot orphan this surface.
72
- auto info = registry.attachSurface(
73
- [_contextId intValue], gpu, size.width, size.height, nativeSurface,
74
- surface, [](void *layer) {
75
- // The releaser can run on the rendering thread; CALayer teardown
76
- // belongs on the main thread.
77
- dispatch_async(dispatch_get_main_queue(), ^{
78
- CFBridgingRelease(layer);
79
- });
80
- });
81
- // The attach is adopted at the next frame boundary by the rendering thread;
82
- // schedule a flush so contexts that are not currently rendering still pick
83
- // it up (and present their last offscreen frame).
84
- flushPendingSurfaceTransition(info);
85
- }
86
-
87
- - (void)update {
88
- auto size = self.frame.size;
89
- auto &registry = rnwgpu::SurfaceRegistry::getInstance();
90
- auto surfaceInfo = registry.getSurfaceInfo([_contextId intValue]);
91
- if (surfaceInfo) {
92
- surfaceInfo->resize(size.width, size.height);
93
- }
94
- }
95
-
96
- - (void)dealloc {
97
- // The view dies with its Canvas (contextIds are never reused), so view
98
- // teardown retires the registry entry. The JS-side cleanup
99
- // (RNWebGPU.destroyContext) only handles entries that never had a native
100
- // surface; see RNWebGPU::destroyContext for the ownership split.
101
- auto &registry = rnwgpu::SurfaceRegistry::getInstance();
102
- if (auto info = registry.getSurfaceInfo([_contextId intValue])) {
103
- info->detachSurface();
104
- }
105
- registry.removeSurfaceInfo([_contextId intValue]);
106
- }
107
-
108
- @end
109
-
110
- #else // SK_GRAPHITE
111
-
112
- // Stub implementation when GRAPHITE is not enabled
113
- @implementation WebGPUMetalView
114
-
115
- #if !TARGET_OS_OSX
116
- + (Class)layerClass {
117
- return [CAMetalLayer class];
118
- }
119
- #else // !TARGET_OS_OSX
120
- - (instancetype)init {
121
- self = [super init];
122
- return self;
123
- }
124
- #endif // !TARGET_OS_OSX
125
-
126
- - (void)configure {
127
- // No-op when GRAPHITE is not enabled
128
- }
129
-
130
- - (void)update {
131
- // No-op when GRAPHITE is not enabled
132
- }
133
-
134
- @end
135
-
136
- #endif // SK_GRAPHITE
@@ -1,116 +0,0 @@
1
- #pragma once
2
- #include <jsi/jsi.h>
3
-
4
- #include <cmath>
5
- #include <cstdint>
6
- #include <memory>
7
-
8
- #include "jsi/JSIConverter.h"
9
-
10
- namespace rnwgpu {
11
-
12
- namespace jsi = facebook::jsi;
13
-
14
- struct ArrayBuffer : jsi::MutableBuffer {
15
- ArrayBuffer(void *data, size_t size, size_t bytesPerElement)
16
- : _data(data), _size(size), _bytesPerElement(bytesPerElement) {}
17
-
18
- ~ArrayBuffer() override {}
19
-
20
- size_t size() const override { return _size; }
21
-
22
- uint8_t *data() override { return static_cast<uint8_t *>(_data); }
23
-
24
- void *_data;
25
- size_t _size;
26
- size_t _bytesPerElement;
27
- };
28
-
29
- static std::shared_ptr<ArrayBuffer>
30
- createArrayBufferFromJSI(jsi::Runtime &runtime,
31
- const jsi::ArrayBuffer &arrayBuffer,
32
- size_t bytesPerElement) {
33
- auto size = arrayBuffer.size(runtime);
34
- return std::make_shared<ArrayBuffer>(arrayBuffer.data(runtime), size,
35
- bytesPerElement);
36
- }
37
-
38
- template <> struct JSIConverter<std::shared_ptr<ArrayBuffer>> {
39
- static std::shared_ptr<ArrayBuffer>
40
- fromJSI(jsi::Runtime &runtime, const jsi::Value &arg, bool outOfBound) {
41
- if (arg.isObject()) {
42
- auto obj = arg.getObject(runtime);
43
- if (obj.isArrayBuffer(runtime)) {
44
- return createArrayBufferFromJSI(runtime, obj.getArrayBuffer(runtime),
45
- 1);
46
- }
47
- if (obj.hasProperty(runtime, "buffer")) {
48
- auto bufferProp = obj.getProperty(runtime, "buffer");
49
- if (bufferProp.isObject() &&
50
- bufferProp.getObject(runtime).isArrayBuffer(runtime)) {
51
- auto buff = bufferProp.getObject(runtime);
52
- auto arrayBuffer = buff.getArrayBuffer(runtime);
53
- const size_t bufferSize = arrayBuffer.size(runtime);
54
-
55
- // byteOffset / byteLength are user-readable JS properties, not values
56
- // the engine guarantees (unlike Dawn's node binding, which reads them
57
- // off the engine's typed-array view). Read them as doubles so we can
58
- // reject negative, non-integral, NaN/Inf, or oversized values before
59
- // they wrap around when cast to size_t.
60
- const double byteOffsetValue =
61
- obj.getProperty(runtime, "byteOffset").asNumber();
62
- const double byteLengthValue =
63
- obj.getProperty(runtime, "byteLength").asNumber();
64
-
65
- auto isValidByteIndex = [](double value) {
66
- return std::isfinite(value) && value >= 0.0 &&
67
- value <= static_cast<double>(SIZE_MAX) &&
68
- std::floor(value) == value;
69
- };
70
- if (!isValidByteIndex(byteOffsetValue) ||
71
- !isValidByteIndex(byteLengthValue)) {
72
- throw std::runtime_error(
73
- "ArrayBuffer::fromJSI: invalid byteOffset/byteLength");
74
- }
75
-
76
- const size_t byteOffset = static_cast<size_t>(byteOffsetValue);
77
- const size_t byteLength = static_cast<size_t>(byteLengthValue);
78
-
79
- // Overflow-safe bounds check: byteOffset + byteLength <= bufferSize.
80
- if (byteOffset > bufferSize || byteLength > bufferSize - byteOffset) {
81
- throw std::runtime_error(
82
- "ArrayBuffer::fromJSI: view bounds [byteOffset, byteOffset + "
83
- "byteLength) exceed the backing ArrayBuffer size");
84
- }
85
-
86
- // BYTES_PER_ELEMENT is absent on a DataView; default to 1. A spoofed
87
- // object could report 0 (or a negative/NaN value), so clamp to a
88
- // minimum of 1 to avoid a later division by zero in writeBuffer.
89
- size_t bytesPerElements = 1;
90
- if (obj.hasProperty(runtime, "BYTES_PER_ELEMENT")) {
91
- auto bpe = obj.getProperty(runtime, "BYTES_PER_ELEMENT");
92
- if (bpe.isNumber()) {
93
- const double value = bpe.asNumber();
94
- if (std::isfinite(value) && value >= 1.0) {
95
- bytesPerElements = static_cast<size_t>(value);
96
- }
97
- }
98
- }
99
-
100
- return std::make_shared<ArrayBuffer>(arrayBuffer.data(runtime) +
101
- byteOffset,
102
- byteLength, bytesPerElements);
103
- }
104
- }
105
- }
106
- throw std::runtime_error("ArrayBuffer::fromJSI: argument is not an object "
107
- "with an ArrayBuffer 'buffer' property");
108
- }
109
-
110
- static jsi::Value toJSI(jsi::Runtime &runtime,
111
- std::shared_ptr<ArrayBuffer> arg) {
112
- return jsi::ArrayBuffer(runtime, arg);
113
- }
114
- };
115
-
116
- } // namespace rnwgpu
@@ -1,52 +0,0 @@
1
- #pragma once
2
-
3
- #include <memory>
4
-
5
- #include "jsi/NativeObject.h"
6
-
7
- namespace rnwgpu {
8
-
9
- namespace jsi = facebook::jsi;
10
-
11
- class Canvas : public NativeObject<Canvas> {
12
- public:
13
- // Note: not "Canvas" — that brand belongs to RNSkia::JsiSkCanvas, and
14
- // boxing brands must be unique process-wide (see BoxedNativeObjectRegistry).
15
- static constexpr const char *CLASS_NAME = "WebGPUCanvas";
16
-
17
- Canvas(void *nativeSurface, int width, int height)
18
- : NativeObject(CLASS_NAME), _nativeSurface(nativeSurface), _width(width),
19
- _height(height), _clientWidth(width), _clientHeight(height) {}
20
-
21
- void *getNativeSurface() { return _nativeSurface; }
22
-
23
- int getWidth() { return _width; }
24
- int getHeight() { return _height; }
25
-
26
- void setWidth(int width) { _width = width; }
27
- void setHeight(int height) { _height = height; }
28
-
29
- int getClientWidth() { return _clientWidth; }
30
- int getClientHeight() { return _clientHeight; }
31
-
32
- void setClientWidth(int width) { _clientWidth = width; }
33
- void setClientHeight(int height) { _clientHeight = height; }
34
-
35
- static void definePrototype(jsi::Runtime &runtime, jsi::Object &prototype) {
36
- installGetterSetter(runtime, prototype, "width", &Canvas::getWidth,
37
- &Canvas::setWidth);
38
- installGetterSetter(runtime, prototype, "height", &Canvas::getHeight,
39
- &Canvas::setHeight);
40
- installGetter(runtime, prototype, "clientWidth", &Canvas::getClientWidth);
41
- installGetter(runtime, prototype, "clientHeight", &Canvas::getClientHeight);
42
- }
43
-
44
- private:
45
- void *_nativeSurface;
46
- int _width;
47
- int _height;
48
- int _clientWidth;
49
- int _clientHeight;
50
- };
51
-
52
- } // namespace rnwgpu
@@ -1,18 +0,0 @@
1
- #pragma once
2
-
3
- #include <memory>
4
-
5
- #include "webgpu/webgpu_cpp.h"
6
-
7
- namespace rnwgpu {
8
-
9
- class PlatformContext {
10
- public:
11
- PlatformContext() = default;
12
- virtual ~PlatformContext() = default;
13
-
14
- virtual wgpu::Surface makeSurface(wgpu::Instance instance, void *surface,
15
- int width, int height) = 0;
16
- };
17
-
18
- } // namespace rnwgpu