diff --git a/.github/workflows/build-skia-graphite.yml b/.github/workflows/build-skia-graphite.yml index d40b60f3d4..b5c7d6629d 100644 --- a/.github/workflows/build-skia-graphite.yml +++ b/.github/workflows/build-skia-graphite.yml @@ -178,8 +178,43 @@ jobs: SK_GRAPHITE: 1 run: yarn build-skia ${{ matrix.target }} - - name: Package binaries - ${{ matrix.artifact_name }} - id: package + - name: Package Apple xcframeworks (per-framework zips) - ${{ matrix.artifact_name }} + if: startsWith(matrix.target, 'apple') + run: | + set -eo pipefail + ROOT="${{ matrix.package_root }}" + TAG="${DISPATCH_TAG}" + if [ -z "$TAG" ]; then + TAG="${SKIA_BRANCH_SLUG}" + fi + if [ -z "$TAG" ]; then + TAG="${GITHUB_REF_NAME:-}" + fi + if [ -z "$TAG" ]; then + TAG="${GITHUB_SHA}" + fi + mkdir -p release-assets + # SPM binaryTarget requires one .xcframework per .zip archive, so each + # framework in the bundle is zipped separately (ditto preserves the + # symlinks inside .xcframework, unlike the default `zip` tool) and its + # SPM checksum recorded for the future Package.swift binaryTargets. + MANIFEST="release-assets/${{ matrix.artifact_name }}-${TAG}.checksums.txt" + : > "$MANIFEST" + for fw in "$ROOT"/*.xcframework; do + NAME="$(basename "$fw" .xcframework)" + ZIP_NAME="${{ matrix.artifact_name }}-${NAME}-${TAG}.zip" + ZIP_PATH="release-assets/$ZIP_NAME" + ditto -c -k --sequesterRsrc --keepParent "$fw" "$ZIP_PATH" + CHECKSUM="$(swift package compute-checksum "$ZIP_PATH")" + echo "$ZIP_NAME $CHECKSUM" >> "$MANIFEST" + done + shell: bash + env: + DISPATCH_TAG: ${{ needs.prepare-release.outputs.tag_name }} + SKIA_BRANCH_SLUG: ${{ needs.prepare-release.outputs.skia_branch_slug }} + + - name: Package Android binaries - ${{ matrix.artifact_name }} + if: startsWith(matrix.target, 'android') run: | set -eo pipefail ROOT="${{ matrix.package_root }}" @@ -198,8 +233,6 @@ jobs: ARCHIVE="${{ matrix.artifact_name }}-${TAG}.tar.gz" mkdir -p release-assets tar -czf "release-assets/$ARCHIVE" -C "$PARENT" "$BASENAME" - echo "asset_path=release-assets/$ARCHIVE" >> "$GITHUB_OUTPUT" - echo "asset_name=$ARCHIVE" >> "$GITHUB_OUTPUT" shell: bash env: DISPATCH_TAG: ${{ needs.prepare-release.outputs.tag_name }} @@ -212,7 +245,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ needs.prepare-release.outputs.tag_name }} - files: ${{ steps.package.outputs.asset_path }} + files: release-assets/* prerelease: true - name: Upload binaries as workflow artifact (dry run) - ${{ matrix.artifact_name }} @@ -220,7 +253,7 @@ jobs: uses: actions/upload-artifact@v7 with: name: ${{ matrix.artifact_name }} - path: ${{ steps.package.outputs.asset_path }} + path: release-assets/ retention-days: 7 - name: Package Graphite Headers diff --git a/.github/workflows/build-skia.yml b/.github/workflows/build-skia.yml index 3cf67a0710..983a166d90 100644 --- a/.github/workflows/build-skia.yml +++ b/.github/workflows/build-skia.yml @@ -129,8 +129,43 @@ jobs: ZERO_AR_DATE: 1 run: yarn build-skia ${{ matrix.target }} - - name: Package binaries - ${{ matrix.artifact_name }} - id: package + - name: Package Apple xcframeworks (per-framework zips) - ${{ matrix.artifact_name }} + if: startsWith(matrix.target, 'apple') + run: | + set -eo pipefail + ROOT="${{ matrix.package_root }}" + TAG="${DISPATCH_TAG}" + if [ -z "$TAG" ]; then + TAG="${SKIA_BRANCH_SLUG}" + fi + if [ -z "$TAG" ]; then + TAG="${GITHUB_REF_NAME:-}" + fi + if [ -z "$TAG" ]; then + TAG="${GITHUB_SHA}" + fi + mkdir -p release-assets + # SPM binaryTarget requires one .xcframework per .zip archive, so each + # framework in the bundle is zipped separately (ditto preserves the + # symlinks inside .xcframework, unlike the default `zip` tool) and its + # SPM checksum recorded for the future Package.swift binaryTargets. + MANIFEST="release-assets/${{ matrix.artifact_name }}-${TAG}.checksums.txt" + : > "$MANIFEST" + for fw in "$ROOT"/*.xcframework; do + NAME="$(basename "$fw" .xcframework)" + ZIP_NAME="${{ matrix.artifact_name }}-${NAME}-${TAG}.zip" + ZIP_PATH="release-assets/$ZIP_NAME" + ditto -c -k --sequesterRsrc --keepParent "$fw" "$ZIP_PATH" + CHECKSUM="$(swift package compute-checksum "$ZIP_PATH")" + echo "$ZIP_NAME $CHECKSUM" >> "$MANIFEST" + done + shell: bash + env: + DISPATCH_TAG: ${{ needs.prepare-release.outputs.tag_name }} + SKIA_BRANCH_SLUG: ${{ needs.prepare-release.outputs.skia_branch_slug }} + + - name: Package Android binaries - ${{ matrix.artifact_name }} + if: startsWith(matrix.target, 'android') run: | set -eo pipefail ROOT="${{ matrix.package_root }}" @@ -149,8 +184,6 @@ jobs: ARCHIVE="${{ matrix.artifact_name }}-${TAG}.tar.gz" mkdir -p release-assets tar -czf "release-assets/$ARCHIVE" -C "$PARENT" "$BASENAME" - echo "asset_path=release-assets/$ARCHIVE" >> "$GITHUB_OUTPUT" - echo "asset_name=$ARCHIVE" >> "$GITHUB_OUTPUT" shell: bash env: DISPATCH_TAG: ${{ needs.prepare-release.outputs.tag_name }} @@ -163,7 +196,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ needs.prepare-release.outputs.tag_name }} - files: ${{ steps.package.outputs.asset_path }} + files: release-assets/* prerelease: true - name: Upload binaries as workflow artifact (dry run) - ${{ matrix.artifact_name }} @@ -171,5 +204,5 @@ jobs: uses: actions/upload-artifact@v7 with: name: ${{ matrix.artifact_name }} - path: ${{ steps.package.outputs.asset_path }} + path: release-assets/ retention-days: 7 diff --git a/.gitmodules b/.gitmodules index 66a508ee5c..caf2bf8a17 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "externals/skia"] path = externals/skia url = https://chromium.googlesource.com/skia/ - branch = chrome/m152 + branch = chrome/m154 [submodule "externals/depot_tools"] path = externals/depot_tools url = https://chromium.googlesource.com/chromium/tools/depot_tools.git diff --git a/apps/docs/static/img/skottie/text-prop.png b/apps/docs/static/img/skottie/text-prop.png index 134952a445..8e1169c6e6 100644 Binary files a/apps/docs/static/img/skottie/text-prop.png and b/apps/docs/static/img/skottie/text-prop.png differ diff --git a/apps/example/ios/Podfile.lock b/apps/example/ios/Podfile.lock index c2ac90f9f2..73499d6e30 100644 --- a/apps/example/ios/Podfile.lock +++ b/apps/example/ios/Podfile.lock @@ -2009,7 +2009,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - react-native-webgpu (0.8.0): + - react-native-webgpu (0.10.0): - boost - DoubleConversion - fast_float @@ -3239,89 +3239,89 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: 11b010917f5f15150b2c015abddef1573d2bb05d - RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f + RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 RCTDeprecation: a41bbdd9af30bf2e5715796b313e44ec43eefff1 RCTRequired: 7be34aabb0b77c3cefe644528df0fa0afad4e4d0 RCTSwiftUI: a6c7271c39098bf00dbdad8f8ed997a59bbfbe44 - RCTSwiftUIWrapper: 5ec163e8fde163d3fba714a992b50a266e1ece37 + RCTSwiftUIWrapper: ff9098ccf7727e58218f2f8ea110349863f43438 RCTTypeSafety: 27927d0ca04e419ed9467578b3e6297e37210b5c React: 4bc1f928568ad4bcfd147260f907b4ea5873a03b React-callinvoker: 87f8728235a0dc62e9dc19b3851c829d9347d015 - React-Core: 19e0183e28d7a6613ecacebd7525fe6650efa3b6 - React-CoreModules: 73cc86f2a0ff84b93d6325073ad2e4874d21ad40 - React-cxxreact: 4bf734645c77c9b86e2f3e933e0411cf2f14d1ba + React-Core: 76bed73b02821e5630e7f2cb2e82432ee964695d + React-CoreModules: 752dbfdaeb096658aa0adc4a03ba6214815a08df + React-cxxreact: b6798528aa601c6db66e6adc7e2da2b059c8be74 React-debug: 8978deb306f6f38c28b5091e52b0ac9f942b157e - React-defaultsnativemodule: 724eb9ec388d494f1e2057d83355ee8fe6f1d780 - React-domnativemodule: 9068f41092f725acd09950233d2847364c731947 - React-Fabric: 945cc8abf08d9d0966acef605bffce7b501c49d9 - React-FabricComponents: 4c4ad6f0d16c964a68f945e029505e2eeec6654b - React-FabricImage: a8b628fd98db21b9f8588e06f14a9194dda11b40 - React-featureflags: 0937601c1af1cc125851ec5bbf4654285d47a3e7 - React-featureflagsnativemodule: ac1a3e0353e1a6e15411b17ed6c7122adb0468a4 - React-graphics: cca521e06463608be46207a4aa160f8a7f725f8b - React-hermes: ec50b9fcea2c3bfdd42f8cec845eac3f35888572 - React-idlecallbacksnativemodule: effcae5b7b4473211adb154aaa321d5d9e2fbcc9 - React-ImageManager: b38459e538f1840fa5c3e7612a4bcb0029a3c366 - React-intersectionobservernativemodule: 8d33366661971200cf2e151727f6fe007b62ae7b - React-jserrorhandler: f94c688a0dbe2e045b91b992722b92e97d56f77f - React-jsi: 3216c876cd4c571a57909e22d77c8fd9530aa067 - React-jsiexecutor: 475563c0042841a85930a455d3199f6b1483a5fe - React-jsinspector: bc484fb32bf1b9fed80afe8793e614eba4f7b39e - React-jsinspectorcdp: 5a574d1d35016968a67e78e6b8a7917473ffbb77 - React-jsinspectornetwork: dce3a5a1351b527ee8c28ad4a8bdd211507e1a45 - React-jsinspectortracing: 65f6b166bd67e5adc31eba027e1570bacf7a3cc7 - React-jsitooling: d5463f5489a31640b0fa0ec4e31566ca8aa86c13 - React-jsitracing: 3c7fc18821aba64855acb8658aa857ca6a7fddf6 - React-logger: 6ac901f5c7f7321d2be1a40b203bccc2e23411e3 - React-Mapbuffer: 2e0e7cc5b7064eaed9c8b8afc3a87621cb7ef5cd - React-microtasksnativemodule: dd4d33b251b57e5027c572c6d0b45cbfbcfaa386 - react-native-safe-area-context: 54d812805f3c4e08a4580ad086cbde1d8780c2e4 - react-native-skia: 765e9975e9ccde5ce3c9a0f740f195108c7d0280 - react-native-webgpu: d7021164f316160273312cc13d9d4e0ea0a1308b - React-NativeModulesApple: 7f2f2fed3f6c858889eb61d09941be965d52df58 - React-networking: 43e5e6773ac2ca2a93261a1388fed269c9fce092 + React-defaultsnativemodule: 682b77ef4acfb298017be15f4f93c1d998deb174 + React-domnativemodule: 4c4b44f7eb68dbc3a2218db088bef318a7302017 + React-Fabric: b6f82a4d8498ce4475586f71ca8397a771fe292d + React-FabricComponents: c8695f4b11918a127c4560d66f7d3fdb01a17986 + React-FabricImage: d64f48830f63830e8ffaaf69fa487116856fbbf1 + React-featureflags: 2a46b229903e906d33dbaf9207ce57c59306c369 + React-featureflagsnativemodule: cba6c0814051a0934f8bcee4a436ee2a6bcc9754 + React-graphics: 3d0435051e1ab8904d065f8ffbe981a9fc202841 + React-hermes: 32fc9c231c1aa5c2fcfe851b0d19ee9269f88f4c + React-idlecallbacksnativemodule: f8ee42581795c4844d97147596bcc2d824c0f188 + React-ImageManager: e8f7377ef0585fd2df05559a17e01a03e187d5cf + React-intersectionobservernativemodule: b1bea12ca29accdd2eda60c87605a6030b894eb9 + React-jserrorhandler: 1a86df895b4eaf4e771abe8cf34cbb26d821f771 + React-jsi: adf8527fec197ad9d0480cc5b8945eb56de627f0 + React-jsiexecutor: 315fa2f879b43e3a9ca08f5f4b733472f7e4e8a4 + React-jsinspector: b4fd1933666bcb2549b566b40656c1e45e9d7632 + React-jsinspectorcdp: 80141710f2668e5b8f00417298d9b76b4abf90fa + React-jsinspectornetwork: 1d3ea717dbbec316cd8c21a0af53928a7bf74901 + React-jsinspectortracing: 4ce745374d4b2bfbd164cce9f8de8383d3d818a0 + React-jsitooling: fc4ac4c3b1f3f9f7fedf0c777c6ff3f244f568bd + React-jsitracing: bff08a6faeef4a9bd286487da191f5e5329e21a9 + React-logger: b8483fa08e0d62e430c76d864309d90576ca2f68 + React-Mapbuffer: 7b72a669e94662359dad4f42b5af005eb24b4e83 + React-microtasksnativemodule: cdc02da075f2857803ed63f24f5f72fc40e094c0 + react-native-safe-area-context: c00143b4823773bba23f2f19f85663ae89ceb460 + react-native-skia: 398d81d07392758762cf114280cceb24ebc9b6f3 + react-native-webgpu: 64a2e7f8241cdb08c0e43c7e51fbb9619109aa41 + React-NativeModulesApple: a2c3d2cbec893956a5b3e4060322db2984fff75b + React-networking: 3f98bd96893a294376e7e03730947a08d474c380 React-oscompat: 80166b66da22e7af7fad94474e9997bd52d4c8c6 - React-perflogger: 63c90e0d8c24df87ffa14dad01aeafc352847dd0 - React-performancecdpmetrics: 5a9b81c08f75045635127d626440d9ada01e774b - React-performancetimeline: 31cebfff69ec9174b3fb54b0606fcb12ef91cbad + React-perflogger: d6797918d2b1031e91a9d8f5e7fdd2c8728fb390 + React-performancecdpmetrics: 5570be61e2f97c4741c5d432c91570e8e5a39892 + React-performancetimeline: 5763499ae1991fc18dcf416e340ce7bc829bb298 React-RCTActionSheet: 3bd5f5db9f983cf38d51bb9a7a198e2ebea94821 - React-RCTAnimation: 346865a809fa5132f6c594c8b376c6cf46b44e88 - React-RCTAppDelegate: b2d1e0d3663c987f49f45094883b9e36fcbf0181 - React-RCTBlob: 74759ebb7ff9077d19f60c301782c1f8c3eb2813 - React-RCTFabric: 7b4b14dad21ca99333ebcbc0bf5c205647a315a8 - React-RCTFBReactNativeSpec: 39151968adb68b8c59f29a8bd4223d4d7780a793 - React-RCTImage: 60763f56e8a5e45d861d7c4777e428bb820ec52a - React-RCTLinking: 52aee78b0b3163167c7fcf58f80a42943c03a056 - React-RCTNetwork: f5e1e8ae5eff6982efff6289b06ec0a76d0a6ac2 - React-RCTRuntime: 0e99199322afd372e74b95ae5c58f4e074cc2855 - React-RCTSettings: 298bb40d3412bf32e0b4f0797e48416b0b7278a1 - React-RCTText: dfb74800e27d792d1188fa975a3b9807c3362e3e - React-RCTVibration: ffe5fd4f50a835e353a3b6869eb005dab11eea44 + React-RCTAnimation: 46a9978f27dc434dbeed16afa7b82619b690a9af + React-RCTAppDelegate: 62ecd60a2b2a8cae26ce6a066bfa59cfde97af01 + React-RCTBlob: 8285c859513023ee3cc8c806d9b59d4da078c4ba + React-RCTFabric: 05ed09347e938de985052f791a6a0698816d5761 + React-RCTFBReactNativeSpec: 83ba579fca9a51e774ac32578ef5dd3262edd7e2 + React-RCTImage: a5364d0f098692cfbf5bef1e8a63e7712ecb14b7 + React-RCTLinking: 34b63b0aa0e92d30f5d7aa2c255a8f95fa75ee8f + React-RCTNetwork: 1ef88b7a5310b8f915d3556b5b247def113191ed + React-RCTRuntime: ed29cf68a46782fec891e5afe1d8d758ca6ccd9b + React-RCTSettings: 2c45623d6c0f30851a123f621eb9d32298bcbb0c + React-RCTText: 0ee70f5dc18004b4d81b2c214267c6cbec058587 + React-RCTVibration: 88557e21e7cc3fe76b5b174cba28ff45c6def997 React-rendererconsistency: d280314a3e7f0097152f89e815b4de821c2be8b9 - React-renderercss: 8a1a346f3665fd5ea7a7be7b3b9f95d4743e1180 - React-rendererdebug: af74afdfb3d6c5382ebab35562efd8eb9e690473 - React-RuntimeApple: 06e33d291e72fd0c73ac47046c3536d77d5aeedd - React-RuntimeCore: 99273d2af072062eb07f0b2d2d4a0f2de697ea14 - React-runtimeexecutor: 2063c03c18810ee57939d138142e6493333360ef - React-RuntimeHermes: 2253a7f4c8d56b449230b330b0b15383ed4b3df4 - React-runtimescheduler: ff37ac6720a943da91645c06274282ac46b71f23 - React-timing: 831d7e081ba4c332ca5cccf389b88e363f13f2b4 - React-utils: 25db6c17598c4fed22b5956d7551bb8bddf1f95b - React-webperformancenativemodule: 57e41e6193cfb815bde0b5534bef68673f1270eb - ReactAppDependencyProvider: bfb12ead469222b022a2024f32aba47ce50de512 - ReactCodegen: 9ca1bd49eee1eccf6e427e406d2163f49e9c48c0 - ReactCommon: 05ad684db7d88e194272ae26baddf6300e30b8b7 - ReactNativeHost: e7e0a518b0120f0070b3e1f13c7006d3e0e8ee13 - ReactTestApp-DevSupport: 6994b53b5b81139a8ce63e0776c726c95de079a1 + React-renderercss: f8cbf83d95c2c2bbf893d37fe50c73f046584411 + React-rendererdebug: 37216ddfcd38e49d1e92bf9052ea4bc9d7b932e5 + React-RuntimeApple: 1c0e7cb8e1c2c5775585afcaaa666ec151629a8d + React-RuntimeCore: 925fe2ca24cf8e6ed87586dbb92827306b93b83f + React-runtimeexecutor: 962dae024f6df760d029512a7d99e3f73d570935 + React-RuntimeHermes: 19a7c59ec1bc9908516f0bbc29b49425f6ec64ba + React-runtimescheduler: 62f21127cd97f4d8f164eee5150d3ce53dd36f66 + React-timing: 8757bf6fb96227c264f2d1609f4ba5c68217b8ce + React-utils: 8ab26781c2f5c2f7fafb2022c8ab39d39f231b80 + React-webperformancenativemodule: 7953b7fe519f76fa595111fe18ff3d5de131bfe9 + ReactAppDependencyProvider: 0eb286cc274abb059ee601b862ebddac2e681d01 + ReactCodegen: b8e56b780fffe6edd6405be0af4a1e3049a937f7 + ReactCommon: ac934cb340aee91282ecd6f273a26d24d4c55cae + ReactNativeHost: eef98ec49b55d88ad4cabf5a4378a12b42b551ee + ReactTestApp-DevSupport: ea18f446cff64b6c9a3e28788600c82ecf51bde6 ReactTestApp-Resources: 1bd9ff10e4c24f2ad87101a32023721ae923bccf - RNGestureHandler: 77eecab5fd636666ca73a55bb61e2f1a685b7e84 - RNReanimated: d1a7a4c20eefc371e062990ce1debeaff4f1b9be - RNScreens: b2a5c76af24a02a2fd71bfce42780fdd9c79cc6d - RNSVG: ea9cbf6dcdbebdfff5822b0ad9311bbc4510a0b7 - RNWorklets: 5f6e5664c1819eac103ca75cc2f36191f55aa110 + RNGestureHandler: cd4be101cfa17ea6bbd438710caa02e286a84381 + RNReanimated: c26dfcd831add485c2ed93de9d7bfb90b035eeaa + RNScreens: 714e10b6b554f7dc7ad9f78dcf36dc8e3fc73415 + RNSVG: 11354d28dd6cb71a59570b68c91ba6772a2d781d + RNWorklets: b89b501d37972e6419d6f87effe41d6d76157648 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 5bd0956bf9cb16f75101e78b5e852c7577bc5a45 + Yoga: 5456bb010373068fc92221140921b09d126b116e PODFILE CHECKSUM: d3796f1f719a0788265d1cd391be0a04200ce6cd -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/apps/example/package.json b/apps/example/package.json index bc2005a973..ad2fff4441 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -40,7 +40,7 @@ "react-native-screens": "^4.10.0", "react-native-svg": "patch:react-native-svg@npm%3A15.14.0#../../.yarn/patches/react-native-svg-npm-15.14.0-macos-uiimage-fix.patch", "react-native-web": "^0.21.2", - "react-native-webgpu": "0.8.0", + "react-native-webgpu": "0.10.0", "react-native-windows": "^0.75.0", "react-native-worklets": "0.8.3" }, diff --git a/externals/depot_tools b/externals/depot_tools index 6afa997717..36a8df4ad0 160000 --- a/externals/depot_tools +++ b/externals/depot_tools @@ -1 +1 @@ -Subproject commit 6afa997717b2c0e1382e1465bedbe1a6855b9388 +Subproject commit 36a8df4ad006eaa0572fb446edb8145fe5403592 diff --git a/externals/skia b/externals/skia index 2a9b593bab..9f9e6beb75 160000 --- a/externals/skia +++ b/externals/skia @@ -1 +1 @@ -Subproject commit 2a9b593bab4b2fd019fa494c8d401ff1fab0b883 +Subproject commit 9f9e6beb751091ef69163d2b4fdcd1e711b594ac diff --git a/packages/skia/cpp/rnskia/RNDawnContext.h b/packages/skia/cpp/rnskia/RNDawnContext.h index ac028fd255..3cb25c43ef 100644 --- a/packages/skia/cpp/rnskia/RNDawnContext.h +++ b/packages/skia/cpp/rnskia/RNDawnContext.h @@ -147,7 +147,8 @@ class DawnContext { vkBegin.newLayout = 0; beginAccessDesc.nextInChain = &vkBegin; #endif - bool success = memory.BeginAccess(texture, &beginAccessDesc); + bool success = + memory.BeginAccess(texture, &beginAccessDesc) == wgpu::Status::Success; if (success) { skgpu::graphite::BackendTexture betFromView = diff --git a/packages/skia/package.json b/packages/skia/package.json index 815dcb70bc..999c56c467 100644 --- a/packages/skia/package.json +++ b/packages/skia/package.json @@ -51,7 +51,6 @@ "clang-format-ios": "find apple/ -iname '*.h' -o -iname '*.mm' -o -iname '*.cpp' | xargs clang-format -i", "clang-format-android": "find android/cpp/ -iname '*.h' -o -iname '*.m' -o -iname '*.cpp' | xargs clang-format -i", "clang-format-common": "find cpp/ \\( -path 'cpp//skia' -prune \\) -o \\( -iname '*.h' -o -iname '*.m' -o -iname '*.cpp' \\) -print | xargs clang-format -i", - "workflow-copy-libs": "tsx ./scripts/workflow-copy-libs.ts", "cpplint": "cpplint --linelength=230 --filter=-legal/copyright,-whitespace/indent,-whitespace/comments,-whitespace/ending_newline,-build/include_order,-runtime/references,-readability/todo,-whitespace/blank_line,-whitespace/todo,-runtime/int,-build/c++11,-whitespace/parens --exclude=package/cpp/skia --exclude=package/ios --exclude=package/android/build --exclude=package/node_modules --recursive package" }, "repository": { @@ -116,6 +115,7 @@ "eslint-config-react-native-wcandillon": "4.0.1", "eslint-plugin-import": "2.32.0", "eslint-plugin-react-hooks": "^5.2.0", + "extract-zip": "^2.0.1", "jest": "30.0.0", "jest-diff": "29.7.0", "jest-environment-jsdom": "30.0.0", @@ -139,16 +139,16 @@ }, "dependencies": { "canvaskit-wasm": "0.41.0", - "react-native-skia-android": "152.0.0", - "react-native-skia-apple-ios": "152.0.0", - "react-native-skia-apple-macos": "152.0.0", - "react-native-skia-apple-tvos": "152.0.0", + "react-native-skia-android": "154.0.0", + "react-native-skia-apple-ios": "154.0.0", + "react-native-skia-apple-macos": "154.0.0", + "react-native-skia-apple-tvos": "154.0.0", "react-reconciler": "0.31.0" }, "graphiteDependencies": { - "react-native-skia-graphite-android": "152.0.0", - "react-native-skia-graphite-apple-ios": "152.0.0", - "react-native-skia-graphite-apple-macos": "152.0.0" + "react-native-skia-graphite-android": "154.0.0", + "react-native-skia-graphite-apple-ios": "154.0.0", + "react-native-skia-graphite-apple-macos": "154.0.0" }, "eslintIgnore": [ "node_modules/", diff --git a/packages/skia/scripts/install-skia-graphite.ts b/packages/skia/scripts/install-skia-graphite.ts index 6d2b0264a0..8464e3202f 100644 --- a/packages/skia/scripts/install-skia-graphite.ts +++ b/packages/skia/scripts/install-skia-graphite.ts @@ -15,53 +15,108 @@ import { existsSync, mkdirSync, readFileSync, - readdirSync, rmSync, writeFileSync, } from "fs"; import https from "https"; import path from "path"; +import extractZip from "extract-zip"; import { extract } from "tar"; import { copyHeaders } from "./skia-configuration"; import { fileOps } from "./utils"; +// The xcframeworks bundled for each Apple platform. Each one is published as +// its own .zip (SPM's binaryTarget requires one .xcframework per archive), so +// this list drives both the download loop below and, eventually, the +// per-framework binaryTargets in Package.swift. +const APPLE_FRAMEWORKS = [ + "libskia", + "libskottie", + "libskparagraph", + "libsksg", + "libskshaper", + "libskunicode_core", + "libskunicode_libgrapheme", + "libsvg", +] as const; + // Graphite configuration const GRAPHITE_CONFIG = { - version: "m152", + version: "m154", checksums: { - "android-armeabi-v7a": - "edc363fb63d3e629d7023d63d505c2d075030dfc40e04890d988eaff5c31c2fc", - "android-arm64-v8a": - "cefc18191d46deec3e164f3b717b06c6ae7845eeec21fe11cca53339063cf1e2", - "android-x86": - "78041f4d58fafda1821c96f83e4818cce492a7047b16f267527e3e140d0b4c0d", - "android-x86_64": - "8cfcd40b87b42aa0aaaba89852aa51f3316c90debcdf24dcc5a9b7b562a8aa6f", - "apple-ios-xcframeworks": - "9a64915dd95bf22ab3f38624ac2fc7e4a14cfd155f218170317ccef6ab9dfc69", - "apple-macos-xcframeworks": - "995cc77d575368d2df08a16ed0345395ba66308b00ba57ef190e70eb710d74f9", + android: { + "armeabi-v7a": + "2035f570a696da94ee73c1ac9fcdc3e86e128e0c022ea54b3d15a91aa6310382", + "arm64-v8a": + "adbb7179c8e4d743c6b5459902937b29568fe11c5926f04d7710b70c55587d42", + "x86": "cb0f02edbb469f3f0e26edb8f61d41c0a3b9878346df2908a192f1de18892a52", + "x86_64": + "51892783c32c23fb67e1db2eb74700cbb21f66ed9710d5dbc3c603cbf7f1174a", + }, + apple: { + ios: { + libskia: + "03c11d6891d9710f644f6a2108c494a1fe1a7b1105748686176fd7d9ae6cfa7e", + libskottie: + "f2bf18b9a3221661534764e5585ca8e2b82afeaeb9f88f1cd5177ffe7029550e", + libskparagraph: + "0f938255ab9f174af83f3cff56aa73235990154ea8d493c4bfc74ac94bffeb42", + libsksg: + "2ecb0c45a6822e5bfca0c78520273ac173a795c83a857fed775cd26d34b06950", + libskshaper: + "3c2553852cc94ba66537e3f5b923ecc4e77d3ec299ea875360bbfd72a0e375bf", + // eslint-disable-next-line camelcase + libskunicode_core: + "a6c42ec4cabf1e51c51d58490bc86904237fb37f5f2455119185882db05f62d2", + // eslint-disable-next-line camelcase + libskunicode_libgrapheme: + "2eac399778103b8b0ae653483bbd25d5cf4df6890bc5bf9db87d64b9e7e12215", + libsvg: + "3ce34cab4f82fa14da97a10eb497027af1bf59e210cde66e5f78af4a4c009cb7", + }, + macos: { + libskia: + "4077f56da97cec4462c0819201dda6c8fe5f375f1e3fcad2b1ddb44101ec857f", + libskottie: + "4d6bbf98f008993b28d327c16477ca4d0f6f9f60f7d6186814070ea4613b08e1", + libskparagraph: + "9b50c4fc121355564f5985b511a969f445e9e894c1d8594778c805355e674391", + libsksg: + "8303505887aaf3646933180953562a401935d5f2a2384819930b077fa56da801", + libskshaper: + "15339f4a5f4cab50e39d457ffb0d0a3c23ad552f0447a0d4404718600baeb260", + // eslint-disable-next-line camelcase + libskunicode_core: + "de677cdc80b76191dcbd199f1866d6b5b258cd9bf422ac8a8574492cf0a4a9cb", + // eslint-disable-next-line camelcase + libskunicode_libgrapheme: + "562daca2f2c26fbc35cbb3772429d61a4c40005768cc754f0bff4c2fc39f559a", + libsvg: + "0e4fb622a1ce003372a3a005ca3a5166659766046a13e9ab978e9a989d617845", + }, + } as Record< + "ios" | "macos", + Record<(typeof APPLE_FRAMEWORKS)[number], string> + >, }, } as const; // Dawn prebuilt binaries. These are the exact artifacts react-native-webgpu // links; both packages must consume the same Dawn build so that only one Dawn // copy exists in an app that installs both, which is why the release tag is -// pinned here rather than derived from GRAPHITE_CONFIG.version. -// -// STALE: this is still the m150 Dawn (63f25feec51e9351fb25222b6d5de1af791d7c4f) -// while m152's DEPS pins 1e897275172a23f27b0022fa6beae3084ed54a9b. Bump this to -// dawn-chrome-m152 (with new checksums) once react-native-webgpu publishes that -// release; until then Graphite installs pair m152 Skia with m150 Dawn. +// pinned here rather than derived from GRAPHITE_CONFIG.version. Skia's DEPS at +// chrome/m154 pins Dawn @ 3d786993a7ded64c4ebb4884b9b079db9ad0e580 - keep this +// tag aligned with whatever milestone react-native-webgpu's Package.swift +// pins (its dawnReleaseTag fatalError check enforces the match at build time). const DAWN_CONFIG = { - releaseTag: "dawn-chrome-m150", + releaseTag: "dawn-chrome-m154", baseUrl: "https://github.com/wcandillon/react-native-webgpu/releases/download", checksums: { - android: "dee507d4fe66b57f6d33c0dac8cfd1b1263fcd9a8997bfebf936b62341580e60", - apple: "5bacd90c56aa3144d8ba74ac2d769d28b28ebf99c67a4959185c7181d8aeaf31", + android: "6fe8766dc3711e1e41e8b9d919fadd83f0e364945e66c01f49f316f4a3d96b1f", + apple: "896575ffbc99610198a83d061f8c5a2789139b7f16c669fbf3a9f7a7ac9be123", }, } as const; @@ -189,6 +244,39 @@ const downloadAndExtract = async ( rmSync(tempFile, { force: true }); }; +// Download and extract a single-xcframework .zip asset (SPM-compatible +// packaging - see APPLE_FRAMEWORKS above) into destDir. +const downloadAndExtractZip = async ( + assetName: string, + destDir: string, + expectedChecksum: string, + urlOverride?: string +): Promise => { + const url = urlOverride ?? getDownloadUrl(assetName); + const tempFile = path.join(LIBS_DIR, `${assetName}.tmp`); + + console.log(` Downloading ${assetName}...`); + await downloadFile(url, tempFile); + + console.log(` Verifying checksum...`); + const actualChecksum = calculateFileChecksum(tempFile); + if (actualChecksum !== expectedChecksum) { + rmSync(tempFile, { force: true }); + throw new Error( + `Checksum mismatch for ${assetName}:\n` + + ` Expected: ${expectedChecksum}\n` + + ` Actual: ${actualChecksum}` + ); + } + console.log(` āœ“ Checksum verified`); + + console.log(` Extracting to ${destDir}...`); + mkdirSync(destDir, { recursive: true }); + await extractZip(tempFile, { dir: destDir }); + + rmSync(tempFile, { force: true }); +}; + // Checkout the Skia submodule to the correct branch const checkoutSkiaSubmodule = (): void => { const baseVersion = getBaseVersion(GRAPHITE_CONFIG.version); @@ -276,9 +364,10 @@ const downloadAndroidLibs = async (): Promise => { const releaseTag = getReleaseTag(GRAPHITE_CONFIG.version); for (const abi of androidAbis) { - const checksumKey = - `android-${abi.name}` as keyof typeof GRAPHITE_CONFIG.checksums; - const expectedChecksum = GRAPHITE_CONFIG.checksums[checksumKey]; + const expectedChecksum = + GRAPHITE_CONFIG.checksums.android[ + abi.name as keyof typeof GRAPHITE_CONFIG.checksums.android + ]; const assetName = `skia-graphite-${abi.asset}-${releaseTag}.tar.gz`; const destDir = path.join(LIBS_DIR, "android", abi.name); @@ -334,10 +423,12 @@ const downloadDawnLibs = async (): Promise => { rmSync(androidTempDir, { recursive: true, force: true }); // Apple: one xcframework carrying ios-device, ios-simulator and macos - // slices; the podspec vendors it from both platform dirs - const appleAsset = `dawn-apple-${DAWN_CONFIG.releaseTag}.xcframework.tar.gz`; + // slices; the podspec vendors it from both platform dirs. Published as a + // .zip (not .tar.gz) since it's the same SPM-compatible artifact + // react-native-webgpu's Package.swift binaryTarget links. + const appleAsset = `dawn-apple-${DAWN_CONFIG.releaseTag}.xcframework.zip`; const appleTempDir = path.join(LIBS_DIR, "dawn-apple-temp"); - await downloadAndExtract( + await downloadAndExtractZip( appleAsset, appleTempDir, DAWN_CONFIG.checksums.apple, @@ -357,59 +448,46 @@ const downloadDawnLibs = async (): Promise => { console.log(` āœ“ Dawn libraries downloaded`); }; -// Download Apple libraries -const downloadAppleLibs = async (): Promise => { - console.log(`\nšŸŽ Downloading Apple Graphite libraries...`); - +// Download Apple libraries. Each xcframework is published as its own zip +// (see APPLE_FRAMEWORKS), named +// `skia-graphite-apple--xcframeworks--.zip`. +const downloadApplePlatformLibs = async ( + platform: "ios" | "macos", + artifactPrefix: string +): Promise => { const releaseTag = getReleaseTag(GRAPHITE_CONFIG.version); - const iosDir = path.join(LIBS_DIR, "ios"); - const macosDir = path.join(LIBS_DIR, "macos"); - - // Clean and create destination directories - fileOps.rm(iosDir); - fileOps.rm(macosDir); - fileOps.mkdir(iosDir); - fileOps.mkdir(macosDir); - - // Download iOS xcframeworks - const iosAsset = `skia-graphite-apple-ios-xcframeworks-${releaseTag}.tar.gz`; - const iosTempDir = path.join(LIBS_DIR, "apple-ios-temp"); - await downloadAndExtract( - iosAsset, - iosTempDir, - GRAPHITE_CONFIG.checksums["apple-ios-xcframeworks"] - ); + const destDir = path.join(LIBS_DIR, platform); + fileOps.rm(destDir); + fileOps.mkdir(destDir); - const extractedIosDir = path.join(iosTempDir, "ios"); - if (existsSync(extractedIosDir)) { - const xcframeworks = readdirSync(extractedIosDir).filter( - (f) => f.endsWith(".xcframework") && f !== "libdawn_combined.xcframework" - ); - for (const xcf of xcframeworks) { - fileOps.cp(path.join(extractedIosDir, xcf), path.join(iosDir, xcf)); - } - } - rmSync(iosTempDir, { recursive: true, force: true }); + const checksums = GRAPHITE_CONFIG.checksums.apple[platform]; + for (const framework of APPLE_FRAMEWORKS) { + const assetName = `${artifactPrefix}-${framework}-${releaseTag}.zip`; + const tempDir = path.join(LIBS_DIR, `apple-${platform}-${framework}-temp`); - // Download macOS xcframeworks - const macosAsset = `skia-graphite-apple-macos-xcframeworks-${releaseTag}.tar.gz`; - const macosTempDir = path.join(LIBS_DIR, "apple-macos-temp"); - await downloadAndExtract( - macosAsset, - macosTempDir, - GRAPHITE_CONFIG.checksums["apple-macos-xcframeworks"] - ); + await downloadAndExtractZip(assetName, tempDir, checksums[framework]); - const extractedMacosDir = path.join(macosTempDir, "macos"); - if (existsSync(extractedMacosDir)) { - const xcframeworks = readdirSync(extractedMacosDir).filter( - (f) => f.endsWith(".xcframework") && f !== "libdawn_combined.xcframework" - ); - for (const xcf of xcframeworks) { - fileOps.cp(path.join(extractedMacosDir, xcf), path.join(macosDir, xcf)); + const xcfName = `${framework}.xcframework`; + const extracted = path.join(tempDir, xcfName); + if (!existsSync(extracted)) { + throw new Error(`Missing ${xcfName} in ${assetName}`); } + fileOps.cp(extracted, path.join(destDir, xcfName)); + rmSync(tempDir, { recursive: true, force: true }); } - rmSync(macosTempDir, { recursive: true, force: true }); +}; + +const downloadAppleLibs = async (): Promise => { + console.log(`\nšŸŽ Downloading Apple Graphite libraries...`); + + await downloadApplePlatformLibs( + "ios", + "skia-graphite-apple-ios-xcframeworks" + ); + await downloadApplePlatformLibs( + "macos", + "skia-graphite-apple-macos-xcframeworks" + ); console.log(` āœ“ Apple libraries downloaded`); }; diff --git a/packages/skia/scripts/skia-configuration.ts b/packages/skia/scripts/skia-configuration.ts index ccbb9de98a..f7941cb9e1 100644 --- a/packages/skia/scripts/skia-configuration.ts +++ b/packages/skia/scripts/skia-configuration.ts @@ -502,6 +502,12 @@ export const copyHeaders = () => { "../../externals/skia/third_party/externals/dawn/include", "./cpp/dawn/include" ); + // Dawn's cmake build (as of the Dawn revision pinned at chrome/m154) + // also generates a webgpu_upstream/ copy of webgpu_cpp.h and friends + // under its own path. Nothing in this repo or react-native-webgpu + // includes from webgpu_upstream/, and leaving it in trips the + // duplicate-header check below (same basenames as dawn/ and webgpu/). + fileOps.rm("./cpp/dawn/include/webgpu_upstream"); console.log(" - Fixing WebGPU header references..."); // Fix WebGPU header references diff --git a/packages/skia/scripts/workflow-copy-libs.ts b/packages/skia/scripts/workflow-copy-libs.ts deleted file mode 100644 index a7d8417a60..0000000000 --- a/packages/skia/scripts/workflow-copy-libs.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { existsSync, writeFileSync } from "fs"; - -import { ensureFolderExists, copyRecursiveSync } from "./utils"; -import { GRAPHITE } from "./skia-configuration"; -/** - * This build script prepares the npm build command by copying - * the Skia Binaries from the artifact folder into the libs folder - * in the checkout directory. This build script is run by the - * build-npm.yml workflow and does not require anything. - */ - -console.log("Copying Skia Binaries from artifacts to libs folder"); - -const suffix = GRAPHITE ? "-graphite" : ""; -const sources = [ - `./skia${suffix}-android-arm`, - `./skia${suffix}-android-arm-64`, - `./skia${suffix}-android-arm-x86`, - `./skia${suffix}-android-arm-x64`, -]; - -const destinations = ["armeabi-v7a", "arm64-v8a", "x86", "x86_64"]; - -const androidFiles = [ - "libskia.a", - "libskshaper.a", - "libsvg.a", - "libskottie.a", - "libsksg.a", - "libskparagraph.a", - "libskunicode_core.a", - "libskunicode_icu.a", - "libjsonreader.a", - // Dawn library for Graphite builds - ...(GRAPHITE ? ["libdawn_combined.a"] : []), -]; - -const appleFiles = [ - "libskia.xcframework", - "libskshaper.xcframework", - "libsvg.xcframework", - "libskottie.xcframework", - "libsksg.xcframework", - "libskparagraph.xcframework", - "libskunicode_core.xcframework", - "libskunicode_libgrapheme.xcframework", - // Dawn library for Graphite builds - ...(GRAPHITE ? ["libdawn_combined.xcframework"] : []), -]; - -const copyFiles = (from: string, to: string, files: string[]) => { - ensureFolderExists(to); - files.forEach((f) => { - const source = "./artifacts/" + from + "/" + f; - const target = to + "/" + f; - if (!existsSync(source)) { - console.log( - "Copying failed, the artifact source", - source, - "was not found. Current dir is:", - process.cwd() - ); - process.exit(1); - } - if (!existsSync(to)) { - console.log( - "Copying failed, the destination", - to, - "was not found. Current dir is:", - process.cwd() - ); - process.exit(1); - } - copyRecursiveSync(source, target); - console.log("Copied", source, target); - }); -}; - -console.log("Copying android files..."); -destinations.forEach((d, i) => { - copyFiles(sources[i], "./libs/android/" + d, androidFiles); -}); - -console.log("Copying Apple files..."); -copyFiles(`skia${suffix}-apple-ios-xcframeworks`, "./libs/ios", appleFiles); -copyFiles(`skia${suffix}-apple-macos-xcframeworks`, "./libs/macos", appleFiles); - -if (GRAPHITE) { - writeFileSync("./libs/.graphite", ""); - console.log("Created libs/.graphite marker file"); -} - -// Copy skia-headers and skia-graphite-headers artifacts to ./cpp/ -if (GRAPHITE) { - [`skia${suffix}-headers`].forEach((headerArtifact) => { - const source = `./artifacts/${headerArtifact}`; - const target = "./cpp"; - if (existsSync(source)) { - copyRecursiveSync(source, target); - console.log(`Copied headers from ${source} to ${target}`); - } else { - console.log(`Header artifact ${source} not found, skipping.`); - } - }); -} - -console.log("Done copying artifacts."); diff --git a/yarn.lock b/yarn.lock index ed7bb4e259..940a9f859e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9091,6 +9091,7 @@ __metadata: eslint-config-react-native-wcandillon: 4.0.1 eslint-plugin-import: 2.32.0 eslint-plugin-react-hooks: ^5.2.0 + extract-zip: ^2.0.1 jest: 30.0.0 jest-diff: 29.7.0 jest-environment-jsdom: 30.0.0 @@ -9102,10 +9103,10 @@ __metadata: react-native: 0.83.1 react-native-builder-bob: 0.18.2 react-native-reanimated: 4.3.1 - react-native-skia-android: 152.0.0 - react-native-skia-apple-ios: 152.0.0 - react-native-skia-apple-macos: 152.0.0 - react-native-skia-apple-tvos: 152.0.0 + react-native-skia-android: 154.0.0 + react-native-skia-apple-ios: 154.0.0 + react-native-skia-apple-macos: 154.0.0 + react-native-skia-apple-tvos: 154.0.0 react-native-worklets: 0.8.3 react-reconciler: 0.31.0 rimraf: 3.0.2 @@ -16339,7 +16340,7 @@ __metadata: react-native-svg: "patch:react-native-svg@npm%3A15.14.0#../../.yarn/patches/react-native-svg-npm-15.14.0-macos-uiimage-fix.patch" react-native-test-app: 4.4.7 react-native-web: ^0.21.2 - react-native-webgpu: 0.8.0 + react-native-webgpu: 0.10.0 react-native-windows: ^0.75.0 react-native-worklets: 0.8.3 react-test-renderer: 19.0.0 @@ -16589,7 +16590,7 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:2.0.1": +"extract-zip@npm:2.0.1, extract-zip@npm:^2.0.1": version: 2.0.1 resolution: "extract-zip@npm:2.0.1" dependencies: @@ -27158,31 +27159,31 @@ __metadata: languageName: node linkType: hard -"react-native-skia-android@npm:152.0.0": - version: 152.0.0 - resolution: "react-native-skia-android@npm:152.0.0" - checksum: c01ae79040ea04997340861828d79fb4591ad922a50a94cbcdb1b4d7f4e7fa1ad9a892cdb87f40a059489350cb2cfdd647448570d109dcab25342d9d287d1bbc +"react-native-skia-android@npm:154.0.0": + version: 154.0.0 + resolution: "react-native-skia-android@npm:154.0.0" + checksum: 7428991fc10e5d489a17f5049579b3ac31e949a070ecbcd3b2bbcefdce43c137eb749ab5ecf08cd36c2f03828a893ab00499f994a1c6f2224f798a473471e818 languageName: node linkType: hard -"react-native-skia-apple-ios@npm:152.0.0": - version: 152.0.0 - resolution: "react-native-skia-apple-ios@npm:152.0.0" - checksum: 42ef9929664d197eaf1116e172573ad1ed68944b7349ee692bb542761fd4aa6d171d23a293ee64b0a1f0d0bf3c6cd2f1f32ef8bda2b4dd1749466af5f25dd8a3 +"react-native-skia-apple-ios@npm:154.0.0": + version: 154.0.0 + resolution: "react-native-skia-apple-ios@npm:154.0.0" + checksum: b627209b8bcd747238cb39d605527ad46569988aab6e025ac2118455031c98cf7da30a3da5af1295ba824336a322a99f46baa6e870f9452e623f430619143baf languageName: node linkType: hard -"react-native-skia-apple-macos@npm:152.0.0": - version: 152.0.0 - resolution: "react-native-skia-apple-macos@npm:152.0.0" - checksum: d8e220ce0ac0f41c35916c5b416cbdb6436ad4189884a70524949949df8990a43c5d116865932dd244dad412e77cab368f3f820e1400b3bd00736ee37435810b +"react-native-skia-apple-macos@npm:154.0.0": + version: 154.0.0 + resolution: "react-native-skia-apple-macos@npm:154.0.0" + checksum: be282528ca301cc69e7d94505cd0e8dc051eb22e1b69c15c4b5721bca18b9330c6c06bbf548a3d309150e7dd41d3118bef7d318a6664a2c367587f6fc778d8d9 languageName: node linkType: hard -"react-native-skia-apple-tvos@npm:152.0.0": - version: 152.0.0 - resolution: "react-native-skia-apple-tvos@npm:152.0.0" - checksum: ae80993eb127b5ee4502b0428204b980347d6cf31444de74984ae64373e1bc4a992b79ddae0aa9983cd3a6e5b979ae5d810f88eca92976b40907fdb578b508d5 +"react-native-skia-apple-tvos@npm:154.0.0": + version: 154.0.0 + resolution: "react-native-skia-apple-tvos@npm:154.0.0" + checksum: 8dcee573d91be4ddfc47112d0098840854c1c21fc0e5190f1d8f4495d0c2c86b3168c2070a089c3072ed6a5e5fa2639de60b7772ddb8f9993e1e93007e1409c3 languageName: node linkType: hard @@ -27337,9 +27338,9 @@ __metadata: languageName: node linkType: hard -"react-native-webgpu@npm:0.8.0": - version: 0.8.0 - resolution: "react-native-webgpu@npm:0.8.0" +"react-native-webgpu@npm:0.10.0": + version: 0.10.0 + resolution: "react-native-webgpu@npm:0.10.0" peerDependencies: react: "*" react-native: ">=0.81.0" @@ -27350,7 +27351,7 @@ __metadata: optional: true react-native-worklets: optional: true - checksum: 75a850ebf19d57395ca1b4ba7d4f6f24ff203e047c99493d1a3d4fbb4bbb08308a573ead0e2c88ef5de367d355e576d181b9513fb6cec93ab77e548211976c0c + checksum: eba53c650302110f8a84dc3041b4e5098adf68062e3dc98fff2094313d1dccdd15b89873dc131110eabf464c3124d83be9411fc37e18a726d6ef975080e46724 languageName: node linkType: hard