react-native-webgpu 0.10.2 → 0.10.4
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/cpp-adapter.cpp +142 -1
- package/android/src/main/java/com/webgpu/WebGPUAPI.java +2 -0
- package/android/src/main/java/com/webgpu/WebGPUHardwareBufferView.java +278 -0
- package/android/src/main/java/com/webgpu/WebGPUView.java +49 -12
- package/cpp/jsi/JSICache.cpp +23 -0
- package/cpp/jsi/JSICache.h +28 -1
- package/cpp/jsi/NativeObject.h +86 -50
- package/cpp/rnwgpu/SurfaceRegistry.h +613 -0
- package/cpp/rnwgpu/api/GPUFeatures.h +1 -1
- package/lib/commonjs/Canvas.js +1 -1
- package/lib/commonjs/Canvas.js.map +1 -1
- package/lib/module/Canvas.js +1 -1
- package/lib/module/Canvas.js.map +1 -1
- package/lib/typescript/src/Canvas.d.ts +6 -4
- package/lib/typescript/src/Canvas.d.ts.map +1 -1
- package/lib/typescript/src/WebGPUViewNativeComponent.d.ts +1 -1
- package/lib/typescript/src/WebGPUViewNativeComponent.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Canvas.tsx +10 -5
- package/src/WebGPUViewNativeComponent.ts +1 -1
- package/android/src/main/java/com/webgpu/WebGPUAHBView.java +0 -298
|
@@ -98,7 +98,7 @@ namespace rnwgpu {
|
|
|
98
98
|
V(DawnTexelCopyBufferRowAlignment, "dawn-texel-copy-buffer-row-alignment") \
|
|
99
99
|
V(FlexibleTextureViews, "flexible-texture-views") \
|
|
100
100
|
V(ChromiumExperimentalSubgroupMatrix, \
|
|
101
|
-
"chromium-experimental-
|
|
101
|
+
"chromium-experimental-subgroup-matrix") \
|
|
102
102
|
V(SharedFenceEGLSync, "shared-fence-egl-sync") \
|
|
103
103
|
V(DawnDeviceAllocatorControl, "dawn-device-allocator-control") \
|
|
104
104
|
V(AdapterPropertiesWGPU, "adapter-properties-wgpu") \
|
package/lib/commonjs/Canvas.js
CHANGED
|
@@ -16,7 +16,7 @@ function generateContextId() {
|
|
|
16
16
|
}
|
|
17
17
|
// Anything else reaching the native component would hit the generated
|
|
18
18
|
// string-enum parser, which aborts on unknown values.
|
|
19
|
-
const resolveSurfaceType = surfaceType => surfaceType === "SurfaceView" || surfaceType === "TextureView" ? surfaceType : "auto";
|
|
19
|
+
const resolveSurfaceType = surfaceType => surfaceType === "SurfaceView" || surfaceType === "TextureView" || surfaceType === "HardwareBufferView" ? surfaceType : "auto";
|
|
20
20
|
const Canvas = ({
|
|
21
21
|
opaque = true,
|
|
22
22
|
android,
|
|
@@ -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","resolveSurfaceType","surfaceType","Canvas","opaque","android","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","androidSurfaceType","androidZOrderOnTop","zOrderOnTop","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;
|
|
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","resolveSurfaceType","surfaceType","Canvas","opaque","android","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","androidSurfaceType","androidZOrderOnTop","zOrderOnTop","exports"],"sourceRoot":"../../src","sources":["Canvas.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/Canvas.js
CHANGED
|
@@ -8,7 +8,7 @@ function generateContextId() {
|
|
|
8
8
|
}
|
|
9
9
|
// Anything else reaching the native component would hit the generated
|
|
10
10
|
// string-enum parser, which aborts on unknown values.
|
|
11
|
-
const resolveSurfaceType = surfaceType => surfaceType === "SurfaceView" || surfaceType === "TextureView" ? surfaceType : "auto";
|
|
11
|
+
const resolveSurfaceType = surfaceType => surfaceType === "SurfaceView" || surfaceType === "TextureView" || surfaceType === "HardwareBufferView" ? surfaceType : "auto";
|
|
12
12
|
export const Canvas = ({
|
|
13
13
|
opaque = true,
|
|
14
14
|
android,
|
package/lib/module/Canvas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useImperativeHandle","useRef","useState","View","WebGPUNativeView","CONTEXT_COUNTER","generateContextId","resolveSurfaceType","surfaceType","Canvas","opaque","android","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","androidSurfaceType","androidZOrderOnTop","zOrderOnTop"],"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;
|
|
1
|
+
{"version":3,"names":["React","useEffect","useImperativeHandle","useRef","useState","View","WebGPUNativeView","CONTEXT_COUNTER","generateContextId","resolveSurfaceType","surfaceType","Canvas","opaque","android","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","androidSurfaceType","androidZOrderOnTop","zOrderOnTop"],"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;AAqEA;AACA;AACA,MAAME,kBAAkB,GACtBC,WAA2C,IAE3CA,WAAW,KAAK,aAAa,IAC7BA,WAAW,KAAK,aAAa,IAC7BA,WAAW,KAAK,oBAAoB,GAChCA,WAAW,GACX,MAAM;AAEZ,OAAO,MAAMC,MAAM,GAAGA,CAAC;EACrBC,MAAM,GAAG,IAAI;EACbC,OAAO;EACPC,GAAG;EACH,GAAGC;AACQ,CAAC,KAAK;EACjB,MAAMC,OAAO,GAAGb,MAAM,CAAC,IAAI,CAAC;EAC5B,MAAM,CAACc,SAAS,EAAEC,CAAC,CAAC,GAAGd,QAAQ,CAAC,MAAMI,iBAAiB,CAAC,CAAC,CAAC;EAC1D;EACA;EACA;EACA;EACA;EACAP,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACXkB,QAAQ,CAACC,cAAc,CAACH,SAAS,CAAC;IACpC,CAAC;EACH,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EACff,mBAAmB,CAACY,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,oBACEjC,KAAA,CAAAkC,aAAA,CAAC7B,IAAI,EAAA8B,QAAA;IAACC,WAAW,EAAE,KAAM;IAACtB,GAAG,EAAEE;EAAQ,GAAKD,KAAK,gBAC/Cf,KAAA,CAAAkC,aAAA,CAAC5B,gBAAgB;IACf+B,KAAK,EAAE;MAAEC,IAAI,EAAE;IAAE,CAAE;IACnBrB,SAAS,EAAEA,SAAU;IACrBL,MAAM,EAAEA,MAAO;IACf2B,kBAAkB,EAAE9B,kBAAkB,CAACI,OAAO,EAAEH,WAAW,CAAE;IAC7D8B,kBAAkB,EAAE,CAAC,CAAC3B,OAAO,EAAE4B;EAAY,CAC5C,CACG,CAAC;AAEX,CAAC","ignoreList":[]}
|
|
@@ -30,12 +30,14 @@ export interface CanvasRef {
|
|
|
30
30
|
getContext(contextName: "webgpu"): RNCanvasContext | null;
|
|
31
31
|
getNativeSurface: () => NativeCanvas;
|
|
32
32
|
}
|
|
33
|
-
export type AndroidSurfaceType = "SurfaceView" | "TextureView";
|
|
33
|
+
export type AndroidSurfaceType = "SurfaceView" | "TextureView" | "HardwareBufferView";
|
|
34
34
|
export interface AndroidCanvasProps {
|
|
35
35
|
/**
|
|
36
|
-
* Backing view. Defaults to `SurfaceView` when the canvas is opaque and
|
|
37
|
-
* `TextureView` otherwise
|
|
38
|
-
*
|
|
36
|
+
* Backing view. Defaults to `SurfaceView` when the canvas is opaque and to
|
|
37
|
+
* `TextureView` otherwise; both composite correctly in React Native
|
|
38
|
+
* stacking order without further flags. `HardwareBufferView` (Android 10+,
|
|
39
|
+
* a plain View that draws each frame's AHardwareBuffer inline with no extra
|
|
40
|
+
* copy) is opt-in and experimental; on older devices it uses `TextureView`.
|
|
39
41
|
*/
|
|
40
42
|
surfaceType?: AndroidSurfaceType;
|
|
41
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
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,MAAM,MAAM,kBAAkB,
|
|
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,MAAM,MAAM,kBAAkB,GAC5B,aAAa,GAAG,aAAa,GAAG,oBAAoB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;CAC5B;AAaD,eAAO,MAAM,MAAM,GAAI,oCAKpB,WAAW,sBAmDb,CAAC"}
|
|
@@ -3,7 +3,7 @@ import type { ViewProps } from "react-native";
|
|
|
3
3
|
export interface NativeProps extends ViewProps {
|
|
4
4
|
contextId: Int32;
|
|
5
5
|
opaque?: WithDefault<boolean, true>;
|
|
6
|
-
androidSurfaceType?: WithDefault<"auto" | "SurfaceView" | "TextureView", "auto">;
|
|
6
|
+
androidSurfaceType?: WithDefault<"auto" | "SurfaceView" | "TextureView" | "HardwareBufferView", "auto">;
|
|
7
7
|
androidZOrderOnTop?: WithDefault<boolean, false>;
|
|
8
8
|
}
|
|
9
9
|
declare const _default: import("react-native").HostComponent<NativeProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebGPUViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/WebGPUViewNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EACZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpC,kBAAkB,CAAC,EAAE,WAAW,CAC9B,MAAM,GAAG,aAAa,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"WebGPUViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/WebGPUViewNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EACZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpC,kBAAkB,CAAC,EAAE,WAAW,CAC9B,MAAM,GAAG,aAAa,GAAG,aAAa,GAAG,oBAAoB,EAC7D,MAAM,CACP,CAAC;IACF,kBAAkB,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;CAClD;;AAGD,wBAAiE"}
|
package/package.json
CHANGED
package/src/Canvas.tsx
CHANGED
|
@@ -45,13 +45,16 @@ export interface CanvasRef {
|
|
|
45
45
|
getNativeSurface: () => NativeCanvas;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
export type AndroidSurfaceType =
|
|
48
|
+
export type AndroidSurfaceType =
|
|
49
|
+
"SurfaceView" | "TextureView" | "HardwareBufferView";
|
|
49
50
|
|
|
50
51
|
export interface AndroidCanvasProps {
|
|
51
52
|
/**
|
|
52
|
-
* Backing view. Defaults to `SurfaceView` when the canvas is opaque and
|
|
53
|
-
* `TextureView` otherwise
|
|
54
|
-
*
|
|
53
|
+
* Backing view. Defaults to `SurfaceView` when the canvas is opaque and to
|
|
54
|
+
* `TextureView` otherwise; both composite correctly in React Native
|
|
55
|
+
* stacking order without further flags. `HardwareBufferView` (Android 10+,
|
|
56
|
+
* a plain View that draws each frame's AHardwareBuffer inline with no extra
|
|
57
|
+
* copy) is opt-in and experimental; on older devices it uses `TextureView`.
|
|
55
58
|
*/
|
|
56
59
|
surfaceType?: AndroidSurfaceType;
|
|
57
60
|
/**
|
|
@@ -78,7 +81,9 @@ export interface CanvasProps extends ViewProps {
|
|
|
78
81
|
const resolveSurfaceType = (
|
|
79
82
|
surfaceType: AndroidSurfaceType | undefined,
|
|
80
83
|
): "auto" | AndroidSurfaceType =>
|
|
81
|
-
surfaceType === "SurfaceView" ||
|
|
84
|
+
surfaceType === "SurfaceView" ||
|
|
85
|
+
surfaceType === "TextureView" ||
|
|
86
|
+
surfaceType === "HardwareBufferView"
|
|
82
87
|
? surfaceType
|
|
83
88
|
: "auto";
|
|
84
89
|
|
|
@@ -9,7 +9,7 @@ export interface NativeProps extends ViewProps {
|
|
|
9
9
|
contextId: Int32;
|
|
10
10
|
opaque?: WithDefault<boolean, true>;
|
|
11
11
|
androidSurfaceType?: WithDefault<
|
|
12
|
-
"auto" | "SurfaceView" | "TextureView",
|
|
12
|
+
"auto" | "SurfaceView" | "TextureView" | "HardwareBufferView",
|
|
13
13
|
"auto"
|
|
14
14
|
>;
|
|
15
15
|
androidZOrderOnTop?: WithDefault<boolean, false>;
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
package com.webgpu;
|
|
2
|
-
|
|
3
|
-
import android.annotation.SuppressLint;
|
|
4
|
-
import android.content.Context;
|
|
5
|
-
import android.graphics.Bitmap;
|
|
6
|
-
import android.graphics.Canvas;
|
|
7
|
-
import android.graphics.Paint;
|
|
8
|
-
import android.graphics.PixelFormat;
|
|
9
|
-
import android.graphics.Rect;
|
|
10
|
-
import android.hardware.HardwareBuffer;
|
|
11
|
-
import android.media.Image;
|
|
12
|
-
import android.media.ImageReader;
|
|
13
|
-
import android.os.Build;
|
|
14
|
-
import android.os.Handler;
|
|
15
|
-
import android.os.Looper;
|
|
16
|
-
import android.view.Surface;
|
|
17
|
-
import android.view.View;
|
|
18
|
-
|
|
19
|
-
import androidx.annotation.NonNull;
|
|
20
|
-
import androidx.annotation.RequiresApi;
|
|
21
|
-
|
|
22
|
-
import java.nio.ByteBuffer;
|
|
23
|
-
|
|
24
|
-
@RequiresApi(api = Build.VERSION_CODES.Q)
|
|
25
|
-
@SuppressLint("ViewConstructor")
|
|
26
|
-
public class WebGPUAHBView extends View implements ImageReader.OnImageAvailableListener {
|
|
27
|
-
|
|
28
|
-
private static final int MAX_IMAGES = 3;
|
|
29
|
-
private static final String TAG = "WebGPUAHBView";
|
|
30
|
-
|
|
31
|
-
private final WebGPUAPI mApi;
|
|
32
|
-
private ImageReader mImageReader;
|
|
33
|
-
private Surface mSurface;
|
|
34
|
-
private Image mCurrentImage;
|
|
35
|
-
private Bitmap mCachedBitmap;
|
|
36
|
-
private final Paint mPaint;
|
|
37
|
-
private final Handler mHandler;
|
|
38
|
-
private final Object mImageLock = new Object();
|
|
39
|
-
private boolean mSurfaceCreated = false;
|
|
40
|
-
private int mConfiguredWidth = 0;
|
|
41
|
-
private int mConfiguredHeight = 0;
|
|
42
|
-
|
|
43
|
-
public WebGPUAHBView(Context context, WebGPUAPI api) {
|
|
44
|
-
super(context);
|
|
45
|
-
mApi = api;
|
|
46
|
-
mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
|
|
47
|
-
mHandler = new Handler(Looper.getMainLooper());
|
|
48
|
-
|
|
49
|
-
// Enable hardware acceleration for this view
|
|
50
|
-
setLayerType(LAYER_TYPE_HARDWARE, null);
|
|
51
|
-
|
|
52
|
-
// Make sure we get drawn
|
|
53
|
-
setWillNotDraw(false);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
@Override
|
|
57
|
-
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
|
58
|
-
super.onSizeChanged(w, h, oldw, oldh);
|
|
59
|
-
|
|
60
|
-
if (w > 0 && h > 0) {
|
|
61
|
-
// Recreate ImageReader with new dimensions
|
|
62
|
-
setupImageReader(w, h);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
private void setupImageReader(int width, int height) {
|
|
67
|
-
// Don't recreate if dimensions haven't changed
|
|
68
|
-
if (width == mConfiguredWidth && height == mConfiguredHeight && mImageReader != null) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Clean up previous ImageReader
|
|
73
|
-
cleanupImageReader();
|
|
74
|
-
|
|
75
|
-
try {
|
|
76
|
-
// Create ImageReader with HardwareBuffer support
|
|
77
|
-
mImageReader = ImageReader.newInstance(
|
|
78
|
-
width,
|
|
79
|
-
height,
|
|
80
|
-
PixelFormat.RGBA_8888,
|
|
81
|
-
MAX_IMAGES,
|
|
82
|
-
HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE |
|
|
83
|
-
HardwareBuffer.USAGE_GPU_COLOR_OUTPUT |
|
|
84
|
-
HardwareBuffer.USAGE_COMPOSER_OVERLAY |
|
|
85
|
-
HardwareBuffer.USAGE_CPU_READ_RARELY // For fallback to Bitmap if needed
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
mImageReader.setOnImageAvailableListener(this, mHandler);
|
|
89
|
-
|
|
90
|
-
// Get the Surface for WebGPU to render to
|
|
91
|
-
mSurface = mImageReader.getSurface();
|
|
92
|
-
|
|
93
|
-
mConfiguredWidth = width;
|
|
94
|
-
mConfiguredHeight = height;
|
|
95
|
-
|
|
96
|
-
// Notify WebGPU about the new surface
|
|
97
|
-
if (!mSurfaceCreated) {
|
|
98
|
-
mApi.surfaceCreated(mSurface);
|
|
99
|
-
mSurfaceCreated = true;
|
|
100
|
-
} else {
|
|
101
|
-
mApi.surfaceChanged(mSurface);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
} catch (Exception e) {
|
|
105
|
-
e.printStackTrace();
|
|
106
|
-
// Fallback to offscreen if ImageReader creation fails
|
|
107
|
-
mApi.surfaceOffscreen();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@Override
|
|
112
|
-
public void onImageAvailable(ImageReader reader) {
|
|
113
|
-
synchronized (mImageLock) {
|
|
114
|
-
// Close previous image if exists
|
|
115
|
-
if (mCurrentImage != null) {
|
|
116
|
-
mCurrentImage.close();
|
|
117
|
-
mCurrentImage = null;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
// Get the latest image
|
|
122
|
-
mCurrentImage = reader.acquireLatestImage();
|
|
123
|
-
|
|
124
|
-
if (mCurrentImage != null) {
|
|
125
|
-
// Request a redraw on the UI thread
|
|
126
|
-
postInvalidateOnAnimation();
|
|
127
|
-
}
|
|
128
|
-
} catch (Exception e) {
|
|
129
|
-
e.printStackTrace();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
@Override
|
|
135
|
-
protected void onDraw(Canvas canvas) {
|
|
136
|
-
super.onDraw(canvas);
|
|
137
|
-
|
|
138
|
-
synchronized (mImageLock) {
|
|
139
|
-
if (mCurrentImage == null) {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
// Try to use HardwareBuffer directly (most efficient path)
|
|
145
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
146
|
-
HardwareBuffer hardwareBuffer = mCurrentImage.getHardwareBuffer();
|
|
147
|
-
|
|
148
|
-
if (hardwareBuffer != null) {
|
|
149
|
-
// Draw using HardwareBuffer
|
|
150
|
-
drawHardwareBuffer(canvas, hardwareBuffer);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Fallback: Convert Image to Bitmap
|
|
156
|
-
drawImageAsBitmap(canvas, mCurrentImage);
|
|
157
|
-
|
|
158
|
-
} catch (Exception e) {
|
|
159
|
-
e.printStackTrace();
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
private void drawHardwareBuffer(Canvas canvas, HardwareBuffer hardwareBuffer) {
|
|
165
|
-
// On Android Q+, we can create a Bitmap from HardwareBuffer
|
|
166
|
-
try {
|
|
167
|
-
// Create or reuse bitmap with matching dimensions
|
|
168
|
-
if (mCachedBitmap == null ||
|
|
169
|
-
mCachedBitmap.getWidth() != hardwareBuffer.getWidth() ||
|
|
170
|
-
mCachedBitmap.getHeight() != hardwareBuffer.getHeight()) {
|
|
171
|
-
|
|
172
|
-
if (mCachedBitmap != null) {
|
|
173
|
-
mCachedBitmap.recycle();
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Create a hardware-backed Bitmap from the HardwareBuffer
|
|
177
|
-
mCachedBitmap = Bitmap.wrapHardwareBuffer(hardwareBuffer, null);
|
|
178
|
-
} else {
|
|
179
|
-
// Reuse existing bitmap and update with new HardwareBuffer content
|
|
180
|
-
mCachedBitmap = Bitmap.wrapHardwareBuffer(hardwareBuffer, null);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (mCachedBitmap != null) {
|
|
184
|
-
// Draw the bitmap to canvas
|
|
185
|
-
canvas.drawBitmap(mCachedBitmap, 0, 0, mPaint);
|
|
186
|
-
}
|
|
187
|
-
} catch (Exception e) {
|
|
188
|
-
e.printStackTrace();
|
|
189
|
-
// Fallback to Image-based rendering
|
|
190
|
-
drawImageAsBitmap(canvas, mCurrentImage);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
private void drawImageAsBitmap(Canvas canvas, Image image) {
|
|
195
|
-
// Fallback method: manually convert Image to Bitmap
|
|
196
|
-
if (image.getFormat() != PixelFormat.RGBA_8888) {
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
Image.Plane[] planes = image.getPlanes();
|
|
201
|
-
if (planes.length == 0) {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
ByteBuffer buffer = planes[0].getBuffer();
|
|
206
|
-
int pixelStride = planes[0].getPixelStride();
|
|
207
|
-
int rowStride = planes[0].getRowStride();
|
|
208
|
-
int rowPadding = rowStride - pixelStride * image.getWidth();
|
|
209
|
-
|
|
210
|
-
// Create or reuse bitmap
|
|
211
|
-
int bitmapWidth = image.getWidth() + rowPadding / pixelStride;
|
|
212
|
-
if (mCachedBitmap == null ||
|
|
213
|
-
mCachedBitmap.getWidth() != bitmapWidth ||
|
|
214
|
-
mCachedBitmap.getHeight() != image.getHeight()) {
|
|
215
|
-
|
|
216
|
-
if (mCachedBitmap != null) {
|
|
217
|
-
mCachedBitmap.recycle();
|
|
218
|
-
}
|
|
219
|
-
mCachedBitmap = Bitmap.createBitmap(
|
|
220
|
-
bitmapWidth,
|
|
221
|
-
image.getHeight(),
|
|
222
|
-
Bitmap.Config.ARGB_8888
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
mCachedBitmap.copyPixelsFromBuffer(buffer);
|
|
227
|
-
|
|
228
|
-
// Draw only the valid portion (without padding)
|
|
229
|
-
Rect src = new Rect(0, 0, image.getWidth(), image.getHeight());
|
|
230
|
-
Rect dst = new Rect(0, 0, getWidth(), getHeight());
|
|
231
|
-
canvas.drawBitmap(mCachedBitmap, src, dst, mPaint);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
private void cleanupImageReader() {
|
|
235
|
-
synchronized (mImageLock) {
|
|
236
|
-
if (mCurrentImage != null) {
|
|
237
|
-
mCurrentImage.close();
|
|
238
|
-
mCurrentImage = null;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if (mImageReader != null) {
|
|
242
|
-
mImageReader.close();
|
|
243
|
-
mImageReader = null;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (mSurface != null) {
|
|
247
|
-
mSurface.release();
|
|
248
|
-
mSurface = null;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
@Override
|
|
254
|
-
protected void onDetachedFromWindow() {
|
|
255
|
-
super.onDetachedFromWindow();
|
|
256
|
-
|
|
257
|
-
// Detach: rendering falls back to the offscreen texture until reattach.
|
|
258
|
-
if (mSurfaceCreated) {
|
|
259
|
-
mApi.surfaceOffscreen();
|
|
260
|
-
mSurfaceCreated = false;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Clean up resources
|
|
264
|
-
cleanupImageReader();
|
|
265
|
-
|
|
266
|
-
if (mCachedBitmap != null) {
|
|
267
|
-
mCachedBitmap.recycle();
|
|
268
|
-
mCachedBitmap = null;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
@Override
|
|
273
|
-
protected void onAttachedToWindow() {
|
|
274
|
-
super.onAttachedToWindow();
|
|
275
|
-
|
|
276
|
-
// Re-setup if we have valid dimensions
|
|
277
|
-
if (getWidth() > 0 && getHeight() > 0) {
|
|
278
|
-
setupImageReader(getWidth(), getHeight());
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
@Override
|
|
283
|
-
public void setAlpha(float alpha) {
|
|
284
|
-
super.setAlpha(alpha);
|
|
285
|
-
mPaint.setAlpha((int) (alpha * 255));
|
|
286
|
-
invalidate();
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
@Override
|
|
290
|
-
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
|
|
291
|
-
super.onVisibilityChanged(changedView, visibility);
|
|
292
|
-
|
|
293
|
-
if (visibility == VISIBLE && mSurface == null && getWidth() > 0 && getHeight() > 0) {
|
|
294
|
-
// Re-create surface if needed when becoming visible
|
|
295
|
-
setupImageReader(getWidth(), getHeight());
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|