react-native-webgpu 0.10.5 → 0.11.0
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 +60 -3
- package/android/cpp/cpp-adapter.cpp +66 -6
- package/android/src/main/java/com/webgpu/ViewSnapshot.java +162 -0
- package/android/src/main/java/com/webgpu/WebGPUModule.java +68 -0
- package/apple/ApplePlatformContext.h +14 -1
- package/apple/ApplePlatformContext.mm +176 -1
- package/apple/WebGPUModule.mm +20 -1
- package/cpp/rnwgpu/PlatformContext.h +55 -0
- package/cpp/rnwgpu/RNWebGPUManager.cpp +7 -0
- package/cpp/rnwgpu/api/GPUQueue.cpp +187 -0
- package/cpp/rnwgpu/api/GPUQueue.h +16 -0
- package/cpp/rnwgpu/api/descriptors/GPUDrawElementImageDestination.h +60 -0
- package/cpp/rnwgpu/api/descriptors/GPUDrawElementImageSource.h +106 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/main/index.js +33 -0
- package/lib/commonjs/main/index.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/main/index.js +33 -0
- package/lib/module/main/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +5 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/main/index.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +13 -0
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +29 -0
- package/src/main/index.tsx +49 -0
- package/src/types.ts +29 -0
package/lib/module/main/index.js
CHANGED
|
@@ -1,6 +1,38 @@
|
|
|
1
|
+
import { findNodeHandle } from "react-native";
|
|
1
2
|
import { registerWebGPUForReanimated } from "../external";
|
|
2
3
|
import { provideGPUForInstall } from "../install";
|
|
3
4
|
import WebGPUModule from "../NativeWebGPUModule";
|
|
5
|
+
// Resolve the `source` of drawElementImageToTexture to a React tag on the
|
|
6
|
+
// main JS runtime, where findNodeHandle is available: it handles class
|
|
7
|
+
// components and legacy host instances that the native fallback (a number or
|
|
8
|
+
// an instance carrying `__nativeTag`) does not.
|
|
9
|
+
const resolveElementSource = source => {
|
|
10
|
+
if (typeof source === "number") {
|
|
11
|
+
return source;
|
|
12
|
+
}
|
|
13
|
+
const instance = source !== null && typeof source === "object" && "current" in source ? source.current : source;
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
const tag = instance == null ? null : findNodeHandle(instance);
|
|
16
|
+
if (tag === null || tag === undefined) {
|
|
17
|
+
throw new Error("[WebGPU] drawElementImageToTexture: `source` does not resolve to a " + "mounted native view (pass a host component ref rendered with " + "collapsable={false})");
|
|
18
|
+
}
|
|
19
|
+
return tag;
|
|
20
|
+
};
|
|
21
|
+
const installDrawElementImageToTexture = () => {
|
|
22
|
+
if (typeof GPUQueue === "undefined") {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const native = GPUQueue.prototype.drawElementImageToTexture;
|
|
26
|
+
if (typeof native !== "function") {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
GPUQueue.prototype.drawElementImageToTexture = function (source, destination) {
|
|
30
|
+
return native.call(this, {
|
|
31
|
+
...source,
|
|
32
|
+
source: resolveElementSource(source.source)
|
|
33
|
+
}, destination);
|
|
34
|
+
};
|
|
35
|
+
};
|
|
4
36
|
export * from "../Canvas";
|
|
5
37
|
export * from "../Offscreen";
|
|
6
38
|
export * from "../WebGPUViewNativeComponent";
|
|
@@ -31,6 +63,7 @@ if (typeof RNWebGPU !== "undefined") {
|
|
|
31
63
|
}
|
|
32
64
|
}
|
|
33
65
|
global.createImageBitmap = global.createImageBitmap ?? RNWebGPU.createImageBitmap.bind(RNWebGPU);
|
|
66
|
+
installDrawElementImageToTexture();
|
|
34
67
|
// Let installWebGPU() put navigator.gpu on other runtimes (see install.ts).
|
|
35
68
|
provideGPUForInstall(RNWebGPU.gpu);
|
|
36
69
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["registerWebGPUForReanimated","provideGPUForInstall","WebGPUModule","default","_installOk","install","RNWebGPU","navigator","gpu","userAgent","global","createImageBitmap","bind","console","warn"],"sourceRoot":"../../../src","sources":["main/index.tsx"],"mappings":"AAAA,SAASA,2BAA2B,QAAQ,aAAa;AACzD,SAASC,oBAAoB,QAAQ,YAAY;AACjD,OAAOC,YAAY,MAAM,uBAAuB;
|
|
1
|
+
{"version":3,"names":["findNodeHandle","registerWebGPUForReanimated","provideGPUForInstall","WebGPUModule","resolveElementSource","source","instance","current","tag","undefined","Error","installDrawElementImageToTexture","GPUQueue","native","prototype","drawElementImageToTexture","destination","call","default","_installOk","install","RNWebGPU","navigator","gpu","userAgent","global","createImageBitmap","bind","console","warn"],"sourceRoot":"../../../src","sources":["main/index.tsx"],"mappings":"AAAA,SAASA,cAAc,QAAQ,cAAc;AAE7C,SAASC,2BAA2B,QAAQ,aAAa;AACzD,SAASC,oBAAoB,QAAQ,YAAY;AACjD,OAAOC,YAAY,MAAM,uBAAuB;AAGhD;AACA;AACA;AACA;AACA,MAAMC,oBAAoB,GAAIC,MAAqC,IAAK;EACtE,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;IAC9B,OAAOA,MAAM;EACf;EACA,MAAMC,QAAQ,GACZD,MAAM,KAAK,IAAI,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAIA,MAAM,GAChEA,MAAM,CAACE,OAAO,GACdF,MAAM;EACZ;EACA,MAAMG,GAAG,GAAGF,QAAQ,IAAI,IAAI,GAAG,IAAI,GAAGN,cAAc,CAACM,QAAe,CAAC;EACrE,IAAIE,GAAG,KAAK,IAAI,IAAIA,GAAG,KAAKC,SAAS,EAAE;IACrC,MAAM,IAAIC,KAAK,CACb,qEAAqE,GACnE,+DAA+D,GAC/D,sBACJ,CAAC;EACH;EACA,OAAOF,GAAG;AACZ,CAAC;AAED,MAAMG,gCAAgC,GAAGA,CAAA,KAAM;EAC7C,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE;IACnC;EACF;EACA,MAAMC,MAAM,GAAGD,QAAQ,CAACE,SAAS,CAACC,yBAAyB;EAC3D,IAAI,OAAOF,MAAM,KAAK,UAAU,EAAE;IAChC;EACF;EACAD,QAAQ,CAACE,SAAS,CAACC,yBAAyB,GAAG,UAE7CV,MAAM,EACNW,WAAW,EACX;IACA,OAAOH,MAAM,CAACI,IAAI,CAChB,IAAI,EACJ;MAAE,GAAGZ,MAAM;MAAEA,MAAM,EAAED,oBAAoB,CAACC,MAAM,CAACA,MAAM;IAAE,CAAC,EAC1DW,WACF,CAAC;EACH,CAAC;AACH,CAAC;AAED,cAAc,WAAW;AACzB,cAAc,cAAc;AAC5B,cAAc,8BAA8B;AAC5C,cAAc,UAAU;AACxB,cAAc,sBAAsB;AACpC,cAAc,iBAAiB;AAC/B,cAAc,YAAY;AAE1B,SAASE,OAAO,IAAIf,YAAY,QAAQ,uBAAuB;AAE/D,MAAMgB,UAAU,GAAGhB,YAAY,CAACiB,OAAO,CAAC,CAAC;AAEzCnB,2BAA2B,CAAC,CAAC;AAE7B,IAAI,OAAOoB,QAAQ,KAAK,WAAW,EAAE;EACnC,IAAI,CAACC,SAAS,EAAE;IACd;IACAA,SAAS,GAAG;MACVC,GAAG,EAAEF,QAAQ,CAACE,GAAG;MACjBC,SAAS,EAAE;IACb,CAAC;EACH,CAAC,MAAM;IACLF,SAAS,CAACC,GAAG,GAAGF,QAAQ,CAACE,GAAG;IAC5B,IAAI,OAAOD,SAAS,CAACE,SAAS,KAAK,QAAQ,EAAE;MAC3C,IAAI;QACF;QACA;QACAF,SAAS,CAACE,SAAS,GAAG,cAAc;MACtC,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;EACAC,MAAM,CAACC,iBAAiB,GACtBD,MAAM,CAACC,iBAAiB,IAAIL,QAAQ,CAACK,iBAAiB,CAACC,IAAI,CAACN,QAAQ,CAAC;EACvEV,gCAAgC,CAAC,CAAC;EAClC;EACAT,oBAAoB,CAACmB,QAAQ,CAACE,GAAG,CAAC;AACpC,CAAC,MAAM;EACLK,OAAO,CAACC,IAAI,CACV,4CAA4CV,UAAU,uCACxD,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { GPUSharedFence, GPUSharedFenceDescriptor, GPUDawnTogglesDescriptor, GPUSharedTextureMemory, GPUSharedTextureMemoryDescriptor, NativeCanvas, RNCanvasContext, VideoPlayer, NativeVideoFrame, NativeVideoPixelFormat } from "./types";
|
|
1
|
+
import type { GPUDrawElementImageDestination, GPUDrawElementImageSource, GPUSharedFence, GPUSharedFenceDescriptor, GPUDawnTogglesDescriptor, GPUSharedTextureMemory, GPUSharedTextureMemoryDescriptor, NativeCanvas, RNCanvasContext, VideoPlayer, NativeVideoFrame, NativeVideoPixelFormat } from "./types";
|
|
2
2
|
export * from "./main";
|
|
3
3
|
export * from "./constants";
|
|
4
4
|
export { installWebGPU } from "./install";
|
|
5
|
-
export type { NativeVideoFrame, VideoPlayer, GPUSharedFence, GPUSharedFenceDescriptor, GPUSharedFenceExportInfo, GPUSharedFenceState, GPUSharedFenceType, GPUSharedTextureMemory, GPUSharedTextureMemoryDescriptor, GPUSharedTextureMemoryEndAccessState, NativeVideoPixelFormat, CreateVideoPlayerOptions, GPUDawnTogglesDescriptor, } from "./types";
|
|
5
|
+
export type { NativeVideoFrame, VideoPlayer, GPUSharedFence, GPUSharedFenceDescriptor, GPUSharedFenceExportInfo, GPUSharedFenceState, GPUSharedFenceType, GPUSharedTextureMemory, GPUSharedTextureMemoryDescriptor, GPUSharedTextureMemoryEndAccessState, NativeVideoPixelFormat, CreateVideoPlayerOptions, GPUDawnTogglesDescriptor, GPUDrawElementImageDestination, GPUDrawElementImageSource, GPUDrawElementImageSourceView, } from "./types";
|
|
6
6
|
declare global {
|
|
7
7
|
interface Navigator {
|
|
8
8
|
gpu: GPU;
|
|
@@ -31,6 +31,9 @@ declare global {
|
|
|
31
31
|
importSharedTextureMemory(descriptor: GPUSharedTextureMemoryDescriptor): GPUSharedTextureMemory;
|
|
32
32
|
importSharedFence(descriptor: GPUSharedFenceDescriptor): GPUSharedFence;
|
|
33
33
|
}
|
|
34
|
+
interface GPUQueue {
|
|
35
|
+
drawElementImageToTexture(source: GPUDrawElementImageSource, destination: GPUDrawElementImageDestination): Promise<void>;
|
|
36
|
+
}
|
|
34
37
|
interface GPUDeviceDescriptor {
|
|
35
38
|
dawnToggles?: GPUDawnTogglesDescriptor;
|
|
36
39
|
implicitDeviceSynchronization?: boolean;
|
|
@@ -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,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/main/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/main/index.tsx"],"names":[],"mappings":"AAoDA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -45,6 +45,19 @@ export interface VideoPlayer {
|
|
|
45
45
|
export interface CreateVideoPlayerOptions {
|
|
46
46
|
pixelFormat?: NativeVideoPixelFormat;
|
|
47
47
|
}
|
|
48
|
+
export type GPUDrawElementImageSourceView = number | {
|
|
49
|
+
current: unknown;
|
|
50
|
+
} | React.Component | object;
|
|
51
|
+
export interface GPUDrawElementImageSource {
|
|
52
|
+
source: GPUDrawElementImageSourceView;
|
|
53
|
+
sourceX?: number;
|
|
54
|
+
sourceY?: number;
|
|
55
|
+
sourceWidth?: number;
|
|
56
|
+
sourceHeight?: number;
|
|
57
|
+
}
|
|
58
|
+
export interface GPUDrawElementImageDestination extends GPUCopyExternalImageDestInfo {
|
|
59
|
+
size?: GPUExtent3DStrict;
|
|
60
|
+
}
|
|
48
61
|
export interface GPUSharedTextureMemoryDescriptor {
|
|
49
62
|
handle: bigint;
|
|
50
63
|
label?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/// <reference types="@webgpu/types" />
|
|
2
2
|
import type {
|
|
3
|
+
GPUDrawElementImageDestination,
|
|
4
|
+
GPUDrawElementImageSource,
|
|
3
5
|
GPUSharedFence,
|
|
4
6
|
GPUSharedFenceDescriptor,
|
|
5
7
|
GPUDawnTogglesDescriptor,
|
|
@@ -29,6 +31,9 @@ export type {
|
|
|
29
31
|
NativeVideoPixelFormat,
|
|
30
32
|
CreateVideoPlayerOptions,
|
|
31
33
|
GPUDawnTogglesDescriptor,
|
|
34
|
+
GPUDrawElementImageDestination,
|
|
35
|
+
GPUDrawElementImageSource,
|
|
36
|
+
GPUDrawElementImageSourceView,
|
|
32
37
|
} from "./types";
|
|
33
38
|
|
|
34
39
|
declare global {
|
|
@@ -87,6 +92,30 @@ declare global {
|
|
|
87
92
|
importSharedFence(descriptor: GPUSharedFenceDescriptor): GPUSharedFence;
|
|
88
93
|
}
|
|
89
94
|
|
|
95
|
+
// Non-spec RN extension modeled on the html-in-canvas proposal's
|
|
96
|
+
// GPUQueue.drawElementImageToTexture: rasterizes a native React Native view
|
|
97
|
+
// (the "element") and writes the pixels into `destination.texture`, which
|
|
98
|
+
// must be rgba8unorm or bgra8unorm (or their -srgb variants) with
|
|
99
|
+
// GPUTextureUsage.COPY_DST. Unlike the web API it returns a Promise: the
|
|
100
|
+
// view is rasterized on the platform UI thread, and the texture write is
|
|
101
|
+
// issued right before the promise resolves, so submit work that samples the
|
|
102
|
+
// texture after awaiting it. Snapshot the view with `collapsable={false}`
|
|
103
|
+
// so React Native does not optimize the host view away.
|
|
104
|
+
//
|
|
105
|
+
// What is captured is what the platform renders for the view hierarchy
|
|
106
|
+
// (iOS: UIView.drawViewHierarchyInRect; Android API 29+: HardwareRenderer
|
|
107
|
+
// over the views' display lists, older: View.draw into a software canvas).
|
|
108
|
+
// On Android, SurfaceView content (a WebGPU Canvas with the default
|
|
109
|
+
// "SurfaceView" surfaceType, video players) is not part of the hierarchy and
|
|
110
|
+
// comes out blank; use `android={{ surfaceType: "TextureView" }}` for a
|
|
111
|
+
// canvas that must be captured.
|
|
112
|
+
interface GPUQueue {
|
|
113
|
+
drawElementImageToTexture(
|
|
114
|
+
source: GPUDrawElementImageSource,
|
|
115
|
+
destination: GPUDrawElementImageDestination,
|
|
116
|
+
): Promise<void>;
|
|
117
|
+
}
|
|
118
|
+
|
|
90
119
|
// Non-standard, Dawn-only. Lets callers set Dawn device-stage toggles at
|
|
91
120
|
// device creation: adapter.requestDevice({ dawnToggles: { ... } }).
|
|
92
121
|
interface GPUDeviceDescriptor {
|
package/src/main/index.tsx
CHANGED
|
@@ -1,6 +1,54 @@
|
|
|
1
|
+
import { findNodeHandle } from "react-native";
|
|
2
|
+
|
|
1
3
|
import { registerWebGPUForReanimated } from "../external";
|
|
2
4
|
import { provideGPUForInstall } from "../install";
|
|
3
5
|
import WebGPUModule from "../NativeWebGPUModule";
|
|
6
|
+
import type { GPUDrawElementImageSourceView } from "../types";
|
|
7
|
+
|
|
8
|
+
// Resolve the `source` of drawElementImageToTexture to a React tag on the
|
|
9
|
+
// main JS runtime, where findNodeHandle is available: it handles class
|
|
10
|
+
// components and legacy host instances that the native fallback (a number or
|
|
11
|
+
// an instance carrying `__nativeTag`) does not.
|
|
12
|
+
const resolveElementSource = (source: GPUDrawElementImageSourceView) => {
|
|
13
|
+
if (typeof source === "number") {
|
|
14
|
+
return source;
|
|
15
|
+
}
|
|
16
|
+
const instance =
|
|
17
|
+
source !== null && typeof source === "object" && "current" in source
|
|
18
|
+
? source.current
|
|
19
|
+
: source;
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
const tag = instance == null ? null : findNodeHandle(instance as any);
|
|
22
|
+
if (tag === null || tag === undefined) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
"[WebGPU] drawElementImageToTexture: `source` does not resolve to a " +
|
|
25
|
+
"mounted native view (pass a host component ref rendered with " +
|
|
26
|
+
"collapsable={false})",
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
return tag;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const installDrawElementImageToTexture = () => {
|
|
33
|
+
if (typeof GPUQueue === "undefined") {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const native = GPUQueue.prototype.drawElementImageToTexture;
|
|
37
|
+
if (typeof native !== "function") {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
GPUQueue.prototype.drawElementImageToTexture = function (
|
|
41
|
+
this: GPUQueue,
|
|
42
|
+
source,
|
|
43
|
+
destination,
|
|
44
|
+
) {
|
|
45
|
+
return native.call(
|
|
46
|
+
this,
|
|
47
|
+
{ ...source, source: resolveElementSource(source.source) },
|
|
48
|
+
destination,
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
};
|
|
4
52
|
|
|
5
53
|
export * from "../Canvas";
|
|
6
54
|
export * from "../Offscreen";
|
|
@@ -37,6 +85,7 @@ if (typeof RNWebGPU !== "undefined") {
|
|
|
37
85
|
}
|
|
38
86
|
global.createImageBitmap =
|
|
39
87
|
global.createImageBitmap ?? RNWebGPU.createImageBitmap.bind(RNWebGPU);
|
|
88
|
+
installDrawElementImageToTexture();
|
|
40
89
|
// Let installWebGPU() put navigator.gpu on other runtimes (see install.ts).
|
|
41
90
|
provideGPUForInstall(RNWebGPU.gpu);
|
|
42
91
|
} else {
|
package/src/types.ts
CHANGED
|
@@ -81,6 +81,35 @@ export interface CreateVideoPlayerOptions {
|
|
|
81
81
|
pixelFormat?: NativeVideoPixelFormat;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
// A React Native view to draw with GPUQueue.drawElementImageToTexture: a host
|
|
85
|
+
// component ref (`useRef` object), the host instance itself (`ref.current`),
|
|
86
|
+
// or the numeric tag returned by findNodeHandle. On worklet runtimes (no
|
|
87
|
+
// findNodeHandle) pass the instance or the tag.
|
|
88
|
+
export type GPUDrawElementImageSourceView =
|
|
89
|
+
number | { current: unknown } | React.Component | object;
|
|
90
|
+
|
|
91
|
+
// The source argument of drawElementImageToTexture, modeled on the
|
|
92
|
+
// html-in-canvas proposal's GPUDrawElementImageSource. The optional rectangle
|
|
93
|
+
// selects the part of the view to draw, in the view's own coordinate space
|
|
94
|
+
// and in density-independent points (React Native layout units); it defaults
|
|
95
|
+
// to the whole view.
|
|
96
|
+
export interface GPUDrawElementImageSource {
|
|
97
|
+
source: GPUDrawElementImageSourceView;
|
|
98
|
+
sourceX?: number;
|
|
99
|
+
sourceY?: number;
|
|
100
|
+
sourceWidth?: number;
|
|
101
|
+
sourceHeight?: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// The destination argument of drawElementImageToTexture:
|
|
105
|
+
// GPUCopyExternalImageDestInfo plus the pixel size of the region the view is
|
|
106
|
+
// drawn into. `size` defaults to the source rectangle's natural pixel size
|
|
107
|
+
// (points times the device pixel ratio); pass it explicitly to scale the view
|
|
108
|
+
// to the destination region.
|
|
109
|
+
export interface GPUDrawElementImageDestination extends GPUCopyExternalImageDestInfo {
|
|
110
|
+
size?: GPUExtent3DStrict;
|
|
111
|
+
}
|
|
112
|
+
|
|
84
113
|
export interface GPUSharedTextureMemoryDescriptor {
|
|
85
114
|
// Raw native handle (IOSurfaceRef on Apple, AHardwareBuffer* on Android),
|
|
86
115
|
// encoded as a BigInt. The caller is responsible for keeping the underlying
|