react-native-webgpu 0.5.18 → 0.6.1
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.
- package/android/cpp/AndroidPlatformContext.h +24 -9
- package/android/cpp/cpp-adapter.cpp +35 -13
- package/android/src/main/java/com/webgpu/WebGPUAHBView.java +2 -2
- package/android/src/main/java/com/webgpu/WebGPUAPI.java +7 -2
- package/android/src/main/java/com/webgpu/WebGPUSurfaceView.java +3 -1
- package/android/src/main/java/com/webgpu/WebGPUTextureView.java +11 -7
- package/android/src/main/java/com/webgpu/WebGPUView.java +10 -7
- package/android/src/main/java/com/webgpu/WebGPUViewManager.java +6 -0
- package/apple/MetalView.mm +33 -8
- package/cpp/rnwgpu/RNWebGPUManager.cpp +14 -1
- package/cpp/rnwgpu/RNWebGPUManager.h +9 -0
- package/cpp/rnwgpu/SurfaceRegistry.h +469 -131
- package/cpp/rnwgpu/api/GPUAdapter.cpp +43 -7
- package/cpp/rnwgpu/api/GPUAdapter.h +5 -4
- package/cpp/rnwgpu/api/GPUBuffer.cpp +12 -2
- package/cpp/rnwgpu/api/GPUBuffer.h +3 -2
- package/cpp/rnwgpu/api/GPUCanvasContext.cpp +33 -19
- package/cpp/rnwgpu/api/GPUCanvasContext.h +3 -1
- package/cpp/rnwgpu/api/GPUDevice.cpp +32 -17
- package/cpp/rnwgpu/api/GPUDevice.h +9 -7
- package/cpp/rnwgpu/api/GPUExternalTexture.cpp +105 -74
- package/cpp/rnwgpu/api/GPUExternalTexture.h +21 -2
- package/cpp/rnwgpu/api/GPUQueue.cpp +6 -2
- package/cpp/rnwgpu/api/GPUQueue.h +3 -3
- package/cpp/rnwgpu/api/GPUShaderModule.cpp +7 -2
- package/cpp/rnwgpu/api/GPUShaderModule.h +3 -3
- package/cpp/rnwgpu/api/RNWebGPU.h +22 -1
- package/cpp/rnwgpu/async/RuntimeContext.cpp +8 -1
- package/cpp/rnwgpu/async/RuntimeContext.h +9 -2
- package/lib/commonjs/Canvas.js +10 -0
- package/lib/commonjs/Canvas.js.map +1 -1
- package/lib/commonjs/WebPolyfillGPUModule.js +2 -0
- package/lib/commonjs/WebPolyfillGPUModule.js.map +1 -1
- package/lib/module/Canvas.js +11 -1
- package/lib/module/Canvas.js.map +1 -1
- package/lib/module/WebPolyfillGPUModule.js +2 -0
- package/lib/module/WebPolyfillGPUModule.js.map +1 -1
- package/lib/typescript/lib/commonjs/Canvas.d.ts.map +1 -1
- package/lib/typescript/lib/module/Canvas.d.ts.map +1 -1
- package/lib/typescript/src/Canvas.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +4 -6
- package/src/Canvas.tsx +11 -1
- package/src/WebPolyfillGPUModule.ts +2 -0
- package/src/index.tsx +12 -0
- package/android/src/main/java/com/webgpu/WebGPUBaseView.java +0 -61
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include <array>
|
|
3
4
|
#include <memory>
|
|
4
5
|
#include <string>
|
|
5
6
|
#include <utility>
|
|
7
|
+
#include <vector>
|
|
6
8
|
|
|
7
9
|
#include "Unions.h"
|
|
8
10
|
|
|
@@ -36,10 +38,12 @@ public:
|
|
|
36
38
|
// the producer (e.g. AVPlayer) can reclaim the IOSurface.
|
|
37
39
|
GPUExternalTexture(wgpu::ExternalTexture instance,
|
|
38
40
|
wgpu::SharedTextureMemory memory, wgpu::Texture texture,
|
|
39
|
-
std::shared_ptr<VideoFrame> source, std::string label
|
|
41
|
+
std::shared_ptr<VideoFrame> source, std::string label,
|
|
42
|
+
std::array<float, 12> yuvToRgbMatrix)
|
|
40
43
|
: NativeObject(CLASS_NAME), _instance(std::move(instance)),
|
|
41
44
|
_memory(std::move(memory)), _texture(std::move(texture)),
|
|
42
|
-
_source(std::move(source)), _label(std::move(label))
|
|
45
|
+
_source(std::move(source)), _label(std::move(label)),
|
|
46
|
+
_yuvToRgbMatrix(yuvToRgbMatrix) {}
|
|
43
47
|
|
|
44
48
|
~GPUExternalTexture() override { destroy(); }
|
|
45
49
|
|
|
@@ -69,11 +73,25 @@ public:
|
|
|
69
73
|
_instance.SetLabel(_label.c_str());
|
|
70
74
|
}
|
|
71
75
|
|
|
76
|
+
// Non-spec extension. A 3x4 row-major matrix mapping the *sampled* texel
|
|
77
|
+
// [c.r, c.g, c.b, 1] to gamma-encoded R'G'B'. When Dawn's sampler already
|
|
78
|
+
// produces RGB (Apple's biplanar path, RGBA surfaces), this is the identity
|
|
79
|
+
// passthrough; on the Android opaque-YCbCr path the sample comes back as raw
|
|
80
|
+
// [Y, Cb, Cr] (Dawn hard-codes an RGB_IDENTITY Vulkan conversion, see
|
|
81
|
+
// crbug.com/497675620) and this matrix is derived from the driver's
|
|
82
|
+
// suggested YCbCr model + range for the buffer. Shaders can therefore apply
|
|
83
|
+
// it unconditionally after textureSampleBaseClampToEdge.
|
|
84
|
+
std::vector<double> getYuvToRgbMatrix() {
|
|
85
|
+
return std::vector<double>(_yuvToRgbMatrix.begin(), _yuvToRgbMatrix.end());
|
|
86
|
+
}
|
|
87
|
+
|
|
72
88
|
static void definePrototype(jsi::Runtime &runtime, jsi::Object &prototype) {
|
|
73
89
|
installGetter(runtime, prototype, "__brand", &GPUExternalTexture::getBrand);
|
|
74
90
|
installGetterSetter(runtime, prototype, "label",
|
|
75
91
|
&GPUExternalTexture::getLabel,
|
|
76
92
|
&GPUExternalTexture::setLabel);
|
|
93
|
+
installGetter(runtime, prototype, "yuvToRgbMatrix",
|
|
94
|
+
&GPUExternalTexture::getYuvToRgbMatrix);
|
|
77
95
|
installMethod(runtime, prototype, "destroy", &GPUExternalTexture::destroy);
|
|
78
96
|
}
|
|
79
97
|
|
|
@@ -85,6 +103,7 @@ private:
|
|
|
85
103
|
wgpu::Texture _texture;
|
|
86
104
|
std::shared_ptr<VideoFrame> _source;
|
|
87
105
|
std::string _label;
|
|
106
|
+
std::array<float, 12> _yuvToRgbMatrix;
|
|
88
107
|
};
|
|
89
108
|
|
|
90
109
|
} // namespace rnwgpu
|
|
@@ -78,9 +78,13 @@ void GPUQueue::writeBuffer(std::shared_ptr<GPUBuffer> buffer,
|
|
|
78
78
|
static_cast<size_t>(size64));
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
async::AsyncTaskHandle GPUQueue::onSubmittedWorkDone() {
|
|
81
|
+
async::AsyncTaskHandle GPUQueue::onSubmittedWorkDone(jsi::Runtime &runtime) {
|
|
82
82
|
auto queue = _instance;
|
|
83
|
-
|
|
83
|
+
// Post to the CALLING runtime's context so the promise settles on the
|
|
84
|
+
// thread that requested it (see GPUBuffer::mapAsync).
|
|
85
|
+
auto context =
|
|
86
|
+
async::RuntimeContext::getOrCreate(runtime, _async->instance());
|
|
87
|
+
return context->postTask(
|
|
84
88
|
[queue](const async::AsyncTaskHandle::ResolveFunction &resolve,
|
|
85
89
|
const async::AsyncTaskHandle::RejectFunction &reject) {
|
|
86
90
|
queue.OnSubmittedWorkDone(
|
|
@@ -37,7 +37,7 @@ public:
|
|
|
37
37
|
std::string getBrand() { return CLASS_NAME; }
|
|
38
38
|
|
|
39
39
|
void submit(std::vector<std::shared_ptr<GPUCommandBuffer>> commandBuffers);
|
|
40
|
-
async::AsyncTaskHandle onSubmittedWorkDone();
|
|
40
|
+
async::AsyncTaskHandle onSubmittedWorkDone(jsi::Runtime &runtime);
|
|
41
41
|
void writeBuffer(std::shared_ptr<GPUBuffer> buffer, uint64_t bufferOffset,
|
|
42
42
|
std::shared_ptr<ArrayBuffer> data,
|
|
43
43
|
std::optional<uint64_t> dataOffsetElements,
|
|
@@ -60,8 +60,8 @@ public:
|
|
|
60
60
|
static void definePrototype(jsi::Runtime &runtime, jsi::Object &prototype) {
|
|
61
61
|
installGetter(runtime, prototype, "__brand", &GPUQueue::getBrand);
|
|
62
62
|
installMethod(runtime, prototype, "submit", &GPUQueue::submit);
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
installMethodWithRuntime(runtime, prototype, "onSubmittedWorkDone",
|
|
64
|
+
&GPUQueue::onSubmittedWorkDone);
|
|
65
65
|
installMethod(runtime, prototype, "writeBuffer", &GPUQueue::writeBuffer);
|
|
66
66
|
installMethod(runtime, prototype, "writeTexture", &GPUQueue::writeTexture);
|
|
67
67
|
installMethod(runtime, prototype, "copyExternalImageToTexture",
|
|
@@ -7,10 +7,15 @@
|
|
|
7
7
|
|
|
8
8
|
namespace rnwgpu {
|
|
9
9
|
|
|
10
|
-
async::AsyncTaskHandle
|
|
10
|
+
async::AsyncTaskHandle
|
|
11
|
+
GPUShaderModule::getCompilationInfo(jsi::Runtime &runtime) {
|
|
11
12
|
auto module = _instance;
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
// Post to the CALLING runtime's context so the promise settles on the
|
|
15
|
+
// thread that requested it (see GPUBuffer::mapAsync).
|
|
16
|
+
auto context =
|
|
17
|
+
async::RuntimeContext::getOrCreate(runtime, _async->instance());
|
|
18
|
+
return context->postTask(
|
|
14
19
|
[module](const async::AsyncTaskHandle::ResolveFunction &resolve,
|
|
15
20
|
const async::AsyncTaskHandle::RejectFunction &reject) {
|
|
16
21
|
auto result = std::make_shared<GPUCompilationInfo>();
|
|
@@ -31,7 +31,7 @@ public:
|
|
|
31
31
|
public:
|
|
32
32
|
std::string getBrand() { return CLASS_NAME; }
|
|
33
33
|
|
|
34
|
-
async::AsyncTaskHandle getCompilationInfo();
|
|
34
|
+
async::AsyncTaskHandle getCompilationInfo(jsi::Runtime &runtime);
|
|
35
35
|
|
|
36
36
|
std::string getLabel() { return _label; }
|
|
37
37
|
void setLabel(const std::string &label) {
|
|
@@ -41,8 +41,8 @@ public:
|
|
|
41
41
|
|
|
42
42
|
static void definePrototype(jsi::Runtime &runtime, jsi::Object &prototype) {
|
|
43
43
|
installGetter(runtime, prototype, "__brand", &GPUShaderModule::getBrand);
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
installMethodWithRuntime(runtime, prototype, "getCompilationInfo",
|
|
45
|
+
&GPUShaderModule::getCompilationInfo);
|
|
46
46
|
installGetterSetter(runtime, prototype, "label", &GPUShaderModule::getLabel,
|
|
47
47
|
&GPUShaderModule::setLabel);
|
|
48
48
|
}
|
|
@@ -173,7 +173,8 @@ public:
|
|
|
173
173
|
return std::make_shared<VideoFrame>(std::move(frame));
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
std::shared_ptr<VideoFrame> createTestVideoFrame(double width,
|
|
176
|
+
std::shared_ptr<VideoFrame> createTestVideoFrame(double width,
|
|
177
|
+
double height) {
|
|
177
178
|
auto frame = _platformContext->createTestVideoFrame(
|
|
178
179
|
static_cast<uint32_t>(width), static_cast<uint32_t>(height));
|
|
179
180
|
return std::make_shared<VideoFrame>(std::move(frame));
|
|
@@ -211,6 +212,24 @@ public:
|
|
|
211
212
|
nativeInfo.height);
|
|
212
213
|
}
|
|
213
214
|
|
|
215
|
+
// Retires a canvas context from the JS side (Canvas unmount cleanup).
|
|
216
|
+
// Registry entries have two owners, split by whether a native surface is
|
|
217
|
+
// attached:
|
|
218
|
+
// - A native view currently owns a surface (or one is pending): its own
|
|
219
|
+
// teardown (MetalView dealloc / WebGPUViewManager.onDropViewInstance)
|
|
220
|
+
// removes the entry. Skipping here keeps React StrictMode safe: its
|
|
221
|
+
// simulated unmount re-runs JS effects without unmounting native views,
|
|
222
|
+
// and removing the entry then would orphan the still-attached surface.
|
|
223
|
+
// - No native surface: the JS side is the last owner and removes the entry.
|
|
224
|
+
// The check-and-erase runs atomically under the registry lock
|
|
225
|
+
// (removeSurfaceInfoIfDetached), serialized against the UI thread's
|
|
226
|
+
// find-or-create + attach (SurfaceRegistry::attachSurface), so a concurrent
|
|
227
|
+
// attach can never be orphaned by this removal.
|
|
228
|
+
void destroyContext(int contextId) {
|
|
229
|
+
auto ®istry = rnwgpu::SurfaceRegistry::getInstance();
|
|
230
|
+
registry.removeSurfaceInfoIfDetached(contextId);
|
|
231
|
+
}
|
|
232
|
+
|
|
214
233
|
static void definePrototype(jsi::Runtime &runtime, jsi::Object &prototype) {
|
|
215
234
|
installGetter(runtime, prototype, "fabric", &RNWebGPU::getFabric);
|
|
216
235
|
installGetter(runtime, prototype, "gpu", &RNWebGPU::getGPU);
|
|
@@ -218,6 +237,8 @@ public:
|
|
|
218
237
|
&RNWebGPU::createImageBitmap);
|
|
219
238
|
installMethod(runtime, prototype, "getNativeSurface",
|
|
220
239
|
&RNWebGPU::getNativeSurface);
|
|
240
|
+
installMethod(runtime, prototype, "destroyContext",
|
|
241
|
+
&RNWebGPU::destroyContext);
|
|
221
242
|
installMethod(runtime, prototype, "MakeWebGPUCanvasContext",
|
|
222
243
|
&RNWebGPU::MakeWebGPUCanvasContext);
|
|
223
244
|
installMethod(runtime, prototype, "loadVideoFrame",
|
|
@@ -186,7 +186,14 @@ void RuntimeContext::tick() {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
jsi::UUID RuntimeContext::runtimeDataUUID() {
|
|
189
|
-
|
|
189
|
+
// Fixed random UUID identifying react-native-webgpu's runtimeData slot.
|
|
190
|
+
// Never use the default-constructed all-zero UUID here: Hermes backs
|
|
191
|
+
// runtimeData with a DenseMap that reserves the all-zero UUID as its
|
|
192
|
+
// empty-bucket marker (and the all-0xff UUID as its tombstone), so using
|
|
193
|
+
// either as a key is undefined behavior. It crashes on worklet runtimes,
|
|
194
|
+
// where react-native-worklets seeds runtimeData before we do.
|
|
195
|
+
static constexpr jsi::UUID uuid(0xC06D5D2D, 0xB19B, 0x431B, 0xA89E,
|
|
196
|
+
0x20F8A0B6E31BULL);
|
|
190
197
|
return uuid;
|
|
191
198
|
}
|
|
192
199
|
|
|
@@ -56,8 +56,15 @@ namespace rnwgpu::async {
|
|
|
56
56
|
* ProcessEvents on one instance is not guaranteed reentrant.
|
|
57
57
|
*
|
|
58
58
|
* Threading contract: a RuntimeContext must only be pumped from the runtime it
|
|
59
|
-
* was created for.
|
|
60
|
-
*
|
|
59
|
+
* was created for. Request/response async entry points (mapAsync,
|
|
60
|
+
* onSubmittedWorkDone, popErrorScope, createComputePipelineAsync,
|
|
61
|
+
* createRenderPipelineAsync, getCompilationInfo, requestAdapter,
|
|
62
|
+
* requestDevice) must NOT use a context captured when the object was created —
|
|
63
|
+
* the object may have been boxed across to another runtime. They resolve the
|
|
64
|
+
* CALLING runtime's context via getOrCreate(runtime, instance) so the promise
|
|
65
|
+
* is settled on the thread it was created on. Spontaneous events (device.lost,
|
|
66
|
+
* uncapturederror) remain bound to the device's own context (best-effort, main
|
|
67
|
+
* runtime only; see the class doc above).
|
|
61
68
|
*/
|
|
62
69
|
class RuntimeContext : public std::enable_shared_from_this<RuntimeContext> {
|
|
63
70
|
public:
|
package/lib/commonjs/Canvas.js
CHANGED
|
@@ -21,6 +21,16 @@ const Canvas = ({
|
|
|
21
21
|
}) => {
|
|
22
22
|
const viewRef = (0, _react.useRef)(null);
|
|
23
23
|
const [contextId, _] = (0, _react.useState)(() => generateContextId());
|
|
24
|
+
// Retire the native registry entry for this contextId on unmount. When a
|
|
25
|
+
// native surface is still attached, this is a no-op and the native view's
|
|
26
|
+
// own teardown retires the entry instead — which keeps StrictMode's
|
|
27
|
+
// simulated unmount (which re-runs effects without unmounting native views)
|
|
28
|
+
// from orphaning a live surface.
|
|
29
|
+
(0, _react.useEffect)(() => {
|
|
30
|
+
return () => {
|
|
31
|
+
RNWebGPU.destroyContext(contextId);
|
|
32
|
+
};
|
|
33
|
+
}, [contextId]);
|
|
24
34
|
(0, _react.useImperativeHandle)(ref, () => ({
|
|
25
35
|
getContextId: () => contextId,
|
|
26
36
|
getNativeSurface: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_WebGPUViewNativeComponent","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","CONTEXT_COUNTER","generateContextId","Canvas","transparent","ref","props","viewRef","useRef","contextId","_","useState","useImperativeHandle","getContextId","getNativeSurface","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_WebGPUViewNativeComponent","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","CONTEXT_COUNTER","generateContextId","Canvas","transparent","ref","props","viewRef","useRef","contextId","_","useState","useEffect","RNWebGPU","destroyContext","useImperativeHandle","getContextId","getNativeSurface","getContext","contextName","Error","current","view","size","getBoundingClientRect","unstable_getBoundingClientRect","MakeWebGPUCanvasContext","width","height","createElement","View","collapsable","style","flex","exports"],"sourceRoot":"../../src","sources":["Canvas.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -43,6 +43,8 @@ function makeWebGPUCanvasContext(contextId, width, height) {
|
|
|
43
43
|
window.RNWebGPU = {
|
|
44
44
|
getNativeSurface,
|
|
45
45
|
MakeWebGPUCanvasContext: makeWebGPUCanvasContext,
|
|
46
|
+
// On web the browser owns the canvas/context lifecycle; nothing to retire.
|
|
47
|
+
destroyContext: _contextId => {},
|
|
46
48
|
fabric
|
|
47
49
|
};
|
|
48
50
|
//# sourceMappingURL=WebPolyfillGPUModule.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_utils","require","fabric","getNativeSurface","contextId","canvas","document","getElementById","contextIdToId","height","width","getBoundingClientRect","surface","BigInt","clientHeight","clientWidth","addEventListener","bind","removeEventListener","dispatchEvent","setPointerCapture","releasePointerCapture","makeWebGPUCanvasContext","dpr","window","devicePixelRatio","pixelWidth","toString","pixelHeight","getAttribute","setAttribute","context","getContext","Object","assign","present","RNWebGPU","MakeWebGPUCanvasContext"],"sourceRoot":"../../src","sources":["WebPolyfillGPUModule.ts"],"mappings":";;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,MAAMC,MAAM,GAAG,IAAI;AAEnB,SAASC,gBAAgBA,CAACC,SAAiB,EAAE;EAC3C,MAAMC,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpC,IAAAC,oBAAa,EAACJ,SAAS,CACzB,CAAsB;EAEtB,MAAM;IAAEK,MAAM;IAAEC;EAAM,CAAC,GAAGL,MAAM,CAACM,qBAAqB,CAAC,CAAE;EAEzD,OAAO;IACLC,OAAO,EAAEC,MAAM,CAACT,SAAS,CAAC;IAC1BK,MAAM;IACNC,KAAK;IACLI,YAAY,EAAEL,MAAM;IACpBM,WAAW,EAAEL,KAAK;IAClB;IACAM,gBAAgB,EAAEX,MAAM,CAACW,gBAAgB,CAACC,IAAI,CAACZ,MAAM,CAAC;IACtDa,mBAAmB,EAAEb,MAAM,CAACa,mBAAmB,CAACD,IAAI,CAACZ,MAAM,CAAC;IAC5Dc,aAAa,EAAEd,MAAM,CAACc,aAAa,CAACF,IAAI,CAACZ,MAAM,CAAC;IAChDe,iBAAiB,EAAEf,MAAM,CAACe,iBAAiB,CAACH,IAAI,CAACZ,MAAM,CAAC;IACxDgB,qBAAqB,EAAEhB,MAAM,CAACgB,qBAAqB,CAACJ,IAAI,CAACZ,MAAM;EACjE,CAAC;AACH;AAEA,SAASiB,uBAAuBA,CAC9BlB,SAAiB,EACjBM,KAAa,EACbD,MAAc,EACd;EACA,MAAMJ,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpC,IAAAC,oBAAa,EAACJ,SAAS,CACzB,CAAsB;EAEtB,MAAMmB,GAAG,GAAGC,MAAM,CAACC,gBAAgB,IAAI,CAAC;EACxC,MAAMC,UAAU,GAAG,CAAChB,KAAK,GAAGa,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAC3C,MAAMC,WAAW,GAAG,CAACnB,MAAM,GAAGc,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAE7C,IACEtB,MAAM,CAACwB,YAAY,CAAC,OAAO,CAAC,KAAKH,UAAU,IAC3CrB,MAAM,CAACwB,YAAY,CAAC,QAAQ,CAAC,KAAKD,WAAW,EAC7C;IACAvB,MAAM,CAACyB,YAAY,CAAC,OAAO,EAAEJ,UAAU,CAAC;IACxCrB,MAAM,CAACyB,YAAY,CAAC,QAAQ,EAAEF,WAAW,CAAC;EAC5C;EAEA,MAAMG,OAAO,GAAG1B,MAAM,CAAC2B,UAAU,CAAC,QAAQ,CAAE;EAC5C;EACA;EACA,OAAOC,MAAM,CAACC,MAAM,CAACH,OAAO,EAAE;IAAEI,OAAO,EAAEA,CAAA,KAAM,CAAC;EAAE,CAAC,CAAC;AACtD;;AAEA;AACAX,MAAM,CAACY,QAAQ,GAAG;EAChBjC,gBAAgB;EAChBkC,uBAAuB,EAAEf,uBAAuB;
|
|
1
|
+
{"version":3,"names":["_utils","require","fabric","getNativeSurface","contextId","canvas","document","getElementById","contextIdToId","height","width","getBoundingClientRect","surface","BigInt","clientHeight","clientWidth","addEventListener","bind","removeEventListener","dispatchEvent","setPointerCapture","releasePointerCapture","makeWebGPUCanvasContext","dpr","window","devicePixelRatio","pixelWidth","toString","pixelHeight","getAttribute","setAttribute","context","getContext","Object","assign","present","RNWebGPU","MakeWebGPUCanvasContext","destroyContext","_contextId"],"sourceRoot":"../../src","sources":["WebPolyfillGPUModule.ts"],"mappings":";;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,MAAMC,MAAM,GAAG,IAAI;AAEnB,SAASC,gBAAgBA,CAACC,SAAiB,EAAE;EAC3C,MAAMC,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpC,IAAAC,oBAAa,EAACJ,SAAS,CACzB,CAAsB;EAEtB,MAAM;IAAEK,MAAM;IAAEC;EAAM,CAAC,GAAGL,MAAM,CAACM,qBAAqB,CAAC,CAAE;EAEzD,OAAO;IACLC,OAAO,EAAEC,MAAM,CAACT,SAAS,CAAC;IAC1BK,MAAM;IACNC,KAAK;IACLI,YAAY,EAAEL,MAAM;IACpBM,WAAW,EAAEL,KAAK;IAClB;IACAM,gBAAgB,EAAEX,MAAM,CAACW,gBAAgB,CAACC,IAAI,CAACZ,MAAM,CAAC;IACtDa,mBAAmB,EAAEb,MAAM,CAACa,mBAAmB,CAACD,IAAI,CAACZ,MAAM,CAAC;IAC5Dc,aAAa,EAAEd,MAAM,CAACc,aAAa,CAACF,IAAI,CAACZ,MAAM,CAAC;IAChDe,iBAAiB,EAAEf,MAAM,CAACe,iBAAiB,CAACH,IAAI,CAACZ,MAAM,CAAC;IACxDgB,qBAAqB,EAAEhB,MAAM,CAACgB,qBAAqB,CAACJ,IAAI,CAACZ,MAAM;EACjE,CAAC;AACH;AAEA,SAASiB,uBAAuBA,CAC9BlB,SAAiB,EACjBM,KAAa,EACbD,MAAc,EACd;EACA,MAAMJ,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpC,IAAAC,oBAAa,EAACJ,SAAS,CACzB,CAAsB;EAEtB,MAAMmB,GAAG,GAAGC,MAAM,CAACC,gBAAgB,IAAI,CAAC;EACxC,MAAMC,UAAU,GAAG,CAAChB,KAAK,GAAGa,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAC3C,MAAMC,WAAW,GAAG,CAACnB,MAAM,GAAGc,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAE7C,IACEtB,MAAM,CAACwB,YAAY,CAAC,OAAO,CAAC,KAAKH,UAAU,IAC3CrB,MAAM,CAACwB,YAAY,CAAC,QAAQ,CAAC,KAAKD,WAAW,EAC7C;IACAvB,MAAM,CAACyB,YAAY,CAAC,OAAO,EAAEJ,UAAU,CAAC;IACxCrB,MAAM,CAACyB,YAAY,CAAC,QAAQ,EAAEF,WAAW,CAAC;EAC5C;EAEA,MAAMG,OAAO,GAAG1B,MAAM,CAAC2B,UAAU,CAAC,QAAQ,CAAE;EAC5C;EACA;EACA,OAAOC,MAAM,CAACC,MAAM,CAACH,OAAO,EAAE;IAAEI,OAAO,EAAEA,CAAA,KAAM,CAAC;EAAE,CAAC,CAAC;AACtD;;AAEA;AACAX,MAAM,CAACY,QAAQ,GAAG;EAChBjC,gBAAgB;EAChBkC,uBAAuB,EAAEf,uBAAuB;EAChD;EACAgB,cAAc,EAAGC,UAAkB,IAAK,CAAC,CAAC;EAC1CrC;AACF,CAAC","ignoreList":[]}
|
package/lib/module/Canvas.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
-
import React, { useImperativeHandle, useRef, useState } from "react";
|
|
2
|
+
import React, { useEffect, useImperativeHandle, useRef, useState } from "react";
|
|
3
3
|
import { View } from "react-native";
|
|
4
4
|
import WebGPUNativeView from "./WebGPUViewNativeComponent";
|
|
5
5
|
let CONTEXT_COUNTER = 1;
|
|
@@ -13,6 +13,16 @@ export const Canvas = ({
|
|
|
13
13
|
}) => {
|
|
14
14
|
const viewRef = useRef(null);
|
|
15
15
|
const [contextId, _] = useState(() => generateContextId());
|
|
16
|
+
// Retire the native registry entry for this contextId on unmount. When a
|
|
17
|
+
// native surface is still attached, this is a no-op and the native view's
|
|
18
|
+
// own teardown retires the entry instead — which keeps StrictMode's
|
|
19
|
+
// simulated unmount (which re-runs effects without unmounting native views)
|
|
20
|
+
// from orphaning a live surface.
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
return () => {
|
|
23
|
+
RNWebGPU.destroyContext(contextId);
|
|
24
|
+
};
|
|
25
|
+
}, [contextId]);
|
|
16
26
|
useImperativeHandle(ref, () => ({
|
|
17
27
|
getContextId: () => contextId,
|
|
18
28
|
getNativeSurface: () => {
|
package/lib/module/Canvas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useImperativeHandle","useRef","useState","View","WebGPUNativeView","CONTEXT_COUNTER","generateContextId","Canvas","transparent","ref","props","viewRef","contextId","_","
|
|
1
|
+
{"version":3,"names":["React","useEffect","useImperativeHandle","useRef","useState","View","WebGPUNativeView","CONTEXT_COUNTER","generateContextId","Canvas","transparent","ref","props","viewRef","contextId","_","RNWebGPU","destroyContext","getContextId","getNativeSurface","getContext","contextName","Error","current","view","size","getBoundingClientRect","unstable_getBoundingClientRect","MakeWebGPUCanvasContext","width","height","createElement","_extends","collapsable","style","flex"],"sourceRoot":"../../src","sources":["Canvas.tsx"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,mBAAmB,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAE/E,SAASC,IAAI,QAAQ,cAAc;AAEnC,OAAOC,gBAAgB,MAAM,6BAA6B;AAE1D,IAAIC,eAAe,GAAG,CAAC;AACvB,SAASC,iBAAiBA,CAAA,EAAG;EAC3B,OAAOD,eAAe,EAAE;AAC1B;AA2CA,OAAO,MAAME,MAAM,GAAGA,CAAC;EAAEC,WAAW;EAAEC,GAAG;EAAE,GAAGC;AAAmB,CAAC,KAAK;EACrE,MAAMC,OAAO,GAAGV,MAAM,CAAC,IAAI,CAAC;EAC5B,MAAM,CAACW,SAAS,EAAEC,CAAC,CAAC,GAAGX,QAAQ,CAAC,MAAMI,iBAAiB,CAAC,CAAC,CAAC;EAC1D;EACA;EACA;EACA;EACA;EACAP,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACXe,QAAQ,CAACC,cAAc,CAACH,SAAS,CAAC;IACpC,CAAC;EACH,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EACfZ,mBAAmB,CAACS,GAAG,EAAE,OAAO;IAC9BO,YAAY,EAAEA,CAAA,KAAMJ,SAAS;IAC7BK,gBAAgB,EAAEA,CAAA,KAAM;MACtB,OAAOH,QAAQ,CAACG,gBAAgB,CAACL,SAAS,CAAC;IAC7C,CAAC;IACDM,UAAUA,CAACC,WAAqB,EAA0B;MACxD,IAAIA,WAAW,KAAK,QAAQ,EAAE;QAC5B,MAAM,IAAIC,KAAK,CAAC,iCAAiCD,WAAW,EAAE,CAAC;MACjE;MACA,IAAI,CAACR,OAAO,CAACU,OAAO,EAAE;QACpB,MAAM,IAAID,KAAK,CAAC,0CAA0C,CAAC;MAC7D;MACA;MACA;MACA,MAAME,IAAI,GAAGX,OAAO,CAACU,OAAc;MACnC,MAAME,IAAI,GACR,uBAAuB,IAAID,IAAI,GAC3BA,IAAI,CAACE,qBAAqB,CAAC,CAAC,GAC5BF,IAAI,CAACG,8BAA8B,CAAC,CAAC;MAC3C,OAAOX,QAAQ,CAACY,uBAAuB,CACrCd,SAAS,EACTW,IAAI,CAACI,KAAK,EACVJ,IAAI,CAACK,MACP,CAAC;IACH;EACF,CAAC,CAAC,CAAC;EAEH,oBACE9B,KAAA,CAAA+B,aAAA,CAAC1B,IAAI,EAAA2B,QAAA;IAACC,WAAW,EAAE,KAAM;IAACtB,GAAG,EAAEE;EAAQ,GAAKD,KAAK,gBAC/CZ,KAAA,CAAA+B,aAAA,CAACzB,gBAAgB;IACf4B,KAAK,EAAE;MAAEC,IAAI,EAAE;IAAE,CAAE;IACnBrB,SAAS,EAAEA,SAAU;IACrBJ,WAAW,EAAE,CAAC,CAACA;EAAY,CAC5B,CACG,CAAC;AAEX,CAAC","ignoreList":[]}
|
|
@@ -41,6 +41,8 @@ function makeWebGPUCanvasContext(contextId, width, height) {
|
|
|
41
41
|
window.RNWebGPU = {
|
|
42
42
|
getNativeSurface,
|
|
43
43
|
MakeWebGPUCanvasContext: makeWebGPUCanvasContext,
|
|
44
|
+
// On web the browser owns the canvas/context lifecycle; nothing to retire.
|
|
45
|
+
destroyContext: _contextId => {},
|
|
44
46
|
fabric
|
|
45
47
|
};
|
|
46
48
|
//# sourceMappingURL=WebPolyfillGPUModule.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["contextIdToId","fabric","getNativeSurface","contextId","canvas","document","getElementById","height","width","getBoundingClientRect","surface","BigInt","clientHeight","clientWidth","addEventListener","bind","removeEventListener","dispatchEvent","setPointerCapture","releasePointerCapture","makeWebGPUCanvasContext","dpr","window","devicePixelRatio","pixelWidth","toString","pixelHeight","getAttribute","setAttribute","context","getContext","Object","assign","present","RNWebGPU","MakeWebGPUCanvasContext"],"sourceRoot":"../../src","sources":["WebPolyfillGPUModule.ts"],"mappings":"AAAA,SAASA,aAAa,QAAQ,SAAS;AAEvC,MAAMC,MAAM,GAAG,IAAI;AAEnB,SAASC,gBAAgBA,CAACC,SAAiB,EAAE;EAC3C,MAAMC,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpCN,aAAa,CAACG,SAAS,CACzB,CAAsB;EAEtB,MAAM;IAAEI,MAAM;IAAEC;EAAM,CAAC,GAAGJ,MAAM,CAACK,qBAAqB,CAAC,CAAE;EAEzD,OAAO;IACLC,OAAO,EAAEC,MAAM,CAACR,SAAS,CAAC;IAC1BI,MAAM;IACNC,KAAK;IACLI,YAAY,EAAEL,MAAM;IACpBM,WAAW,EAAEL,KAAK;IAClB;IACAM,gBAAgB,EAAEV,MAAM,CAACU,gBAAgB,CAACC,IAAI,CAACX,MAAM,CAAC;IACtDY,mBAAmB,EAAEZ,MAAM,CAACY,mBAAmB,CAACD,IAAI,CAACX,MAAM,CAAC;IAC5Da,aAAa,EAAEb,MAAM,CAACa,aAAa,CAACF,IAAI,CAACX,MAAM,CAAC;IAChDc,iBAAiB,EAAEd,MAAM,CAACc,iBAAiB,CAACH,IAAI,CAACX,MAAM,CAAC;IACxDe,qBAAqB,EAAEf,MAAM,CAACe,qBAAqB,CAACJ,IAAI,CAACX,MAAM;EACjE,CAAC;AACH;AAEA,SAASgB,uBAAuBA,CAC9BjB,SAAiB,EACjBK,KAAa,EACbD,MAAc,EACd;EACA,MAAMH,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpCN,aAAa,CAACG,SAAS,CACzB,CAAsB;EAEtB,MAAMkB,GAAG,GAAGC,MAAM,CAACC,gBAAgB,IAAI,CAAC;EACxC,MAAMC,UAAU,GAAG,CAAChB,KAAK,GAAGa,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAC3C,MAAMC,WAAW,GAAG,CAACnB,MAAM,GAAGc,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAE7C,IACErB,MAAM,CAACuB,YAAY,CAAC,OAAO,CAAC,KAAKH,UAAU,IAC3CpB,MAAM,CAACuB,YAAY,CAAC,QAAQ,CAAC,KAAKD,WAAW,EAC7C;IACAtB,MAAM,CAACwB,YAAY,CAAC,OAAO,EAAEJ,UAAU,CAAC;IACxCpB,MAAM,CAACwB,YAAY,CAAC,QAAQ,EAAEF,WAAW,CAAC;EAC5C;EAEA,MAAMG,OAAO,GAAGzB,MAAM,CAAC0B,UAAU,CAAC,QAAQ,CAAE;EAC5C;EACA;EACA,OAAOC,MAAM,CAACC,MAAM,CAACH,OAAO,EAAE;IAAEI,OAAO,EAAEA,CAAA,KAAM,CAAC;EAAE,CAAC,CAAC;AACtD;;AAEA;AACAX,MAAM,CAACY,QAAQ,GAAG;EAChBhC,gBAAgB;EAChBiC,uBAAuB,EAAEf,uBAAuB;
|
|
1
|
+
{"version":3,"names":["contextIdToId","fabric","getNativeSurface","contextId","canvas","document","getElementById","height","width","getBoundingClientRect","surface","BigInt","clientHeight","clientWidth","addEventListener","bind","removeEventListener","dispatchEvent","setPointerCapture","releasePointerCapture","makeWebGPUCanvasContext","dpr","window","devicePixelRatio","pixelWidth","toString","pixelHeight","getAttribute","setAttribute","context","getContext","Object","assign","present","RNWebGPU","MakeWebGPUCanvasContext","destroyContext","_contextId"],"sourceRoot":"../../src","sources":["WebPolyfillGPUModule.ts"],"mappings":"AAAA,SAASA,aAAa,QAAQ,SAAS;AAEvC,MAAMC,MAAM,GAAG,IAAI;AAEnB,SAASC,gBAAgBA,CAACC,SAAiB,EAAE;EAC3C,MAAMC,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpCN,aAAa,CAACG,SAAS,CACzB,CAAsB;EAEtB,MAAM;IAAEI,MAAM;IAAEC;EAAM,CAAC,GAAGJ,MAAM,CAACK,qBAAqB,CAAC,CAAE;EAEzD,OAAO;IACLC,OAAO,EAAEC,MAAM,CAACR,SAAS,CAAC;IAC1BI,MAAM;IACNC,KAAK;IACLI,YAAY,EAAEL,MAAM;IACpBM,WAAW,EAAEL,KAAK;IAClB;IACAM,gBAAgB,EAAEV,MAAM,CAACU,gBAAgB,CAACC,IAAI,CAACX,MAAM,CAAC;IACtDY,mBAAmB,EAAEZ,MAAM,CAACY,mBAAmB,CAACD,IAAI,CAACX,MAAM,CAAC;IAC5Da,aAAa,EAAEb,MAAM,CAACa,aAAa,CAACF,IAAI,CAACX,MAAM,CAAC;IAChDc,iBAAiB,EAAEd,MAAM,CAACc,iBAAiB,CAACH,IAAI,CAACX,MAAM,CAAC;IACxDe,qBAAqB,EAAEf,MAAM,CAACe,qBAAqB,CAACJ,IAAI,CAACX,MAAM;EACjE,CAAC;AACH;AAEA,SAASgB,uBAAuBA,CAC9BjB,SAAiB,EACjBK,KAAa,EACbD,MAAc,EACd;EACA,MAAMH,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpCN,aAAa,CAACG,SAAS,CACzB,CAAsB;EAEtB,MAAMkB,GAAG,GAAGC,MAAM,CAACC,gBAAgB,IAAI,CAAC;EACxC,MAAMC,UAAU,GAAG,CAAChB,KAAK,GAAGa,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAC3C,MAAMC,WAAW,GAAG,CAACnB,MAAM,GAAGc,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAE7C,IACErB,MAAM,CAACuB,YAAY,CAAC,OAAO,CAAC,KAAKH,UAAU,IAC3CpB,MAAM,CAACuB,YAAY,CAAC,QAAQ,CAAC,KAAKD,WAAW,EAC7C;IACAtB,MAAM,CAACwB,YAAY,CAAC,OAAO,EAAEJ,UAAU,CAAC;IACxCpB,MAAM,CAACwB,YAAY,CAAC,QAAQ,EAAEF,WAAW,CAAC;EAC5C;EAEA,MAAMG,OAAO,GAAGzB,MAAM,CAAC0B,UAAU,CAAC,QAAQ,CAAE;EAC5C;EACA;EACA,OAAOC,MAAM,CAACC,MAAM,CAACH,OAAO,EAAE;IAAEI,OAAO,EAAEA,CAAA,KAAM,CAAC;EAAE,CAAC,CAAC;AACtD;;AAEA;AACAX,MAAM,CAACY,QAAQ,GAAG;EAChBhC,gBAAgB;EAChBiC,uBAAuB,EAAEf,uBAAuB;EAChD;EACAgB,cAAc,EAAGC,UAAkB,IAAK,CAAC,CAAC;EAC1CpC;AACF,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../../commonjs/Canvas.js"],"names":[],"mappings":";AAgBA;;;;
|
|
1
|
+
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../../commonjs/Canvas.js"],"names":[],"mappings":";AAgBA;;;;QA8CC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../../module/Canvas.js"],"names":[],"mappings":"AAQO;;;;
|
|
1
|
+
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../../module/Canvas.js"],"names":[],"mappings":"AAQO;;;;2DA8CN;qBApDoB,cAAc;kBADqC,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../../src/Canvas.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../../src/Canvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAU9C,KAAK,cAAc,GAAG,MAAM,CAAC;AAE7B,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IAGrB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACjE,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,UAAU,CAAC,WAAW,EAAE,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC;IAC1D,gBAAgB,EAAE,MAAM,YAAY,CAAC;CACtC;AAED,UAAU,WAAY,SAAQ,SAAS;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;CAC5B;AAED,eAAO,MAAM,MAAM,GAAI,gCAAgC,WAAW,sBAiDjE,CAAC"}
|
|
@@ -13,6 +13,7 @@ declare global {
|
|
|
13
13
|
fabric: boolean;
|
|
14
14
|
getNativeSurface: (contextId: number) => NativeCanvas;
|
|
15
15
|
MakeWebGPUCanvasContext: (contextId: number, width: number, height: number) => RNCanvasContext;
|
|
16
|
+
destroyContext: (contextId: number) => void;
|
|
16
17
|
DecodeToUTF8: (buffer: NodeJS.ArrayBufferView | ArrayBuffer) => string;
|
|
17
18
|
createImageBitmap: typeof createImageBitmap;
|
|
18
19
|
loadVideoFrame: (path: string) => NativeVideoFrame;
|
|
@@ -34,6 +35,7 @@ declare global {
|
|
|
34
35
|
}
|
|
35
36
|
interface GPUExternalTexture {
|
|
36
37
|
destroy(): void;
|
|
38
|
+
readonly yuvToRgbMatrix: number[];
|
|
37
39
|
}
|
|
38
40
|
function createImageBitmap(image: ArrayBuffer | ArrayBufferView): Promise<ImageBitmap>;
|
|
39
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,gCAAgC,EAChC,YAAY,EACZ,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,gCAAgC,EAChC,oCAAoC,EACpC,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,SAAS;QACjB,GAAG,EAAE,GAAG,CAAC;KACV;IAED,IAAI,SAAS,EAAE,SAAS,CAAC;IAEzB,IAAI,QAAQ,EAAE;QACZ,GAAG,EAAE,GAAG,CAAC;QACT,MAAM,EAAE,OAAO,CAAC;QAChB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,YAAY,CAAC;QACtD,uBAAuB,EAAE,CACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,KACX,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,gCAAgC,EAChC,YAAY,EACZ,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,gCAAgC,EAChC,oCAAoC,EACpC,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,SAAS;QACjB,GAAG,EAAE,GAAG,CAAC;KACV;IAED,IAAI,SAAS,EAAE,SAAS,CAAC;IAEzB,IAAI,QAAQ,EAAE;QACZ,GAAG,EAAE,GAAG,CAAC;QACT,MAAM,EAAE,OAAO,CAAC;QAChB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,YAAY,CAAC;QACtD,uBAAuB,EAAE,CACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,KACX,eAAe,CAAC;QAGrB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,GAAG,WAAW,KAAK,MAAM,CAAC;QACvE,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;QAC5C,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,CAAC;QACnD,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,gBAAgB,CAAC;QAI1E,gCAAgC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,gBAAgB,CAAC;QACxE,iBAAiB,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,sBAAsB,KACjC,WAAW,CAAC;QACjB,kBAAkB,EAAE,MAAM,MAAM,CAAC;KAClC,CAAC;IAEF,UAAU,SAAS;QACjB,yBAAyB,CACvB,UAAU,EAAE,gCAAgC,GAC3C,sBAAsB,CAAC;QAC1B,iBAAiB,CAAC,UAAU,EAAE,wBAAwB,GAAG,cAAc,CAAC;KACzE;IAID,UAAU,mBAAmB;QAC3B,WAAW,CAAC,EAAE,wBAAwB,CAAC;KACxC;IAMD,UAAU,4BAA4B;QACpC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB;IASD,UAAU,kBAAkB;QAC1B,OAAO,IAAI,IAAI,CAAC;QAShB,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;KACnC;IAGD,SAAS,iBAAiB,CACxB,KAAK,EAAE,WAAW,GAAG,eAAe,GACnC,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-webgpu",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "React Native WebGPU",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"scripts": {
|
|
27
27
|
"test": "NODE_OPTIONS='--experimental-require-module' jest -i",
|
|
28
28
|
"test:ref": "REFERENCE=true NODE_OPTIONS='--experimental-require-module' jest -i",
|
|
29
|
+
"test:node": "NODE_WEBGPU=true NODE_OPTIONS='--experimental-require-module' jest -i",
|
|
29
30
|
"test:plugin": "jest -c plugin/jest.config.js",
|
|
30
31
|
"lint": "eslint . --ext .ts,.tsx --max-warnings 0 --cache --fix",
|
|
31
32
|
"tsc": "tsc --noEmit",
|
|
@@ -39,8 +40,7 @@
|
|
|
39
40
|
"clang-format-android": "find android/cpp/ -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.cpp\" | xargs clang-format -i",
|
|
40
41
|
"clang-format-common": "find cpp/rnwgpu -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.cpp\" | xargs clang-format -i",
|
|
41
42
|
"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=example --exclude=android/.cxx --exclude=cpp/webgpu --exclude=cpp/dawn --exclude=ios --exclude=android/build --exclude=node_modules --recursive .",
|
|
42
|
-
"install-dawn": "tsx scripts/install-dawn.ts"
|
|
43
|
-
"codegen": "tsx scripts/codegen/codegen.ts && yarn clang-format"
|
|
43
|
+
"install-dawn": "tsx scripts/install-dawn.ts"
|
|
44
44
|
},
|
|
45
45
|
"keywords": [
|
|
46
46
|
"react-native",
|
|
@@ -71,7 +71,6 @@
|
|
|
71
71
|
"@semantic-release/github": "^10.3.3",
|
|
72
72
|
"@semantic-release/release-notes-generator": "^14.0.1",
|
|
73
73
|
"@types/jest": "^29.5.12",
|
|
74
|
-
"@types/lodash": "^4.17.5",
|
|
75
74
|
"@types/node": "^20.14.7",
|
|
76
75
|
"@types/pixelmatch": "5.2.4",
|
|
77
76
|
"@types/pngjs": "^6.0.5",
|
|
@@ -88,7 +87,6 @@
|
|
|
88
87
|
"eslint-plugin-jest": "^28.8.2",
|
|
89
88
|
"eslint-plugin-prettier": "^5.2.1",
|
|
90
89
|
"jest": "^29.7.0",
|
|
91
|
-
"lodash": "^4.17.21",
|
|
92
90
|
"pixelmatch": "5.3.0",
|
|
93
91
|
"pngjs": "^7.0.0",
|
|
94
92
|
"prettier": "^3.0.3",
|
|
@@ -104,9 +102,9 @@
|
|
|
104
102
|
"semantic-release": "^24.1.0",
|
|
105
103
|
"semantic-release-yarn": "^3.0.2",
|
|
106
104
|
"teapot": "^1.0.0",
|
|
107
|
-
"ts-morph": "^22.0.0",
|
|
108
105
|
"tsx": "^4.20.5",
|
|
109
106
|
"typescript": "^5.2.2",
|
|
107
|
+
"webgpu": "0.4.0",
|
|
110
108
|
"wgpu-matrix": "^3.0.2",
|
|
111
109
|
"ws": "^8.18.0",
|
|
112
110
|
"yargs": "^17.7.2"
|
package/src/Canvas.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useImperativeHandle, useRef, useState } from "react";
|
|
1
|
+
import React, { useEffect, useImperativeHandle, useRef, useState } from "react";
|
|
2
2
|
import type { ViewProps } from "react-native";
|
|
3
3
|
import { View } from "react-native";
|
|
4
4
|
|
|
@@ -53,6 +53,16 @@ interface CanvasProps extends ViewProps {
|
|
|
53
53
|
export const Canvas = ({ transparent, ref, ...props }: CanvasProps) => {
|
|
54
54
|
const viewRef = useRef(null);
|
|
55
55
|
const [contextId, _] = useState(() => generateContextId());
|
|
56
|
+
// Retire the native registry entry for this contextId on unmount. When a
|
|
57
|
+
// native surface is still attached, this is a no-op and the native view's
|
|
58
|
+
// own teardown retires the entry instead — which keeps StrictMode's
|
|
59
|
+
// simulated unmount (which re-runs effects without unmounting native views)
|
|
60
|
+
// from orphaning a live surface.
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
return () => {
|
|
63
|
+
RNWebGPU.destroyContext(contextId);
|
|
64
|
+
};
|
|
65
|
+
}, [contextId]);
|
|
56
66
|
useImperativeHandle(ref, () => ({
|
|
57
67
|
getContextId: () => contextId,
|
|
58
68
|
getNativeSurface: () => {
|
|
@@ -55,5 +55,7 @@ function makeWebGPUCanvasContext(
|
|
|
55
55
|
window.RNWebGPU = {
|
|
56
56
|
getNativeSurface,
|
|
57
57
|
MakeWebGPUCanvasContext: makeWebGPUCanvasContext,
|
|
58
|
+
// On web the browser owns the canvas/context lifecycle; nothing to retire.
|
|
59
|
+
destroyContext: (_contextId: number) => {},
|
|
58
60
|
fabric,
|
|
59
61
|
};
|
package/src/index.tsx
CHANGED
|
@@ -47,6 +47,9 @@ declare global {
|
|
|
47
47
|
width: number,
|
|
48
48
|
height: number,
|
|
49
49
|
) => RNCanvasContext;
|
|
50
|
+
// Retires a canvas context; called by Canvas on unmount (the Canvas owns
|
|
51
|
+
// the native registry entry for its contextId).
|
|
52
|
+
destroyContext: (contextId: number) => void;
|
|
50
53
|
DecodeToUTF8: (buffer: NodeJS.ArrayBufferView | ArrayBuffer) => string;
|
|
51
54
|
createImageBitmap: typeof createImageBitmap;
|
|
52
55
|
loadVideoFrame: (path: string) => NativeVideoFrame;
|
|
@@ -93,6 +96,15 @@ declare global {
|
|
|
93
96
|
// pool (e.g. a camera/video player) and pile up GPU resources.
|
|
94
97
|
interface GPUExternalTexture {
|
|
95
98
|
destroy(): void;
|
|
99
|
+
// Non-spec extension: a 3x4 row-major matrix (12 numbers) mapping the
|
|
100
|
+
// sampled texel [r, g, b, 1] to gamma-encoded R'G'B'. On the Android
|
|
101
|
+
// opaque-YCbCr camera path, textureSampleBaseClampToEdge returns raw
|
|
102
|
+
// [Y, Cb, Cr] (Dawn hard-codes an RGB_IDENTITY Vulkan conversion); this
|
|
103
|
+
// matrix is derived per-buffer from the driver's suggested YCbCr model and
|
|
104
|
+
// range (BT.601/709/2020, full/narrow). Everywhere else (iOS, RGBA
|
|
105
|
+
// surfaces) it is the identity passthrough, so shaders can apply it
|
|
106
|
+
// unconditionally. Upload it as a uniform and multiply after sampling.
|
|
107
|
+
readonly yuvToRgbMatrix: number[];
|
|
96
108
|
}
|
|
97
109
|
|
|
98
110
|
// Extend createImageBitmap to accept ArrayBuffer/TypedArray (encoded image bytes)
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
package com.webgpu;
|
|
2
|
-
|
|
3
|
-
import android.content.Context;
|
|
4
|
-
import android.view.Surface;
|
|
5
|
-
import android.view.View;
|
|
6
|
-
import com.facebook.proguard.annotations.DoNotStrip;
|
|
7
|
-
|
|
8
|
-
public abstract class WebGPUBaseView extends View {
|
|
9
|
-
protected Integer mContextId;
|
|
10
|
-
|
|
11
|
-
public WebGPUBaseView(Context context, Integer contextId) {
|
|
12
|
-
super(context);
|
|
13
|
-
mContextId = contextId;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
protected void handleSurfaceCreate(Surface surface) {
|
|
17
|
-
float density = getResources().getDisplayMetrics().density;
|
|
18
|
-
float scaledWidth = getWidth() / density;
|
|
19
|
-
float scaledHeight = getHeight() / density;
|
|
20
|
-
onSurfaceCreate(surface, mContextId, scaledWidth, scaledHeight);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
protected void handleSurfaceChanged(Surface surface) {
|
|
24
|
-
float density = getResources().getDisplayMetrics().density;
|
|
25
|
-
float scaledWidth = getWidth() / density;
|
|
26
|
-
float scaledHeight = getHeight() / density;
|
|
27
|
-
onSurfaceChanged(surface, mContextId, scaledWidth, scaledHeight);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
protected void handleSurfaceDestroyed() {
|
|
31
|
-
onSurfaceDestroy(mContextId);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
@Override
|
|
35
|
-
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
36
|
-
super.onLayout(changed, left, top, right, bottom);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@DoNotStrip
|
|
41
|
-
private native void onSurfaceCreate(
|
|
42
|
-
Surface surface,
|
|
43
|
-
int contextId,
|
|
44
|
-
float width,
|
|
45
|
-
float height
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
@DoNotStrip
|
|
49
|
-
private native void onSurfaceChanged(
|
|
50
|
-
Surface surface,
|
|
51
|
-
int contextId,
|
|
52
|
-
float width,
|
|
53
|
-
float height
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
@DoNotStrip
|
|
57
|
-
private native void onSurfaceDestroy(int contextId);
|
|
58
|
-
|
|
59
|
-
@DoNotStrip
|
|
60
|
-
protected native void switchToOffscreenSurface(int contextId);
|
|
61
|
-
}
|