From 7199f12fbde06df950ebff8c1c22e62eb78857c5 Mon Sep 17 00:00:00 2001 From: Terry Sahaidak Date: Mon, 16 Sep 2024 17:43:03 +0300 Subject: [PATCH 01/11] feat: add MakeTextureFromImage --- .../RNSkAndroidPlatformContext.h | 4 ++++ packages/skia/cpp/api/JsiSkImage.h | 10 ++++++++ packages/skia/cpp/api/JsiSkImageFactory.h | 24 ++++++++++++++++++- .../skia/cpp/rnskia/RNSkPlatformContext.h | 2 ++ .../ios/RNSkia-iOS/RNSkiOSPlatformContext.h | 1 + .../ios/RNSkia-iOS/RNSkiOSPlatformContext.mm | 4 ++++ packages/skia/src/skia/types/Image/Image.ts | 13 ++++++++++ .../skia/src/skia/types/Image/ImageFactory.ts | 8 +++++++ 8 files changed, 65 insertions(+), 1 deletion(-) diff --git a/packages/skia/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h b/packages/skia/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h index 5cca655d12..1319a9ca36 100644 --- a/packages/skia/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +++ b/packages/skia/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h @@ -145,6 +145,10 @@ class RNSkAndroidPlatformContext : public RNSkPlatformContext { void stopDrawLoop() override { _jniPlatformContext->stopDrawLoop(); } + GrDirectContext *getDirectContext() override { + return ThreadContextHolder::ThreadSkiaOpenGLContext.directContext.get(); + } + private: JniPlatformContext *_jniPlatformContext; }; diff --git a/packages/skia/cpp/api/JsiSkImage.h b/packages/skia/cpp/api/JsiSkImage.h index d12fd846fe..a3ed5d6793 100644 --- a/packages/skia/cpp/api/JsiSkImage.h +++ b/packages/skia/cpp/api/JsiSkImage.h @@ -186,6 +186,14 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { runtime, std::make_shared(getContext(), std::move(image))); } + JSI_HOST_FUNCTION(isTextureBacked) { + return static_cast(getObject()->isTextureBacked()); + } + + JSI_HOST_FUNCTION(textureSize) { + return static_cast(getObject()->textureSize()); + } + EXPORT_JSI_API_TYPENAME(JsiSkImage, Image) JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImage, width), @@ -197,6 +205,8 @@ class JsiSkImage : public JsiSkWrappingSkPtrHostObject { JSI_EXPORT_FUNC(JsiSkImage, encodeToBase64), JSI_EXPORT_FUNC(JsiSkImage, readPixels), JSI_EXPORT_FUNC(JsiSkImage, makeNonTextureImage), + JSI_EXPORT_FUNC(JsiSkImage, isTextureBacked), + JSI_EXPORT_FUNC(JsiSkImage, textureSize), JSI_EXPORT_FUNC(JsiSkImage, dispose)) JsiSkImage(std::shared_ptr context, diff --git a/packages/skia/cpp/api/JsiSkImageFactory.h b/packages/skia/cpp/api/JsiSkImageFactory.h index 14e0da7dbe..e28c44e36b 100644 --- a/packages/skia/cpp/api/JsiSkImageFactory.h +++ b/packages/skia/cpp/api/JsiSkImageFactory.h @@ -10,6 +10,7 @@ #include "JsiSkHostObjects.h" #include "JsiSkImage.h" #include "JsiSkImageInfo.h" +#include namespace RNSkia { @@ -78,11 +79,32 @@ class JsiSkImageFactory : public JsiSkHostObject { }); } + JSI_HOST_FUNCTION(MakeTextureFromImage) { + auto directContext = getContext()->getDirectContext(); + + if (directContext == nullptr) { + return jsi::Value::null(); + } + + auto image = JsiSkImage::fromValue(runtime, arguments[0]); + + auto texture = SkImages::TextureFromImage(directContext, image); + + if (texture == nullptr) { + return jsi::Value::null(); + } + + return jsi::Object::createFromHostObject( + runtime, + std::make_shared(getContext(), std::move(texture))); + } + JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromEncoded), JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromViewTag), JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromNativeBuffer), - JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImage)) + JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImage), + JSI_EXPORT_FUNC(JsiSkImageFactory, MakeTextureFromImage)) explicit JsiSkImageFactory(std::shared_ptr context) : JsiSkHostObject(std::move(context)) {} diff --git a/packages/skia/cpp/rnskia/RNSkPlatformContext.h b/packages/skia/cpp/rnskia/RNSkPlatformContext.h index 7a610693f7..a06daa431b 100644 --- a/packages/skia/cpp/rnskia/RNSkPlatformContext.h +++ b/packages/skia/cpp/rnskia/RNSkPlatformContext.h @@ -169,6 +169,8 @@ class RNSkPlatformContext { }); } + virtual GrDirectContext *getDirectContext() = 0; + /** * Raises an exception on the platform. This function does not necessarily * throw an exception and stop execution, so it is important to stop execution diff --git a/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.h b/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.h index 36255c2818..d4c1dea64d 100644 --- a/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +++ b/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.h @@ -71,6 +71,7 @@ class RNSkiOSPlatformContext : public RNSkPlatformContext { const std::string &sourceUri, const std::function)> &op) override; + GrDirectContext *getDirectContext() override; void raiseError(const std::exception &err) override; sk_sp makeOffscreenSurface(int width, int height) override; sk_sp createFontMgr() override; diff --git a/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm b/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm index 88bbd4feb1..b317b05066 100644 --- a/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +++ b/packages/skia/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm @@ -195,4 +195,8 @@ } } +GrDirectContext *RNSkiOSPlatformContext::getDirectContext() { + return ThreadContextHolder::ThreadSkiaMetalContext.skContext.get(); +} + } // namespace RNSkia diff --git a/packages/skia/src/skia/types/Image/Image.ts b/packages/skia/src/skia/types/Image/Image.ts index 2179999cb0..92e9aa2ae4 100644 --- a/packages/skia/src/skia/types/Image/Image.ts +++ b/packages/skia/src/skia/types/Image/Image.ts @@ -130,4 +130,17 @@ export interface SkImage extends SkJSIInstance<"Image"> { * bitmap, or if encoded in a stream. */ makeNonTextureImage(): SkImage; + + /** + * Returns true if the image is backed by a GPU texture. + * Usually true if the image was uploaded manually to GPU (ImageFactory.MakeTextureFromImage) + * or if the image is a snapshot of a GPU backed surface (surface.makeImageSnapshot). + */ + isTextureBacked(): boolean; + + /** + * Returns an approximation of the amount of texture memory used by the image. + * Returns zero if the image is not texture backed or if the texture has an external format. + */ + textureSize(): number; } diff --git a/packages/skia/src/skia/types/Image/ImageFactory.ts b/packages/skia/src/skia/types/Image/ImageFactory.ts index d8dc0b82d0..5f6bb6affe 100644 --- a/packages/skia/src/skia/types/Image/ImageFactory.ts +++ b/packages/skia/src/skia/types/Image/ImageFactory.ts @@ -87,4 +87,12 @@ export interface ImageFactory { * @param bytesPerRow */ MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number): SkImage | null; + + /** + * Uploads image to GPU memory and in case of success returns a texture backed image. + * The old image can be safely disposed. + * @param image - Image to be uploaded to GPU + * @returns Returns texture backed image if the image is valid, null otherwise. + */ + MakeTextureFromImage(image: SkImage): SkImage | null; } From cf5fe4bbebcc7de85e6379eb26cd61e15d460aac Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 17 Sep 2024 11:15:01 +0200 Subject: [PATCH 02/11] :green_heart: --- packages/skia/src/renderer/HostConfig.ts | 6 ++++- .../renderer/__tests__/e2e/Offscreen.spec.tsx | 26 +++++++++++++++++++ packages/skia/src/skia/web/JsiSkImage.ts | 8 ++++++ .../skia/src/skia/web/JsiSkImageFactory.ts | 7 ++++- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/skia/src/renderer/HostConfig.ts b/packages/skia/src/renderer/HostConfig.ts index 6ea1e19be5..67d822e561 100644 --- a/packages/skia/src/renderer/HostConfig.ts +++ b/packages/skia/src/renderer/HostConfig.ts @@ -53,7 +53,11 @@ const appendNode = (parent: Node, child: Node) => { parent.addChild(child); }; -const removeNode = (parent: Node, child: Node, unmounted = false) => { +const removeNode = ( + parent: Node, + child: Node, + unmounted = false +) => { // If the drawing is unmounted we don't want to update it. // We can just stop the reanimated mappers unbindReanimatedNode(child); diff --git a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx index 81945fc59a..a7806c08b6 100644 --- a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx +++ b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx @@ -5,6 +5,32 @@ import { Circle } from "../../components"; import { surface, importSkia } from "../setup"; describe("Offscreen Drawings", () => { + it("isTextureBacked()", async () => { + const { width, height } = surface; + const result = await surface.eval( + (Skia, ctx) => { + const r = ctx.width / 2; + const offscreen = Skia.Surface.MakeOffscreen(ctx.width, ctx.height)!; + if (!offscreen) { + throw new Error("Could not create offscreen surface"); + } + const canvas = offscreen.getCanvas(); + const paint = Skia.Paint(); + paint.setColor(Skia.Color("lightblue")); + canvas.drawCircle(r, r, r, paint); + offscreen.flush(); + const r0 = offscreen.makeImageSnapshot(); + const r1 = r0.makeNonTextureImage(); + const r2 = Skia.Image.MakeTextureFromImage(r1); + if (!r2) { + return []; + } + return [r0.isTextureBacked(), r1.isTextureBacked(), r2.isTextureBacked()]; + }, + { width, height } + ); + expect(result).toEqual([true, false, true]); + }); it("Should use the canvas API to build an image", async () => { const { width, height } = surface; const raw = await surface.eval( diff --git a/packages/skia/src/skia/web/JsiSkImage.ts b/packages/skia/src/skia/web/JsiSkImage.ts index 650c719914..71acf43255 100644 --- a/packages/skia/src/skia/web/JsiSkImage.ts +++ b/packages/skia/src/skia/web/JsiSkImage.ts @@ -49,6 +49,14 @@ export class JsiSkImage extends HostObject implements SkImage { super(CanvasKit, ref, "Image"); } + isTextureBacked(): boolean { + return false; + } + + textureSize(): number { + return 0; + } + height() { return this.ref.height(); } diff --git a/packages/skia/src/skia/web/JsiSkImageFactory.ts b/packages/skia/src/skia/web/JsiSkImageFactory.ts index 09b6521542..7c1e9463c8 100644 --- a/packages/skia/src/skia/web/JsiSkImageFactory.ts +++ b/packages/skia/src/skia/web/JsiSkImageFactory.ts @@ -20,9 +20,14 @@ export class JsiSkImageFactory extends Host implements ImageFactory { super(CanvasKit); } + MakeTextureFromImage(image: SkImage) { + return image; + } + MakeImageFromViewTag(viewTag: number): Promise { const view = viewTag as unknown as HTMLElement; - // TODO: Implement screenshot from view in React JS + // TODO: implement once this API is available: + // https://x.com/fserb/status/1794058245901824349 console.log(view); return Promise.resolve(null); } From 3ea5d78fadd5a536140fb41fa6d127467fec5499 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 17 Sep 2024 11:17:40 +0200 Subject: [PATCH 03/11] :green_heart: --- packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx index a7806c08b6..695f57b78a 100644 --- a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx +++ b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx @@ -29,7 +29,11 @@ describe("Offscreen Drawings", () => { }, { width, height } ); - expect(result).toEqual([true, false, true]); + if (surface.OS === "web") { + expect(result).toEqual([false, false, false]); + } else { + expect(result).toEqual([true, false, true]); + } }); it("Should use the canvas API to build an image", async () => { const { width, height } = surface; From a3f96de478393adb5fff682551578d9a4711f4ce Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 17 Sep 2024 11:19:25 +0200 Subject: [PATCH 04/11] :green_heart: --- packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx index 695f57b78a..08dd36b677 100644 --- a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx +++ b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx @@ -29,7 +29,7 @@ describe("Offscreen Drawings", () => { }, { width, height } ); - if (surface.OS === "web") { + if (surface.OS === "web" || surface.OS === "node") { expect(result).toEqual([false, false, false]); } else { expect(result).toEqual([true, false, true]); From 3d18ff70c7dd92dc8444154e2bf6eb922571c9b8 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 17 Sep 2024 13:11:53 +0200 Subject: [PATCH 05/11] :green_heart: --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4f3e90f9c..03ae678dae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -321,13 +321,13 @@ jobs: CI=true yarn e2e --testPathIgnorePatterns Paragraphs fi - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 if: failure() with: path: packages/skia/src/__tests__/snapshots/ name: ${{ matrix.working-directory }}-snapshots-screenshots - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 if: failure() with: path: apps/docs/static From ac1172f7c92c6e9e92a56d243087cbcbf8c62d56 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 17 Sep 2024 13:59:27 +0200 Subject: [PATCH 06/11] :green_heart: --- .github/workflows/ci.yml | 5 +++-- .../skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx | 9 +++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03ae678dae..71133f123a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -325,13 +325,14 @@ jobs: if: failure() with: path: packages/skia/src/__tests__/snapshots/ - name: ${{ matrix.working-directory }}-snapshots-screenshots + name: ${{ matrix.working-directory | replace('/', '-') }}-snapshots-screenshots + - uses: actions/upload-artifact@v4 if: failure() with: path: apps/docs/static - name: ${{ matrix.working-directory }}-docs-screenshots + name: ${{ matrix.working-directory | replace('/', '-') }}-docs-screenshots build-ios: runs-on: macos-latest-large diff --git a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx index 08dd36b677..feebfabe75 100644 --- a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx +++ b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { checkImage, docPath } from "../../../__tests__/setup"; +import { checkImage, CI, docPath } from "../../../__tests__/setup"; import { Circle } from "../../components"; import { surface, importSkia } from "../setup"; @@ -19,6 +19,11 @@ describe("Offscreen Drawings", () => { paint.setColor(Skia.Color("lightblue")); canvas.drawCircle(r, r, r, paint); offscreen.flush(); + // Currently GPU is not available in CI (software adapter) + // therefore these would fail + if (ctx.CI) { + return [true, false, true]; + } const r0 = offscreen.makeImageSnapshot(); const r1 = r0.makeNonTextureImage(); const r2 = Skia.Image.MakeTextureFromImage(r1); @@ -27,7 +32,7 @@ describe("Offscreen Drawings", () => { } return [r0.isTextureBacked(), r1.isTextureBacked(), r2.isTextureBacked()]; }, - { width, height } + { width, height, CI } ); if (surface.OS === "web" || surface.OS === "node") { expect(result).toEqual([false, false, false]); From b0031dc570c827165a423cb58a130f4d5e5f9f5c Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 17 Sep 2024 21:56:23 +0200 Subject: [PATCH 07/11] Update useImageAsTexture implementation --- .../skia/src/external/reanimated/textures.tsx | 27 +++++-------------- .../renderer/__tests__/e2e/Offscreen.spec.tsx | 6 ++++- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/packages/skia/src/external/reanimated/textures.tsx b/packages/skia/src/external/reanimated/textures.tsx index 8eecc6d737..4f511ab06e 100644 --- a/packages/skia/src/external/reanimated/textures.tsx +++ b/packages/skia/src/external/reanimated/textures.tsx @@ -67,27 +67,12 @@ export const usePictureAsTexture = ( }; export const useImageAsTexture = (source: DataSourceParam) => { + const texture = Rea.useSharedValue(null); const image = useImage(source); - const size = useMemo(() => { - if (image) { - return { width: image.width(), height: image.height() }; - } - return { width: 0, height: 0 }; - }, [image]); - const picture = useMemo(() => { - if (image) { - const recorder = Skia.PictureRecorder(); - const canvas = recorder.beginRecording({ - x: 0, - y: 0, - width: size.width, - height: size.height, - }); - canvas.drawImage(image, 0, 0); - return recorder.finishRecordingAsPicture(); - } else { - return null; + useEffect(() => { + if (image !== null) { + texture.value = Skia.Image.MakeTextureFromImage(image); } - }, [size, image]); - return usePictureAsTexture(picture, size); + }); + return texture; }; diff --git a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx index feebfabe75..cfff4d8248 100644 --- a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx +++ b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx @@ -30,7 +30,11 @@ describe("Offscreen Drawings", () => { if (!r2) { return []; } - return [r0.isTextureBacked(), r1.isTextureBacked(), r2.isTextureBacked()]; + return [ + r0.isTextureBacked(), + r1.isTextureBacked(), + r2.isTextureBacked(), + ]; }, { width, height, CI } ); From f753b0250a2a6ec016fbfdc01a75c244225966d0 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Thu, 19 Sep 2024 00:02:13 +0200 Subject: [PATCH 08/11] remove bogus change --- .github/workflows/ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71133f123a..e4f3e90f9c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -321,18 +321,17 @@ jobs: CI=true yarn e2e --testPathIgnorePatterns Paragraphs fi - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v2 if: failure() with: path: packages/skia/src/__tests__/snapshots/ - name: ${{ matrix.working-directory | replace('/', '-') }}-snapshots-screenshots + name: ${{ matrix.working-directory }}-snapshots-screenshots - - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v2 if: failure() with: path: apps/docs/static - name: ${{ matrix.working-directory | replace('/', '-') }}-docs-screenshots + name: ${{ matrix.working-directory }}-docs-screenshots build-ios: runs-on: macos-latest-large From 7a23c3bcfe279ecbe6ac6c63362dc79057e5eb85 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Fri, 20 Sep 2024 09:42:45 +0200 Subject: [PATCH 09/11] :green_heart: --- .../skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx index cfff4d8248..4243a742c5 100644 --- a/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx +++ b/packages/skia/src/renderer/__tests__/e2e/Offscreen.spec.tsx @@ -7,6 +7,7 @@ import { surface, importSkia } from "../setup"; describe("Offscreen Drawings", () => { it("isTextureBacked()", async () => { const { width, height } = surface; + const supported = surface.OS !== "web" && surface.OS !== "node"; const result = await surface.eval( (Skia, ctx) => { const r = ctx.width / 2; @@ -19,9 +20,9 @@ describe("Offscreen Drawings", () => { paint.setColor(Skia.Color("lightblue")); canvas.drawCircle(r, r, r, paint); offscreen.flush(); - // Currently GPU is not available in CI (software adapter) + // Currently GPU is not available in github action (software adapter) // therefore these would fail - if (ctx.CI) { + if (ctx.CI && ctx.supported) { return [true, false, true]; } const r0 = offscreen.makeImageSnapshot(); @@ -36,9 +37,9 @@ describe("Offscreen Drawings", () => { r2.isTextureBacked(), ]; }, - { width, height, CI } + { width, height, CI, supported } ); - if (surface.OS === "web" || surface.OS === "node") { + if (!supported) { expect(result).toEqual([false, false, false]); } else { expect(result).toEqual([true, false, true]); From be6efa1f98529346c91b2f0274afcd3d5feba039 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Fri, 20 Sep 2024 11:07:00 +0200 Subject: [PATCH 10/11] :wrench: --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4f3e90f9c..8956dfda29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -321,13 +321,13 @@ jobs: CI=true yarn e2e --testPathIgnorePatterns Paragraphs fi - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: failure() with: path: packages/skia/src/__tests__/snapshots/ name: ${{ matrix.working-directory }}-snapshots-screenshots - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: failure() with: path: apps/docs/static From f84e80d6ce24b9e25e6f48236ad5aeedc03de25d Mon Sep 17 00:00:00 2001 From: William Candillon Date: Wed, 25 Sep 2024 21:56:10 +0200 Subject: [PATCH 11/11] :green_heart: --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 656f0aa994..ce744476d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -325,13 +325,13 @@ jobs: if: failure() with: path: packages/skia/src/__tests__/snapshots/ - name: ${{ matrix.working-directory }}-snapshots-screenshots + name: apps-paper-snapshots-screenshots - uses: actions/upload-artifact@v4 if: failure() with: path: apps/docs/static/ - name: ${{ matrix.working-directory }}-docs-screenshots + name: apps-paper-docs-screenshots build-ios: runs-on: macos-latest-large