react-native-webgpu 0.14.2 → 0.15.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/AndroidColorSpace.h +107 -0
- package/android/cpp/AndroidPlatformContext.h +100 -9
- package/android/cpp/AndroidVideoPlayer.h +46 -1
- package/android/cpp/cpp-adapter.cpp +53 -1
- package/android/src/main/java/com/webgpu/SyncFences.java +88 -0
- package/android/src/main/java/com/webgpu/ViewSnapshot.java +66 -23
- package/android/src/main/java/com/webgpu/WebGPUModule.java +69 -5
- package/android/src/main/java/com/webgpu/WebGPUVideoPlayer.java +109 -0
- package/apple/ApplePlatformContext.h +5 -5
- package/apple/ApplePlatformContext.mm +75 -3
- package/apple/AppleVideoPlayer.mm +68 -35
- package/cpp/dawn/common/ExternalTextureParams.h +67 -0
- package/cpp/rnwgpu/PlatformContext.h +65 -16
- package/cpp/rnwgpu/api/GPUAdapter.cpp +35 -0
- package/cpp/rnwgpu/api/GPUExternalTexture.cpp +172 -156
- package/cpp/rnwgpu/api/GPUExternalTexture.h +2 -19
- package/cpp/rnwgpu/api/GPUQueue.cpp +98 -3
- package/cpp/rnwgpu/api/RNWebGPU.h +9 -3
- package/cpp/rnwgpu/api/VideoFrameBlit.h +39 -24
- package/cpp/rnwgpu/api/descriptors/GPUExternalTextureDescriptor.h +10 -3
- package/lib/commonjs/Canvas.js +32 -5
- package/lib/commonjs/Canvas.js.map +1 -1
- package/lib/commonjs/WebPolyfillGPUModule.js +6 -3
- package/lib/commonjs/WebPolyfillGPUModule.js.map +1 -1
- package/lib/commonjs/constants.js +6 -3
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/install.js +9 -22
- package/lib/commonjs/install.js.map +1 -1
- package/lib/commonjs/main/index.js +8 -7
- package/lib/commonjs/main/index.js.map +1 -1
- package/lib/commonjs/main/index.web.js +1 -1
- package/lib/commonjs/main/installNative.js +20 -0
- package/lib/commonjs/main/installNative.js.map +1 -0
- package/lib/commonjs/main/installNative.web.js +4 -0
- package/lib/commonjs/main/installNative.web.js.map +1 -0
- package/lib/commonjs/mock.js +60 -13
- package/lib/commonjs/mock.js.map +1 -1
- package/lib/module/Canvas.js +33 -6
- package/lib/module/Canvas.js.map +1 -1
- package/lib/module/WebPolyfillGPUModule.js +6 -3
- package/lib/module/WebPolyfillGPUModule.js.map +1 -1
- package/lib/module/constants.js +6 -3
- package/lib/module/constants.js.map +1 -1
- package/lib/module/index.js +8 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/install.js +8 -20
- package/lib/module/install.js.map +1 -1
- package/lib/module/main/index.js +6 -7
- package/lib/module/main/index.js.map +1 -1
- package/lib/module/main/index.web.js +1 -1
- package/lib/module/main/index.web.js.map +1 -1
- package/lib/module/main/installNative.js +18 -0
- package/lib/module/main/installNative.js.map +1 -0
- package/lib/module/main/installNative.web.js +6 -0
- package/lib/module/main/installNative.web.js.map +1 -0
- package/lib/module/mock.js +55 -1
- package/lib/module/mock.js.map +1 -1
- package/lib/typescript/lib/commonjs/Canvas.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/install.d.ts +41 -3
- package/lib/typescript/lib/commonjs/install.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/main/installNative.d.ts +2 -0
- package/lib/typescript/lib/commonjs/main/installNative.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/main/installNative.web.d.ts +2 -0
- package/lib/typescript/lib/commonjs/main/installNative.web.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/mock.d.ts +39 -0
- package/lib/typescript/lib/commonjs/mock.d.ts.map +1 -1
- package/lib/typescript/lib/module/Canvas.d.ts.map +1 -1
- package/lib/typescript/lib/module/install.d.ts +0 -1
- package/lib/typescript/lib/module/install.d.ts.map +1 -1
- package/lib/typescript/lib/module/main/installNative.d.ts +2 -0
- package/lib/typescript/lib/module/main/installNative.d.ts.map +1 -0
- package/lib/typescript/lib/module/main/installNative.web.d.ts +2 -0
- package/lib/typescript/lib/module/main/installNative.web.d.ts.map +1 -0
- package/lib/typescript/lib/module/mock.d.ts +39 -1
- package/lib/typescript/lib/module/mock.d.ts.map +1 -1
- package/lib/typescript/src/Canvas.d.ts.map +1 -1
- package/lib/typescript/src/constants.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/install.d.ts +0 -5
- package/lib/typescript/src/install.d.ts.map +1 -1
- package/lib/typescript/src/main/index.d.ts +1 -0
- package/lib/typescript/src/main/index.d.ts.map +1 -1
- package/lib/typescript/src/main/index.web.d.ts +1 -1
- package/lib/typescript/src/main/index.web.d.ts.map +1 -1
- package/lib/typescript/src/main/installNative.d.ts +2 -0
- package/lib/typescript/src/main/installNative.d.ts.map +1 -0
- package/lib/typescript/src/main/installNative.web.d.ts +2 -0
- package/lib/typescript/src/main/installNative.web.d.ts.map +1 -0
- package/lib/typescript/src/mock.d.ts +5 -1
- package/lib/typescript/src/mock.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Canvas.tsx +44 -28
- package/src/WebPolyfillGPUModule.ts +3 -1
- package/src/constants.ts +6 -3
- package/src/index.tsx +18 -10
- package/src/install.ts +9 -18
- package/src/main/index.tsx +7 -10
- package/src/main/index.web.tsx +1 -1
- package/src/main/installNative.ts +20 -0
- package/src/main/installNative.web.ts +5 -0
- package/src/mock.ts +60 -1
|
@@ -256,6 +256,26 @@ void GPUQueue::copyExternalImageToTexture(
|
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
258
|
|
|
259
|
+
// Releases a frame the platform handed over that is not going to be drawn.
|
|
260
|
+
static void releaseFrame(VideoFrameHandle &frame) {
|
|
261
|
+
if (frame.deleter) {
|
|
262
|
+
frame.deleter();
|
|
263
|
+
frame.deleter = nullptr;
|
|
264
|
+
}
|
|
265
|
+
frame.handle = nullptr;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// A rejected JS promise. A resolve factory cannot reject the task's promise
|
|
269
|
+
// itself; resolving it with this value makes it adopt the rejection.
|
|
270
|
+
static jsi::Value rejectedPromise(jsi::Runtime &runtime,
|
|
271
|
+
const std::string &message) {
|
|
272
|
+
auto promiseConstructor =
|
|
273
|
+
runtime.global().getPropertyAsObject(runtime, "Promise");
|
|
274
|
+
auto reject = promiseConstructor.getPropertyAsFunction(runtime, "reject");
|
|
275
|
+
jsi::JSError error(runtime, message);
|
|
276
|
+
return reject.callWithThis(runtime, promiseConstructor, error.value());
|
|
277
|
+
}
|
|
278
|
+
|
|
259
279
|
async::AsyncTaskHandle GPUQueue::drawElementImageToTexture(
|
|
260
280
|
jsi::Runtime &runtime, std::shared_ptr<GPUDrawElementImageSource> source,
|
|
261
281
|
std::shared_ptr<GPUDrawElementImageDestination> destination) {
|
|
@@ -337,6 +357,18 @@ async::AsyncTaskHandle GPUQueue::drawElementImageToTexture(
|
|
|
337
357
|
"a positive width and height");
|
|
338
358
|
}
|
|
339
359
|
|
|
360
|
+
// With RENDER_ATTACHMENT as well, a platform that renders the view into a
|
|
361
|
+
// GPU buffer (Android 13 and above, through HardwareRenderer) hands that
|
|
362
|
+
// buffer over instead of reading the pixels back, and the view is drawn into
|
|
363
|
+
// the destination on the GPU (VideoFrameBlit), which writes the color aspect
|
|
364
|
+
// of the first layer. An omitted aspect means "all" (dst.aspect itself stays
|
|
365
|
+
// at Dawn's Undefined default, which WriteTexture reads the same way).
|
|
366
|
+
request.allowFrame =
|
|
367
|
+
(texture.GetUsage() & wgpu::TextureUsage::RenderAttachment) != 0 &&
|
|
368
|
+
info->aspect.value_or(wgpu::TextureAspect::All) ==
|
|
369
|
+
wgpu::TextureAspect::All &&
|
|
370
|
+
dst.origin.z == 0;
|
|
371
|
+
|
|
340
372
|
// Destination size (pixels). Omitted means the source rectangle's natural
|
|
341
373
|
// pixel size (points times the device pixel ratio), which the platform
|
|
342
374
|
// computes; the bounds check then happens once the pixels are back.
|
|
@@ -372,13 +404,15 @@ async::AsyncTaskHandle GPUQueue::drawElementImageToTexture(
|
|
|
372
404
|
auto context =
|
|
373
405
|
async::RuntimeContext::getOrCreate(runtime, _async->instance());
|
|
374
406
|
auto queue = _instance;
|
|
407
|
+
auto device = _device;
|
|
408
|
+
auto blit = _videoFrameBlit;
|
|
375
409
|
// Keeps the destination texture alive until the write is issued.
|
|
376
410
|
auto gpuTexture = info->texture;
|
|
377
411
|
return context->postTask(
|
|
378
412
|
[platform, request, dst, mipWidth, mipHeight, destinationIsBgra,
|
|
379
|
-
destinationPremultiplied, queue,
|
|
380
|
-
|
|
381
|
-
|
|
413
|
+
destinationPremultiplied, device, queue, gpuTexture,
|
|
414
|
+
blit](const async::AsyncTaskHandle::ResolveFunction &resolve,
|
|
415
|
+
const async::AsyncTaskHandle::RejectFunction &reject) {
|
|
382
416
|
platform->snapshotView(
|
|
383
417
|
request,
|
|
384
418
|
[resolve, reject, dst, mipWidth, mipHeight, destinationIsBgra,
|
|
@@ -432,6 +466,67 @@ async::AsyncTaskHandle GPUQueue::drawElementImageToTexture(
|
|
|
432
466
|
return jsi::Value::undefined();
|
|
433
467
|
});
|
|
434
468
|
},
|
|
469
|
+
[resolve, reject, dst, mipWidth, mipHeight,
|
|
470
|
+
destinationPremultiplied, device, queue, gpuTexture,
|
|
471
|
+
blit](VideoFrameHandle frame) mutable {
|
|
472
|
+
// Arbitrary (UI) thread: validate without touching JSI. A frame
|
|
473
|
+
// that is not drawn is released here.
|
|
474
|
+
if (frame.handle == nullptr || frame.width == 0 ||
|
|
475
|
+
frame.height == 0) {
|
|
476
|
+
releaseFrame(frame);
|
|
477
|
+
reject("drawElementImageToTexture: the view produced no "
|
|
478
|
+
"pixels (is it mounted with a non-zero size?)");
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
if (frame.width >
|
|
482
|
+
mipWidth - std::min<uint32_t>(dst.origin.x, mipWidth) ||
|
|
483
|
+
frame.height >
|
|
484
|
+
mipHeight - std::min<uint32_t>(dst.origin.y, mipHeight)) {
|
|
485
|
+
auto message =
|
|
486
|
+
"drawElementImageToTexture: the view's natural pixel "
|
|
487
|
+
"size (" +
|
|
488
|
+
std::to_string(frame.width) + "x" +
|
|
489
|
+
std::to_string(frame.height) +
|
|
490
|
+
") does not fit in the destination texture at "
|
|
491
|
+
"destination.origin; pass destination.size to scale "
|
|
492
|
+
"it, or create a larger texture";
|
|
493
|
+
releaseFrame(frame);
|
|
494
|
+
reject(std::move(message));
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
resolve([frame = std::move(frame), dst, destinationPremultiplied,
|
|
498
|
+
device, queue, gpuTexture,
|
|
499
|
+
blit](jsi::Runtime &runtime) mutable -> jsi::Value {
|
|
500
|
+
// Owning runtime's thread. Draw the buffer into the
|
|
501
|
+
// destination region on the GPU: importing it as an external
|
|
502
|
+
// texture makes the GPU wait on the renderer's fence first,
|
|
503
|
+
// and the blit converts the renderer's premultiplied pixels to
|
|
504
|
+
// straight alpha unless the destination asks for premultiplied
|
|
505
|
+
// ones. The frame is released once the draw is submitted (Dawn
|
|
506
|
+
// keeps its own reference to the buffer for in-flight work).
|
|
507
|
+
auto videoFrame =
|
|
508
|
+
std::make_shared<VideoFrame>(std::move(frame));
|
|
509
|
+
VideoFrameBlit::Request blitRequest;
|
|
510
|
+
blitRequest.frame = videoFrame;
|
|
511
|
+
blitRequest.width = videoFrame->handle().width;
|
|
512
|
+
blitRequest.height = videoFrame->handle().height;
|
|
513
|
+
blitRequest.alpha = destinationPremultiplied
|
|
514
|
+
? VideoFrameBlit::Alpha::Premultiplied
|
|
515
|
+
: VideoFrameBlit::Alpha::Straight;
|
|
516
|
+
blitRequest.texture = dst.texture;
|
|
517
|
+
blitRequest.mipLevel = dst.mipLevel;
|
|
518
|
+
blitRequest.dstX = dst.origin.x;
|
|
519
|
+
blitRequest.dstY = dst.origin.y;
|
|
520
|
+
try {
|
|
521
|
+
blit->copy(device, queue, blitRequest);
|
|
522
|
+
} catch (const std::exception &error) {
|
|
523
|
+
videoFrame->release();
|
|
524
|
+
return rejectedPromise(runtime, error.what());
|
|
525
|
+
}
|
|
526
|
+
videoFrame->release();
|
|
527
|
+
return jsi::Value::undefined();
|
|
528
|
+
});
|
|
529
|
+
},
|
|
435
530
|
[reject](std::string error) { reject(std::move(error)); });
|
|
436
531
|
});
|
|
437
532
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
#include <memory>
|
|
4
4
|
#include <string>
|
|
5
|
+
#include <utility>
|
|
6
|
+
#include <vector>
|
|
5
7
|
|
|
6
8
|
#include "NativeObject.h"
|
|
7
9
|
|
|
@@ -248,10 +250,14 @@ public:
|
|
|
248
250
|
return std::make_shared<VideoFrame>(std::move(frame));
|
|
249
251
|
}
|
|
250
252
|
|
|
251
|
-
std::shared_ptr<VideoFrame>
|
|
252
|
-
|
|
253
|
+
std::shared_ptr<VideoFrame>
|
|
254
|
+
createTestVideoFrame(double width, double height,
|
|
255
|
+
std::optional<std::string> pixelFormat) {
|
|
256
|
+
auto format = (pixelFormat && pixelFormat.value() == "nv12")
|
|
257
|
+
? VideoPixelFormat::NV12
|
|
258
|
+
: VideoPixelFormat::BGRA8;
|
|
253
259
|
auto frame = _platformContext->createTestVideoFrame(
|
|
254
|
-
static_cast<uint32_t>(width), static_cast<uint32_t>(height));
|
|
260
|
+
static_cast<uint32_t>(width), static_cast<uint32_t>(height), format);
|
|
255
261
|
return std::make_shared<VideoFrame>(std::move(frame));
|
|
256
262
|
}
|
|
257
263
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include <algorithm>
|
|
3
4
|
#include <array>
|
|
4
5
|
#include <cstring>
|
|
5
6
|
#include <memory>
|
|
@@ -18,17 +19,29 @@
|
|
|
18
19
|
|
|
19
20
|
namespace rnwgpu {
|
|
20
21
|
|
|
21
|
-
// Renders a native
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
// GPUQueue.copyExternalImageToTexture for NativeVideoFrame sources
|
|
22
|
+
// Renders a native frame into a region of a regular texture. The frame is
|
|
23
|
+
// imported as an external texture, so Dawn does the YUV to RGB conversion and
|
|
24
|
+
// applies the rotation and the mirroring; a full-screen triangle then samples
|
|
25
|
+
// it into the destination. This is what backs
|
|
26
|
+
// GPUQueue.copyExternalImageToTexture for NativeVideoFrame sources, and the
|
|
27
|
+
// zero-copy path of GPUQueue.drawElementImageToTexture, which draws the
|
|
28
|
+
// buffer the platform rendered a view into.
|
|
26
29
|
//
|
|
27
30
|
// One instance per device, shared by its GPUQueue wrappers (a new wrapper is
|
|
28
31
|
// created on every `device.queue` access): it caches the shader, the layouts
|
|
29
32
|
// and one pipeline per destination format.
|
|
30
33
|
class VideoFrameBlit {
|
|
31
34
|
public:
|
|
35
|
+
// What becomes of the frame's alpha channel.
|
|
36
|
+
enum class Alpha {
|
|
37
|
+
// The destination is opaque (a video frame): alpha is written as 1.
|
|
38
|
+
Opaque,
|
|
39
|
+
// The frame's premultiplied pixels are written as they are.
|
|
40
|
+
Premultiplied,
|
|
41
|
+
// The frame's premultiplied pixels are converted to straight alpha.
|
|
42
|
+
Straight,
|
|
43
|
+
};
|
|
44
|
+
|
|
32
45
|
struct Request {
|
|
33
46
|
std::shared_ptr<VideoFrame> frame;
|
|
34
47
|
// The region of the upright frame (after rotation and mirroring) to copy.
|
|
@@ -39,6 +52,7 @@ public:
|
|
|
39
52
|
bool flipY = false;
|
|
40
53
|
double rotation = 0;
|
|
41
54
|
bool mirrored = false;
|
|
55
|
+
Alpha alpha = Alpha::Opaque;
|
|
42
56
|
// The destination region.
|
|
43
57
|
wgpu::Texture texture;
|
|
44
58
|
uint32_t mipLevel = 0;
|
|
@@ -123,17 +137,15 @@ public:
|
|
|
123
137
|
static_cast<float>(request.originX) / static_cast<float>(frameWidth);
|
|
124
138
|
const float offsetY =
|
|
125
139
|
static_cast<float>(request.originY) / static_cast<float>(frameHeight);
|
|
126
|
-
std::array<float,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
uniforms[12] = scaleX;
|
|
132
|
-
uniforms[13] = request.flipY ? -scaleY : scaleY;
|
|
133
|
-
uniforms[14] = offsetX;
|
|
134
|
-
uniforms[15] = request.flipY ? offsetY + scaleY : offsetY;
|
|
140
|
+
std::array<float, 8> uniforms = {};
|
|
141
|
+
uniforms[0] = scaleX;
|
|
142
|
+
uniforms[1] = request.flipY ? -scaleY : scaleY;
|
|
143
|
+
uniforms[2] = offsetX;
|
|
144
|
+
uniforms[3] = request.flipY ? offsetY + scaleY : offsetY;
|
|
135
145
|
const uint32_t decodeSrgb = isSrgb(format) ? 1u : 0u;
|
|
136
|
-
std::memcpy(&uniforms[
|
|
146
|
+
std::memcpy(&uniforms[4], &decodeSrgb, sizeof(decodeSrgb));
|
|
147
|
+
const uint32_t alphaMode = static_cast<uint32_t>(request.alpha);
|
|
148
|
+
std::memcpy(&uniforms[5], &alphaMode, sizeof(alphaMode));
|
|
137
149
|
|
|
138
150
|
wgpu::BufferDescriptor bufferDesc = {};
|
|
139
151
|
bufferDesc.label = "copyExternalImageToTexture uniforms";
|
|
@@ -225,15 +237,11 @@ private:
|
|
|
225
237
|
|
|
226
238
|
static constexpr const char *kShader = R"(
|
|
227
239
|
struct Uniforms {
|
|
228
|
-
// The rows of the 3x4 matrix mapping the sampled texel to R'G'B'
|
|
229
|
-
// (GPUExternalTexture.yuvToRgbMatrix; the identity outside Android YUV).
|
|
230
|
-
yuvToRgb0: vec4f,
|
|
231
|
-
yuvToRgb1: vec4f,
|
|
232
|
-
yuvToRgb2: vec4f,
|
|
233
240
|
// uv = position01 * uvScale + uvOffset
|
|
234
241
|
uvScale: vec2f,
|
|
235
242
|
uvOffset: vec2f,
|
|
236
243
|
// x: decode sRGB to linear, for an sRGB destination that re-encodes on write
|
|
244
|
+
// y: alpha, 0 opaque (written as 1), 1 premultiplied as sampled, 2 straight
|
|
237
245
|
flags: vec4u,
|
|
238
246
|
};
|
|
239
247
|
|
|
@@ -265,14 +273,21 @@ fn srgbToLinear(c: vec3f) -> vec3f {
|
|
|
265
273
|
}
|
|
266
274
|
|
|
267
275
|
@fragment fn fs(in: VsOut) -> @location(0) vec4f {
|
|
276
|
+
// The external texture converts YUV to RGB while sampling, on every platform.
|
|
268
277
|
let sampled = textureSampleBaseClampToEdge(frame, frameSampler, in.uv);
|
|
269
|
-
|
|
270
|
-
var
|
|
271
|
-
|
|
278
|
+
var rgb = clamp(sampled.rgb, vec3f(0.0), vec3f(1.0));
|
|
279
|
+
var alpha = 1.0;
|
|
280
|
+
if (u.flags.y != 0u) {
|
|
281
|
+
alpha = clamp(sampled.a, 0.0, 1.0);
|
|
282
|
+
}
|
|
283
|
+
// Unpremultiply in the encoded domain, as the CPU path does on the bytes.
|
|
284
|
+
if (u.flags.y == 2u && alpha > 0.0) {
|
|
285
|
+
rgb = clamp(rgb / alpha, vec3f(0.0), vec3f(1.0));
|
|
286
|
+
}
|
|
272
287
|
if (u.flags.x == 1u) {
|
|
273
288
|
rgb = srgbToLinear(rgb);
|
|
274
289
|
}
|
|
275
|
-
return vec4f(rgb,
|
|
290
|
+
return vec4f(rgb, alpha);
|
|
276
291
|
}
|
|
277
292
|
)";
|
|
278
293
|
|
|
@@ -14,9 +14,9 @@ namespace jsi = facebook::jsi;
|
|
|
14
14
|
namespace rnwgpu {
|
|
15
15
|
|
|
16
16
|
// Mirror of GPUExternalTextureDescriptor from the WebGPU spec, but with our
|
|
17
|
-
// VideoFrame as the (only) supported source.
|
|
18
|
-
// the
|
|
19
|
-
//
|
|
17
|
+
// VideoFrame as the (only) supported source. `colorSpace` is the spec member:
|
|
18
|
+
// the color space of the RGB the shader samples, "srgb" (the default) or
|
|
19
|
+
// "display-p3"; the frame's own color space comes with the frame.
|
|
20
20
|
//
|
|
21
21
|
// `rotation` / `mirrored` are a non-spec extension: camera frames (e.g. from
|
|
22
22
|
// VisionCamera) arrive in the sensor's native orientation, which differs
|
|
@@ -27,6 +27,7 @@ namespace rnwgpu {
|
|
|
27
27
|
struct GPUExternalTextureDescriptor {
|
|
28
28
|
std::shared_ptr<VideoFrame> source;
|
|
29
29
|
std::optional<std::string> label;
|
|
30
|
+
std::optional<std::string> colorSpace;
|
|
30
31
|
std::optional<double> rotation;
|
|
31
32
|
std::optional<bool> mirrored;
|
|
32
33
|
};
|
|
@@ -57,6 +58,12 @@ struct JSIConverter<std::shared_ptr<rnwgpu::GPUExternalTextureDescriptor>> {
|
|
|
57
58
|
runtime, prop, false);
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
if (value.hasProperty(runtime, "colorSpace")) {
|
|
62
|
+
auto prop = value.getProperty(runtime, "colorSpace");
|
|
63
|
+
if (prop.isString()) {
|
|
64
|
+
result->colorSpace = prop.asString(runtime).utf8(runtime);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
60
67
|
if (value.hasProperty(runtime, "rotation")) {
|
|
61
68
|
auto prop = value.getProperty(runtime, "rotation");
|
|
62
69
|
if (prop.isNumber()) {
|
package/lib/commonjs/Canvas.js
CHANGED
|
@@ -17,6 +17,36 @@ function generateContextId() {
|
|
|
17
17
|
// Anything else reaching the native component would hit the generated
|
|
18
18
|
// string-enum parser, which aborts on unknown values.
|
|
19
19
|
const resolveSurfaceType = surfaceType => surfaceType === "SurfaceView" || surfaceType === "TextureView" || surfaceType === "HardwareBufferView" ? surfaceType : "auto";
|
|
20
|
+
|
|
21
|
+
// A view measured relative to itself gets its layout size, without the
|
|
22
|
+
// transforms getBoundingClientRect() includes; measureLayout() calls back
|
|
23
|
+
// synchronously on the new architecture. On the web react-native-web measures
|
|
24
|
+
// asynchronously, so the DOM node is read directly: clientWidth/clientHeight
|
|
25
|
+
// are layout values that ignore transforms too (unlike getBoundingClientRect)
|
|
26
|
+
// and are what browser WebGPU code sizes a canvas from.
|
|
27
|
+
const measureLayout = view => {
|
|
28
|
+
if (_reactNative.Platform.OS === "web") {
|
|
29
|
+
const {
|
|
30
|
+
clientWidth,
|
|
31
|
+
clientHeight
|
|
32
|
+
} = view;
|
|
33
|
+
return {
|
|
34
|
+
width: clientWidth,
|
|
35
|
+
height: clientHeight
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
let size = {
|
|
39
|
+
width: 0,
|
|
40
|
+
height: 0
|
|
41
|
+
};
|
|
42
|
+
view.measureLayout(view, (_left, _top, width, height) => {
|
|
43
|
+
size = {
|
|
44
|
+
width,
|
|
45
|
+
height
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
return size;
|
|
49
|
+
};
|
|
20
50
|
const Canvas = ({
|
|
21
51
|
opaque = true,
|
|
22
52
|
android,
|
|
@@ -50,13 +80,10 @@ const Canvas = ({
|
|
|
50
80
|
if (!viewRef.current) {
|
|
51
81
|
throw new Error("[WebGPU] Cannot get context before mount");
|
|
52
82
|
}
|
|
53
|
-
|
|
54
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
-
const view = viewRef.current;
|
|
56
|
-
const size = "getBoundingClientRect" in view ? view.getBoundingClientRect() : view.unstable_getBoundingClientRect();
|
|
83
|
+
const size = measureLayout(viewRef.current);
|
|
57
84
|
return RNWebGPU.MakeWebGPUCanvasContext(contextId, size.width, size.height);
|
|
58
85
|
}
|
|
59
|
-
}));
|
|
86
|
+
}), [contextId]);
|
|
60
87
|
return /*#__PURE__*/_react.default.createElement(_reactNative.View, _extends({
|
|
61
88
|
collapsable: false,
|
|
62
89
|
ref: viewRef
|
|
@@ -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","
|
|
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","measureLayout","view","Platform","OS","clientWidth","clientHeight","width","height","size","_left","_top","Canvas","opaque","android","ref","props","viewRef","useRef","contextId","_","useState","useEffect","RNWebGPU","destroyContext","useImperativeHandle","getContextId","getNativeSurface","getContext","contextName","Error","current","MakeWebGPUCanvasContext","createElement","View","collapsable","style","flex","androidSurfaceType","androidZOrderOnTop","zOrderOnTop","exports"],"sourceRoot":"../../src","sources":["Canvas.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,10 +4,13 @@ var _utils = require("./utils");
|
|
|
4
4
|
const fabric = true;
|
|
5
5
|
function getNativeSurface(contextId) {
|
|
6
6
|
const canvas = document.getElementById((0, _utils.contextIdToId)(contextId));
|
|
7
|
+
|
|
8
|
+
// Layout size, like the native view size in dp: unlike
|
|
9
|
+
// getBoundingClientRect() it ignores CSS transforms.
|
|
7
10
|
const {
|
|
8
|
-
height,
|
|
9
|
-
width
|
|
10
|
-
} = canvas
|
|
11
|
+
clientHeight: height,
|
|
12
|
+
clientWidth: width
|
|
13
|
+
} = canvas;
|
|
11
14
|
return {
|
|
12
15
|
surface: BigInt(contextId),
|
|
13
16
|
height,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_utils","require","fabric","getNativeSurface","contextId","canvas","document","getElementById","contextIdToId","height","
|
|
1
|
+
{"version":3,"names":["_utils","require","fabric","getNativeSurface","contextId","canvas","document","getElementById","contextIdToId","clientHeight","height","clientWidth","width","surface","BigInt","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;EACA;EACA,MAAM;IAAEK,YAAY,EAAEC,MAAM;IAAEC,WAAW,EAAEC;EAAM,CAAC,GAAGP,MAAM;EAE3D,OAAO;IACLQ,OAAO,EAAEC,MAAM,CAACV,SAAS,CAAC;IAC1BM,MAAM;IACNE,KAAK;IACLH,YAAY,EAAEC,MAAM;IACpBC,WAAW,EAAEC,KAAK;IAClB;IACAG,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,EACjBQ,KAAa,EACbF,MAAc,EACd;EACA,MAAML,MAAM,GAAGC,QAAQ,CAACC,cAAc,CACpC,IAAAC,oBAAa,EAACJ,SAAS,CACzB,CAAsB;EAEtB,MAAMkB,GAAG,GAAGC,MAAM,CAACC,gBAAgB,IAAI,CAAC;EACxC,MAAMC,UAAU,GAAG,CAACb,KAAK,GAAGU,GAAG,EAAEI,QAAQ,CAAC,CAAC;EAC3C,MAAMC,WAAW,GAAG,CAACjB,MAAM,GAAGY,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,CAAC;EAC3C;EACA;EACA,IAAI,CAACD,OAAO,EAAE;IACZ,OAAO,IAAI;EACb;EACA;EACA;EACA,OAAOE,MAAM,CAACC,MAAM,CAACH,OAAO,EAAE;IAAEI,OAAO,EAAEA,CAAA,KAAM,CAAC;EAAE,CAAC,CAAC;AACtD;;AAEA;AACAX,MAAM,CAACY,QAAQ,GAAG;EAChBhC,gBAAgB;EAChB;EACA;EACAiC,uBAAuB,EACrBf,uBAAkE;EACpE;EACAgB,cAAc,EAAGC,UAAkB,IAAK,CAAC,CAAC;EAC1CpC;AACF,CAAC","ignoreList":[]}
|
|
@@ -28,9 +28,12 @@ exports.GPUTextureUsage = exports.GPUShaderStage = exports.GPUMapMode = exports.
|
|
|
28
28
|
// device.createBuffer({ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ });
|
|
29
29
|
// };
|
|
30
30
|
//
|
|
31
|
-
// These are read at module evaluation time
|
|
32
|
-
//
|
|
33
|
-
//
|
|
31
|
+
// These are read at module evaluation time, so the native module must be
|
|
32
|
+
// installed first: the package entry (`./index.tsx`) starts with a bare
|
|
33
|
+
// `import "./main/installNative"` (so does `./main`), which runs the install
|
|
34
|
+
// before this file is reached, directly or through `./install`. An import is
|
|
35
|
+
// evaluated before the body of the module that declares it, so installing in
|
|
36
|
+
// the body of `./main` left every flag undefined.
|
|
34
37
|
|
|
35
38
|
const {
|
|
36
39
|
GPUBufferUsage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GPUBufferUsage","globalThis","exports","GPUTextureUsage","GPUShaderStage","GPUColorWrite","GPUMapMode"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":";;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM;EAAEA;AAAe,CAAC,GAAGC,UAAU;AAACC,OAAA,CAAAF,cAAA,GAAAA,cAAA;AAEtC,MAAM;EAAEG;AAAgB,CAAC,GAAGF,UAAU;AAACC,OAAA,CAAAC,eAAA,GAAAA,eAAA;AAEvC,MAAM;EAAEC;AAAe,CAAC,GAAGH,UAAU;AAACC,OAAA,CAAAE,cAAA,GAAAA,cAAA;AAEtC,MAAM;EAAEC;AAAc,CAAC,GAAGJ,UAAU;AAACC,OAAA,CAAAG,aAAA,GAAAA,aAAA;AAErC,MAAM;EAAEC;AAAW,CAAC,GAAGL,UAAU;AAACC,OAAA,CAAAI,UAAA,GAAAA,UAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["GPUBufferUsage","globalThis","exports","GPUTextureUsage","GPUShaderStage","GPUColorWrite","GPUMapMode"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":";;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAM;EAAEA;AAAe,CAAC,GAAGC,UAAU;AAACC,OAAA,CAAAF,cAAA,GAAAA,cAAA;AAEtC,MAAM;EAAEG;AAAgB,CAAC,GAAGF,UAAU;AAACC,OAAA,CAAAC,eAAA,GAAAA,eAAA;AAEvC,MAAM;EAAEC;AAAe,CAAC,GAAGH,UAAU;AAACC,OAAA,CAAAE,cAAA,GAAAA,cAAA;AAEtC,MAAM;EAAEC;AAAc,CAAC,GAAGJ,UAAU;AAACC,OAAA,CAAAG,aAAA,GAAAA,aAAA;AAErC,MAAM;EAAEC;AAAW,CAAC,GAAGL,UAAU;AAACC,OAAA,CAAAI,UAAA,GAAAA,UAAA","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "installWebGPU", {
|
|
|
12
12
|
return _install.installWebGPU;
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
|
+
require("./main/installNative");
|
|
15
16
|
var _main = require("./main");
|
|
16
17
|
Object.keys(_main).forEach(function (key) {
|
|
17
18
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["require","_main","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_constants","_install"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;AAQAA,OAAA;AAmBA,IAAAC,KAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,KAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,KAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,KAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,UAAA,GAAAd,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAW,UAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,UAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,UAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,QAAA,GAAAf,OAAA","ignoreList":[]}
|
package/lib/commonjs/install.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.installWebGPU = void 0;
|
|
7
7
|
var _constants = require("./constants");
|
|
8
8
|
/// <reference types="@webgpu/types" />
|
|
9
9
|
|
|
@@ -19,23 +19,14 @@ const constants = {
|
|
|
19
19
|
GPUMapMode: _constants.GPUMapMode
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
// The GPU instance destined for `navigator.gpu` on other runtimes,
|
|
23
|
-
//
|
|
24
|
-
// evaluated
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
const holder = {};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* @internal Called once by `main/index.tsx` after the native install, so
|
|
34
|
-
* `installWebGPU()` can put `navigator.gpu` on other runtimes.
|
|
35
|
-
*/
|
|
36
|
-
const provideGPUForInstall = gpu => {
|
|
37
|
-
holder.gpu = gpu;
|
|
38
|
-
};
|
|
22
|
+
// The GPU instance destined for `navigator.gpu` on other runtimes, read from
|
|
23
|
+
// the native install like the flags above (the package entry runs the install
|
|
24
|
+
// before this module is evaluated). Undefined on web, where the RNWebGPU
|
|
25
|
+
// polyfill has no gpu and the browser already provides navigator.gpu. Captured
|
|
26
|
+
// into the `installWebGPU` worklet closure: when a worklet is serialized, the
|
|
27
|
+
// Worklets custom serializer boxes the GPU object, and unboxing on the target
|
|
28
|
+
// runtime installs the GPU prototype there.
|
|
29
|
+
const gpu = typeof RNWebGPU === "undefined" ? undefined : RNWebGPU.gpu;
|
|
39
30
|
|
|
40
31
|
/**
|
|
41
32
|
* Install WebGPU on the runtime that calls it.
|
|
@@ -80,7 +71,6 @@ const provideGPUForInstall = gpu => {
|
|
|
80
71
|
* runtime that already has the globals (e.g. the main JS runtime) is a safe
|
|
81
72
|
* no-op.
|
|
82
73
|
*/
|
|
83
|
-
exports.provideGPUForInstall = provideGPUForInstall;
|
|
84
74
|
const installWebGPU = () => {
|
|
85
75
|
"worklet";
|
|
86
76
|
|
|
@@ -90,9 +80,6 @@ const installWebGPU = () => {
|
|
|
90
80
|
g[key] = value;
|
|
91
81
|
}
|
|
92
82
|
}
|
|
93
|
-
const {
|
|
94
|
-
gpu
|
|
95
|
-
} = holder;
|
|
96
83
|
if (gpu !== undefined) {
|
|
97
84
|
const nav = g.navigator;
|
|
98
85
|
if (nav === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_constants","require","constants","GPUBufferUsage","GPUTextureUsage","GPUShaderStage","GPUColorWrite","GPUMapMode","
|
|
1
|
+
{"version":3,"names":["_constants","require","constants","GPUBufferUsage","GPUTextureUsage","GPUShaderStage","GPUColorWrite","GPUMapMode","gpu","RNWebGPU","undefined","installWebGPU","g","globalThis","key","value","Object","entries","nav","navigator","userAgent","exports"],"sourceRoot":"../../src","sources":["install.ts"],"mappings":";;;;;;AACA,IAAAA,UAAA,GAAAC,OAAA;AADA;;AASA;AACA;AACA;AACA;AACA,MAAMC,SAAS,GAAG;EAChBC,cAAc,EAAdA,yBAAc;EACdC,eAAe,EAAfA,0BAAe;EACfC,cAAc,EAAdA,yBAAc;EACdC,aAAa,EAAbA,wBAAa;EACbC,UAAU,EAAVA;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,GAAoB,GACxB,OAAOC,QAAQ,KAAK,WAAW,GAAGC,SAAS,GAAGD,QAAQ,CAACD,GAAG;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMG,aAAa,GAAGA,CAAA,KAAM;EACjC,SAAS;;EACT,MAAMC,CAAC,GAAGC,UAAgD;EAC1D,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACf,SAAS,CAAC,EAAE;IACpD,IAAIU,CAAC,CAACE,GAAG,CAAC,KAAKJ,SAAS,EAAE;MACxBE,CAAC,CAACE,GAAG,CAAC,GAAGC,KAAK;IAChB;EACF;EACA,IAAIP,GAAG,KAAKE,SAAS,EAAE;IACrB,MAAMQ,GAAG,GAAGN,CAAC,CAACO,SAA0D;IACxE,IAAID,GAAG,KAAKR,SAAS,EAAE;MACrBE,CAAC,CAACO,SAAS,GAAG;QAAEX,GAAG;QAAEY,SAAS,EAAE;MAAe,CAAC;IAClD,CAAC,MAAM,IAAIF,GAAG,CAACV,GAAG,KAAKE,SAAS,EAAE;MAChCQ,GAAG,CAACV,GAAG,GAAGA,GAAG;IACf;EACF;AACF,CAAC;AAACa,OAAA,CAAAV,aAAA,GAAAA,aAAA","ignoreList":[]}
|
|
@@ -12,10 +12,9 @@ Object.defineProperty(exports, "WebGPUModule", {
|
|
|
12
12
|
return _NativeWebGPUModule.default;
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
|
+
require("./installNative");
|
|
15
16
|
var _reactNative = require("react-native");
|
|
16
17
|
var _external = require("../external");
|
|
17
|
-
var _install = require("../install");
|
|
18
|
-
var _NativeWebGPUModule = _interopRequireDefault(require("../NativeWebGPUModule"));
|
|
19
18
|
var _Canvas = require("../Canvas");
|
|
20
19
|
Object.keys(_Canvas).forEach(function (key) {
|
|
21
20
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -112,7 +111,14 @@ Object.keys(_formats).forEach(function (key) {
|
|
|
112
111
|
}
|
|
113
112
|
});
|
|
114
113
|
});
|
|
114
|
+
var _NativeWebGPUModule = _interopRequireDefault(require("../NativeWebGPUModule"));
|
|
115
115
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
116
|
+
// Must stay the FIRST import, and a bare one: it installs the native module
|
|
117
|
+
// (the RNWebGPU global and the WebGPU globals) before anything else here is
|
|
118
|
+
// evaluated; the package entry imports it first as well, see ./installNative.ts.
|
|
119
|
+
// An import with bindings could be deferred to its first use by
|
|
120
|
+
// `inlineRequires`; a bare import is not.
|
|
121
|
+
|
|
116
122
|
// Resolve the `source` of drawElementImageToTexture to a React tag on the
|
|
117
123
|
// main JS runtime, where findNodeHandle is available: it handles class
|
|
118
124
|
// components and legacy host instances that the native fallback (a number or
|
|
@@ -144,7 +150,6 @@ const installDrawElementImageToTexture = () => {
|
|
|
144
150
|
}, destination);
|
|
145
151
|
};
|
|
146
152
|
};
|
|
147
|
-
const _installOk = _NativeWebGPUModule.default.install();
|
|
148
153
|
(0, _external.registerWebGPUForReanimated)();
|
|
149
154
|
if (typeof RNWebGPU !== "undefined") {
|
|
150
155
|
if (!navigator) {
|
|
@@ -167,9 +172,5 @@ if (typeof RNWebGPU !== "undefined") {
|
|
|
167
172
|
}
|
|
168
173
|
global.createImageBitmap = global.createImageBitmap ?? RNWebGPU.createImageBitmap.bind(RNWebGPU);
|
|
169
174
|
installDrawElementImageToTexture();
|
|
170
|
-
// Let installWebGPU() put navigator.gpu on other runtimes (see install.ts).
|
|
171
|
-
(0, _install.provideGPUForInstall)(RNWebGPU.gpu);
|
|
172
|
-
} else {
|
|
173
|
-
console.warn(`[react-native-webgpu] install() returned ${_installOk} but RNWebGPU global is not available`);
|
|
174
175
|
}
|
|
175
176
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["require","_reactNative","_external","_Canvas","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_Offscreen","_WebGPUViewNativeComponent","_hooks","_GPUDeviceProvider","_importDevice","_video","_formats","_NativeWebGPUModule","_interopRequireDefault","e","__esModule","default","resolveElementSource","source","instance","current","tag","findNodeHandle","undefined","Error","installDrawElementImageToTexture","GPUQueue","native","drawElementImageToTexture","destination","registerWebGPUForReanimated","RNWebGPU","navigator","gpu","userAgent","global","createImageBitmap","bind"],"sourceRoot":"../../../src","sources":["main/index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
require("
|
|
6
|
+
require("./installNative");
|
|
7
7
|
var _Canvas = require("../Canvas");
|
|
8
8
|
Object.keys(_Canvas).forEach(function (key) {
|
|
9
9
|
if (key === "default" || key === "__esModule") return;
|