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.
Files changed (47) hide show
  1. package/android/cpp/AndroidPlatformContext.h +24 -9
  2. package/android/cpp/cpp-adapter.cpp +35 -13
  3. package/android/src/main/java/com/webgpu/WebGPUAHBView.java +2 -2
  4. package/android/src/main/java/com/webgpu/WebGPUAPI.java +7 -2
  5. package/android/src/main/java/com/webgpu/WebGPUSurfaceView.java +3 -1
  6. package/android/src/main/java/com/webgpu/WebGPUTextureView.java +11 -7
  7. package/android/src/main/java/com/webgpu/WebGPUView.java +10 -7
  8. package/android/src/main/java/com/webgpu/WebGPUViewManager.java +6 -0
  9. package/apple/MetalView.mm +33 -8
  10. package/cpp/rnwgpu/RNWebGPUManager.cpp +14 -1
  11. package/cpp/rnwgpu/RNWebGPUManager.h +9 -0
  12. package/cpp/rnwgpu/SurfaceRegistry.h +469 -131
  13. package/cpp/rnwgpu/api/GPUAdapter.cpp +43 -7
  14. package/cpp/rnwgpu/api/GPUAdapter.h +5 -4
  15. package/cpp/rnwgpu/api/GPUBuffer.cpp +12 -2
  16. package/cpp/rnwgpu/api/GPUBuffer.h +3 -2
  17. package/cpp/rnwgpu/api/GPUCanvasContext.cpp +33 -19
  18. package/cpp/rnwgpu/api/GPUCanvasContext.h +3 -1
  19. package/cpp/rnwgpu/api/GPUDevice.cpp +32 -17
  20. package/cpp/rnwgpu/api/GPUDevice.h +9 -7
  21. package/cpp/rnwgpu/api/GPUExternalTexture.cpp +105 -74
  22. package/cpp/rnwgpu/api/GPUExternalTexture.h +21 -2
  23. package/cpp/rnwgpu/api/GPUQueue.cpp +6 -2
  24. package/cpp/rnwgpu/api/GPUQueue.h +3 -3
  25. package/cpp/rnwgpu/api/GPUShaderModule.cpp +7 -2
  26. package/cpp/rnwgpu/api/GPUShaderModule.h +3 -3
  27. package/cpp/rnwgpu/api/RNWebGPU.h +22 -1
  28. package/cpp/rnwgpu/async/RuntimeContext.cpp +8 -1
  29. package/cpp/rnwgpu/async/RuntimeContext.h +9 -2
  30. package/lib/commonjs/Canvas.js +10 -0
  31. package/lib/commonjs/Canvas.js.map +1 -1
  32. package/lib/commonjs/WebPolyfillGPUModule.js +2 -0
  33. package/lib/commonjs/WebPolyfillGPUModule.js.map +1 -1
  34. package/lib/module/Canvas.js +11 -1
  35. package/lib/module/Canvas.js.map +1 -1
  36. package/lib/module/WebPolyfillGPUModule.js +2 -0
  37. package/lib/module/WebPolyfillGPUModule.js.map +1 -1
  38. package/lib/typescript/lib/commonjs/Canvas.d.ts.map +1 -1
  39. package/lib/typescript/lib/module/Canvas.d.ts.map +1 -1
  40. package/lib/typescript/src/Canvas.d.ts.map +1 -1
  41. package/lib/typescript/src/index.d.ts +2 -0
  42. package/lib/typescript/src/index.d.ts.map +1 -1
  43. package/package.json +4 -6
  44. package/src/Canvas.tsx +11 -1
  45. package/src/WebPolyfillGPUModule.ts +2 -0
  46. package/src/index.tsx +12 -0
  47. 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
