Skip to content

Commit 96fadbd

Browse files
committed
- Use std::span<const uint8_t>
- Clean up JNI local refs - Rethrow error in TexturedCube test
1 parent 6093cb0 commit 96fadbd

5 files changed

Lines changed: 23 additions & 10 deletions

File tree

apps/example/src/Cube/TexturedCube.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ export const TexturedCube = () => {
121121
);
122122
} catch (err) {
123123
console.error("Failed to fetch asset", err);
124+
throw err;
124125
}
125126

126127
// Create a sampler with linear filtering for smooth interpolation.

packages/webgpu/android/cpp/AndroidPlatformContext.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class AndroidPlatformContext : public PlatformContext {
3636

3737
jmethodID resolveMethod = env->GetMethodID(blobModuleClass, "resolve",
3838
"(Ljava/lang/String;II)[B");
39+
env->DeleteLocalRef(blobModuleClass);
40+
3941
if (!resolveMethod) {
4042
throw std::runtime_error("Couldn't find resolve method in BlobModule");
4143
}
@@ -113,7 +115,7 @@ class AndroidPlatformContext : public PlatformContext {
113115
}).detach();
114116
}
115117

116-
ImageData createImageBitmapFromData(std::span<uint8_t> data) override {
118+
ImageData createImageBitmapFromData(std::span<const uint8_t> data) override {
117119
jni::Environment::ensureCurrentThreadIsAttached();
118120

119121
JNIEnv *env = facebook::jni::Environment::current();
@@ -132,12 +134,22 @@ class AndroidPlatformContext : public PlatformContext {
132134
// Decode via BitmapFactory
133135
jclass bitmapFactoryClass =
134136
env->FindClass("android/graphics/BitmapFactory");
137+
if (!bitmapFactoryClass) {
138+
env->DeleteLocalRef(byteArray);
139+
throw std::runtime_error("Couldn't find BitmapFactory class");
140+
}
135141
jmethodID decodeByteArrayMethod =
136142
env->GetStaticMethodID(bitmapFactoryClass, "decodeByteArray",
137143
"([BII)Landroid/graphics/Bitmap;");
144+
if (!decodeByteArrayMethod) {
145+
env->DeleteLocalRef(byteArray);
146+
env->DeleteLocalRef(bitmapFactoryClass);
147+
throw std::runtime_error("Couldn't find decodeByteArray method");
148+
}
138149
jint length = static_cast<jint>(data.size());
139150
jobject bitmap = env->CallStaticObjectMethod(
140151
bitmapFactoryClass, decodeByteArrayMethod, byteArray, 0, length);
152+
env->DeleteLocalRef(bitmapFactoryClass);
141153

142154
if (!bitmap) {
143155
env->DeleteLocalRef(byteArray);
@@ -175,7 +187,7 @@ class AndroidPlatformContext : public PlatformContext {
175187
}
176188

177189
void createImageBitmapFromDataAsync(
178-
std::span<uint8_t> data, std::function<void(ImageData)> onSuccess,
190+
std::span<const uint8_t> data, std::function<void(ImageData)> onSuccess,
179191
std::function<void(std::string)> onError) override {
180192
std::thread([this, ownedData = std::vector<uint8_t>(data.begin(), data.end()),
181193
onSuccess = std::move(onSuccess),

packages/webgpu/apple/ApplePlatformContext.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ class ApplePlatformContext : public PlatformContext {
2121
std::function<void(ImageData)> onSuccess,
2222
std::function<void(std::string)> onError) override;
2323

24-
ImageData createImageBitmapFromData(std::span<uint8_t> data) override;
24+
ImageData createImageBitmapFromData(std::span<const uint8_t> data) override;
2525

2626
void createImageBitmapFromDataAsync(
27-
std::span<uint8_t> data, std::function<void(ImageData)> onSuccess,
27+
std::span<const uint8_t> data, std::function<void(ImageData)> onSuccess,
2828
std::function<void(std::string)> onError) override;
2929
};
3030

packages/webgpu/apple/ApplePlatformContext.mm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ void checkIfUsingSimulatorWithAPIValidation() {
3939
return instance.CreateSurface(&surfaceDescriptor);
4040
}
4141

42-
static std::span<uint8_t> nsDataToSpan(NSData *data) {
43-
return {static_cast<uint8_t *>(const_cast<void *>(data.bytes)), data.length};
42+
static std::span<const uint8_t> nsDataToSpan(NSData *data) {
43+
return {static_cast<const uint8_t *>(data.bytes), data.length};
4444
}
4545

4646
ImageData ApplePlatformContext::createImageBitmap(std::string blobId,
@@ -83,7 +83,7 @@ void checkIfUsingSimulatorWithAPIValidation() {
8383
}
8484

8585
ImageData ApplePlatformContext::createImageBitmapFromData(
86-
std::span<uint8_t> data) {
86+
std::span<const uint8_t> data) {
8787
NSData *nsData = [NSData dataWithBytes:data.data()
8888
length:data.size()];
8989

@@ -128,7 +128,7 @@ void checkIfUsingSimulatorWithAPIValidation() {
128128
}
129129

130130
void ApplePlatformContext::createImageBitmapFromDataAsync(
131-
std::span<uint8_t> data, std::function<void(ImageData)> onSuccess,
131+
std::span<const uint8_t> data, std::function<void(ImageData)> onSuccess,
132132
std::function<void(std::string)> onError) {
133133
// Copy span data into shared_ptr so the dispatch_async block owns the memory
134134
auto ownedData =

packages/webgpu/cpp/rnwgpu/PlatformContext.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ class PlatformContext {
3434
std::function<void(std::string)> onError) = 0;
3535

3636
// Create ImageBitmap from raw encoded image bytes (PNG/JPEG/etc.)
37-
virtual ImageData createImageBitmapFromData(std::span<uint8_t> data) = 0;
37+
virtual ImageData createImageBitmapFromData(std::span<const uint8_t> data) = 0;
3838

3939
virtual void createImageBitmapFromDataAsync(
40-
std::span<uint8_t> data, std::function<void(ImageData)> onSuccess,
40+
std::span<const uint8_t> data, std::function<void(ImageData)> onSuccess,
4141
std::function<void(std::string)> onError) = 0;
4242
};
4343

0 commit comments

Comments
 (0)