From 06e53103b71027100c578bd38648e80f6aae5ddf Mon Sep 17 00:00:00 2001 From: William Candillon Date: Wed, 13 May 2026 14:09:53 +0200 Subject: [PATCH 1/2] :wrench: --- package.json | 2 +- packages/webgpu/cpp/rnwgpu/api/ImageBitmap.h | 8 +++ packages/webgpu/package.json | 2 +- .../webgpu/src/__tests__/ImageData.spec.ts | 55 +++++++++++++++++++ yarn.lock | 29 ++++++++-- 5 files changed, 88 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index d66820d35..ea7c880b2 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "react-native-webgpu", + "name": "react-native-webgpu-monorepo", "private": true, "workspaces": [ "packages/*", diff --git a/packages/webgpu/cpp/rnwgpu/api/ImageBitmap.h b/packages/webgpu/cpp/rnwgpu/api/ImageBitmap.h index a5407151f..3a76c35e0 100644 --- a/packages/webgpu/cpp/rnwgpu/api/ImageBitmap.h +++ b/packages/webgpu/cpp/rnwgpu/api/ImageBitmap.h @@ -26,9 +26,17 @@ class ImageBitmap : public NativeObject { size_t getSize() { return _imageData.data.size(); } + void close() { + _imageData.data.clear(); + _imageData.data.shrink_to_fit(); + _imageData.width = 0; + _imageData.height = 0; + } + static void definePrototype(jsi::Runtime &runtime, jsi::Object &prototype) { installGetter(runtime, prototype, "width", &ImageBitmap::getWidth); installGetter(runtime, prototype, "height", &ImageBitmap::getHeight); + installMethod(runtime, prototype, "close", &ImageBitmap::close); } size_t getMemoryPressure() override { return getSize(); } diff --git a/packages/webgpu/package.json b/packages/webgpu/package.json index bda3bc9a3..1dcaed0e1 100644 --- a/packages/webgpu/package.json +++ b/packages/webgpu/package.json @@ -1,5 +1,5 @@ { - "name": "react-native-wgpu", + "name": "react-native-webgpu", "version": "0.5.11", "description": "React Native WebGPU", "main": "lib/commonjs/index", diff --git a/packages/webgpu/src/__tests__/ImageData.spec.ts b/packages/webgpu/src/__tests__/ImageData.spec.ts index 5b438581b..edad2b34a 100644 --- a/packages/webgpu/src/__tests__/ImageData.spec.ts +++ b/packages/webgpu/src/__tests__/ImageData.spec.ts @@ -66,6 +66,61 @@ describe("Image Bitmap", () => { expect(result.width).toBe(expected.width); expect(result.height).toBe(expected.height); }); + itSkipsOnWeb("ImageBitmap.close() zeroes width and height", async () => { + const pngBytes = Array.from( + fs.readFileSync(path.join(__dirname, "./assets/Di-3d.png")), + ); + const expected = decodeImage(path.join(__dirname, "./assets/Di-3d.png")); + const result = await client.eval( + ({ pngData }) => { + const bytes = new Uint8Array(pngData); + return createImageBitmap(bytes.buffer).then((bmp) => { + const before = { width: bmp.width, height: bmp.height }; + bmp.close(); + const after = { width: bmp.width, height: bmp.height }; + return { before, after }; + }); + }, + { pngData: pngBytes }, + ); + expect(result.before.width).toBe(expected.width); + expect(result.before.height).toBe(expected.height); + expect(result.after.width).toBe(0); + expect(result.after.height).toBe(0); + }); + itSkipsOnWeb("ImageBitmap.close() is idempotent", async () => { + const pngBytes = Array.from( + fs.readFileSync(path.join(__dirname, "./assets/Di-3d.png")), + ); + const result = await client.eval( + ({ pngData }) => { + const bytes = new Uint8Array(pngData); + return createImageBitmap(bytes.buffer).then((bmp) => { + bmp.close(); + bmp.close(); + return { width: bmp.width, height: bmp.height }; + }); + }, + { pngData: pngBytes }, + ); + expect(result.width).toBe(0); + expect(result.height).toBe(0); + }); + itSkipsOnWeb("ImageBitmap exposes close as a function", async () => { + const pngBytes = Array.from( + fs.readFileSync(path.join(__dirname, "./assets/Di-3d.png")), + ); + const result = await client.eval( + ({ pngData }) => { + const bytes = new Uint8Array(pngData); + return createImageBitmap(bytes.buffer).then((bmp) => { + return typeof bmp.close; + }); + }, + { pngData: pngBytes }, + ); + expect(result).toBe("function"); + }); itSkipsOnWeb( "createImageBitmap from Uint8Array subarray (byteOffset/byteLength)", async () => { diff --git a/yarn.lock b/yarn.lock index f6a59461c..36be25a7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3657,9 +3657,9 @@ __metadata: languageName: node linkType: hard -"@react-three/fiber@patch:@react-three/fiber@npm%3A9.4.0#./.yarn/patches/@react-three-fiber-npm-9.4.0-77fe8ee9bd.patch::locator=react-native-webgpu%40workspace%3A.": +"@react-three/fiber@patch:@react-three/fiber@npm%3A9.4.0#./.yarn/patches/@react-three-fiber-npm-9.4.0-77fe8ee9bd.patch::locator=react-native-webgpu-monorepo%40workspace%3A.": version: 9.4.0 - resolution: "@react-three/fiber@patch:@react-three/fiber@npm%3A9.4.0#./.yarn/patches/@react-three-fiber-npm-9.4.0-77fe8ee9bd.patch::version=9.4.0&hash=7de131&locator=react-native-webgpu%40workspace%3A." + resolution: "@react-three/fiber@patch:@react-three/fiber@npm%3A9.4.0#./.yarn/patches/@react-three-fiber-npm-9.4.0-77fe8ee9bd.patch::version=9.4.0&hash=7de131&locator=react-native-webgpu-monorepo%40workspace%3A." dependencies: "@babel/runtime": ^7.17.8 "@types/react-reconciler": ^0.32.0 @@ -12877,18 +12877,18 @@ __metadata: languageName: node linkType: hard -"react-native-webgpu@workspace:.": +"react-native-webgpu-monorepo@workspace:.": version: 0.0.0-use.local - resolution: "react-native-webgpu@workspace:." + resolution: "react-native-webgpu-monorepo@workspace:." dependencies: "@types/react-native-web": ^0.19.2 turbo: ^2.1.0 languageName: unknown linkType: soft -"react-native-wgpu@*, react-native-wgpu@workspace:packages/webgpu": +"react-native-webgpu@workspace:packages/webgpu": version: 0.0.0-use.local - resolution: "react-native-wgpu@workspace:packages/webgpu" + resolution: "react-native-webgpu@workspace:packages/webgpu" dependencies: "@types/jest": ^29.5.12 "@types/lodash": ^4.17.5 @@ -12941,6 +12941,23 @@ __metadata: languageName: unknown linkType: soft +"react-native-wgpu@npm:*": + version: 0.5.11 + resolution: "react-native-wgpu@npm:0.5.11" + peerDependencies: + react: "*" + react-native: "*" + react-native-reanimated: ">=4.2.1" + react-native-worklets: ">=0.7.2" + peerDependenciesMeta: + react-native-reanimated: + optional: true + react-native-worklets: + optional: true + checksum: f6b7775831163038899d38c41ddb4b4fd7de5c56a8ecc881482c145a6ccbabd97d4e5c7ecacdd1dbd8dced8aa6b9b70a6edc63acf726ce331855f4d30f803634 + languageName: node + linkType: hard + "react-native-worklets@npm:0.7.2, react-native-worklets@npm:^0.7.0": version: 0.7.2 resolution: "react-native-worklets@npm:0.7.2" From fd600f05912c86a5e4d62c1ce3410b092ac38e4d Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sun, 31 May 2026 18:52:57 +0200 Subject: [PATCH 2/2] :wrench: --- yarn.lock | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6ea370ade..3223b45be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13048,9 +13048,9 @@ __metadata: languageName: unknown linkType: soft -"react-native-webgpu@workspace:packages/webgpu": +"react-native-wgpu@*, react-native-wgpu@workspace:packages/webgpu": version: 0.0.0-use.local - resolution: "react-native-webgpu@workspace:packages/webgpu" + resolution: "react-native-wgpu@workspace:packages/webgpu" dependencies: "@types/jest": ^29.5.12 "@types/lodash": ^4.17.5 @@ -13103,23 +13103,6 @@ __metadata: languageName: unknown linkType: soft -"react-native-wgpu@npm:*": - version: 0.5.11 - resolution: "react-native-wgpu@npm:0.5.11" - peerDependencies: - react: "*" - react-native: "*" - react-native-reanimated: ">=4.2.1" - react-native-worklets: ">=0.7.2" - peerDependenciesMeta: - react-native-reanimated: - optional: true - react-native-worklets: - optional: true - checksum: f6b7775831163038899d38c41ddb4b4fd7de5c56a8ecc881482c145a6ccbabd97d4e5c7ecacdd1dbd8dced8aa6b9b70a6edc63acf726ce331855f4d30f803634 - languageName: node - linkType: hard - "react-native-worklets@npm:0.7.2, react-native-worklets@npm:^0.7.0": version: 0.7.2 resolution: "react-native-worklets@npm:0.7.2"