- return _async->postTask(
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
- installMethod(runtime, prototype, "onSubmittedWorkDone",
64
- &GPUQueue::onSubmittedWorkDone);
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 GPUShaderModule::getCompilationInfo() {
10
+ async::AsyncTaskHandle
11
+ GPUShaderModule::getCompilationInfo(jsi::Runtime &runtime) {
11
12
  auto module = _instance;
12
13
 
13
- return _async->postTask(
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
- installMethod(runtime, prototype, "getCompilationInfo",
45
- &GPUShaderModule::getCompilationInfo);
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, double height) {
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 &registry = 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
- static const auto uuid = jsi::UUID();
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. Create and use a GPUDevice (and the buffers/queues derived
60
- * from it) on the same runtime that requested the adapter.
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:
@@ -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","RNWebGPU","getContext","contextName","Error","current","view","size","getBoundingClientRect","unstable_getBoundingClientRect","MakeWebGPUCanvasContext","width","height","createElement","View","collapsable","style","flex","exports"],"sourceRoot":"../../src","sources":["Canvas.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,0BAAA,GAAAC,sBAAA,CAAAH,OAAA;AAA2D,SAAAG,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAL,wBAAAK,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAT,uBAAA,YAAAA,CAAAK,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAAA,SAAAgB,SAAA,WAAAA,QAAA,GAAAH,MAAA,CAAAI,MAAA,GAAAJ,MAAA,CAAAI,MAAA,CAAAC,IAAA,eAAAf,CAAA,aAAAN,CAAA,MAAAA,CAAA,GAAAsB,SAAA,CAAAC,MAAA,EAAAvB,CAAA,UAAAG,CAAA,GAAAmB,SAAA,CAAAtB,CAAA,YAAAK,CAAA,IAAAF,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAZ,CAAA,EAAAE,CAAA,MAAAC,CAAA,CAAAD,CAAA,IAAAF,CAAA,CAAAE,CAAA,aAAAC,CAAA,KAAAa,QAAA,CAAAK,KAAA,OAAAF,SAAA;AAE3D,IAAIG,eAAe,GAAG,CAAC;AACvB,SAASC,iBAAiBA,CAAA,EAAG;EAC3B,OAAOD,eAAe,EAAE;AAC1B;AA2CO,MAAME,MAAM,GAAGA,CAAC;EAAEC,WAAW;EAAEC,GAAG;EAAE,GAAGC;AAAmB,CAAC,KAAK;EACrE,MAAMC,OAAO,GAAG,IAAAC,aAAM,EAAC,IAAI,CAAC;EAC5B,MAAM,CAACC,SAAS,EAAEC,CAAC,CAAC,GAAG,IAAAC,eAAQ,EAAC,MAAMT,iBAAiB,CAAC,CAAC,CAAC;EAC1D,IAAAU,0BAAmB,EAACP,GAAG,EAAE,OAAO;IAC9BQ,YAAY,EAAEA,CAAA,KAAMJ,SAAS;IAC7BK,gBAAgB,EAAEA,CAAA,KAAM;MACtB,OAAOC,QAAQ,CAACD,gBAAgB,CAACL,SAAS,CAAC;IAC7C,CAAC;IACDO,UAAUA,CAACC,WAAqB,EAA0B;MACxD,IAAIA,WAAW,KAAK,QAAQ,EAAE;QAC5B,MAAM,IAAIC,KAAK,CAAC,iCAAiCD,WAAW,EAAE,CAAC;MACjE;MACA,IAAI,CAACV,OAAO,CAACY,OAAO,EAAE;QACpB,MAAM,IAAID,KAAK,CAAC,0CAA0C,CAAC;MAC7D;MACA;MACA;MACA,MAAME,IAAI,GAAGb,OAAO,CAACY,OAAc;MACnC,MAAME,IAAI,GACR,uBAAuB,IAAID,IAAI,GAC3BA,IAAI,CAACE,qBAAqB,CAAC,CAAC,GAC5BF,IAAI,CAACG,8BAA8B,CAAC,CAAC;MAC3C,OAAOR,QAAQ,CAACS,uBAAuB,CACrCf,SAAS,EACTY,IAAI,CAACI,KAAK,EACVJ,IAAI,CAACK,MACP,CAAC;IACH;EACF,CAAC,CAAC,CAAC;EAEH,oBACExD,MAAA,CAAAQ,OAAA,CAAAiD,aAAA,CAACtD,YAAA,CAAAuD,IAAI,EAAAjC,QAAA;IAACkC,WAAW,EAAE,KAAM;IAACxB,GAAG,EAAEE;EAAQ,GAAKD,KAAK,gBAC/CpC,MAAA,CAAAQ,OAAA,CAAAiD,aAAA,CAACrD,0BAAA,CAAAI,OAAgB;IACfoD,KAAK,EAAE;MAAEC,IAAI,EAAE;IAAE,CAAE;IACnBtB,SAAS,EAAEA,SAAU;IACrBL,WAAW,EAAE,CAAC,CAACA;EAAY,CAC5B,CACG,CAAC;AAEX,CAAC;AAAC4B,OAAA,CAAA7B,MAAA,GAAAA,MAAA","ignoreList":[]}
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;EAChDpB;AACF,CAAC","ignoreList":[]}
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":[]}
@@ -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: () => {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useImperativeHandle","useRef","useState","View","WebGPUNativeView","CONTEXT_COUNTER","generateContextId","Canvas","transparent","ref","props","viewRef","contextId","_","getContextId","getNativeSurface","RNWebGPU","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,mBAAmB,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAEpE,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;EAC1DN,mBAAmB,CAACS,GAAG,EAAE,OAAO;IAC9BK,YAAY,EAAEA,CAAA,KAAMF,SAAS;IAC7BG,gBAAgB,EAAEA,CAAA,KAAM;MACtB,OAAOC,QAAQ,CAACD,gBAAgB,CAACH,SAAS,CAAC;IAC7C,CAAC;IACDK,UAAUA,CAACC,WAAqB,EAA0B;MACxD,IAAIA,WAAW,KAAK,QAAQ,EAAE;QAC5B,MAAM,IAAIC,KAAK,CAAC,iCAAiCD,WAAW,EAAE,CAAC;MACjE;MACA,IAAI,CAACP,OAAO,CAACS,OAAO,EAAE;QACpB,MAAM,IAAID,KAAK,CAAC,0CAA0C,CAAC;MAC7D;MACA;MACA;MACA,MAAME,IAAI,GAAGV,OAAO,CAACS,OAAc;MACnC,MAAME,IAAI,GACR,uBAAuB,IAAID,IAAI,GAC3BA,IAAI,CAACE,qBAAqB,CAAC,CAAC,GAC5BF,IAAI,CAACG,8BAA8B,CAAC,CAAC;MAC3C,OAAOR,QAAQ,CAACS,uBAAuB,CACrCb,SAAS,EACTU,IAAI,CAACI,KAAK,EACVJ,IAAI,CAACK,MACP,CAAC;IACH;EACF,CAAC,CAAC,CAAC;EAEH,oBACE5B,KAAA,CAAA6B,aAAA,CAACzB,IAAI,EAAA0B,QAAA;IAACC,WAAW,EAAE,KAAM;IAACrB,GAAG,EAAEE;EAAQ,GAAKD,KAAK,gBAC/CX,KAAA,CAAA6B,aAAA,CAACxB,gBAAgB;IACf2B,KAAK,EAAE;MAAEC,IAAI,EAAE;IAAE,CAAE;IACnBpB,SAAS,EAAEA,SAAU;IACrBJ,WAAW,EAAE,CAAC,CAACA;EAAY,CAC5B,CACG,CAAC;AAEX,CAAC","ignoreList":[]}
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;EAChDnB;AACF,CAAC","ignoreList":[]}
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;;;;QAoCC"}
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;;;;2DAoCN;qBA1CoB,cAAc;kBAD0B,OAAO"}
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,KAAgD,MAAM,OAAO,CAAC;AACrE,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,sBAuCjE,CAAC"}
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;QACrB,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;KACjB;IAGD,SAAS,iBAAiB,CACxB,KAAK,EAAE,WAAW,GAAG,eAAe,GACnC,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB"}
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.5.18",
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
- }