From 4e0e3fd49b95d155202c999c455ac433eb89c7dc Mon Sep 17 00:00:00 2001 From: William Candillon Date: Thu, 11 Sep 2025 14:24:57 +0200 Subject: [PATCH 1/4] :wrench: --- apps/example/ios/Podfile.lock | 116 +++++++++--------- packages/webgpu/cpp/rnwgpu/api/AsyncRunner.h | 2 +- packages/webgpu/cpp/rnwgpu/api/GPUDevice.cpp | 103 +++++++++------- packages/webgpu/cpp/rnwgpu/api/GPUError.h | 11 +- .../cpp/rnwgpu/api/GPURenderPassEncoder.cpp | 2 +- packages/webgpu/package.json | 2 +- .../webgpu/src/__tests__/ErrorScope.spec.ts | 92 ++++++++++++++ 7 files changed, 221 insertions(+), 107 deletions(-) create mode 100644 packages/webgpu/src/__tests__/ErrorScope.spec.ts diff --git a/apps/example/ios/Podfile.lock b/apps/example/ios/Podfile.lock index a06dd9ecd..8c8876f07 100644 --- a/apps/example/ios/Podfile.lock +++ b/apps/example/ios/Podfile.lock @@ -2213,79 +2213,79 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe - RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809 + RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e RCTTypeSafety: 659ae318c09de0477fd27bbc9e140071c7ea5c93 React: c2d3aa44c49bb34e4dfd49d3ee92da5ebacc1c1c React-callinvoker: 1bdfb7549b5af266d85757193b5069f60659ef9d - React-Core: 7150cf9b6a5af063b37003062689f1691e79c020 - React-CoreModules: 15a85e6665d61678942da6ae485b351f4c699049 - React-cxxreact: 74f9de59259ac951923f5726aa14f0398f167af9 + React-Core: 10597593fdbae06f0089881e025a172e51d4a769 + React-CoreModules: 6907b255529dd46895cf687daa67b24484a612c2 + React-cxxreact: a9f5b8180d6955bc3f6a3fcd657c4d9b4d95c1f6 React-debug: e74e76912b91e08d580c481c34881899ccf63da9 - React-defaultsnativemodule: 628285212bbd65417d40ad6a9f8781830fda6c98 - React-domnativemodule: 185d9808198405c176784aaf33403d713bd24fb7 - React-Fabric: c814804affbe1952e16149ddd20256e1bccae67e - React-FabricComponents: 81ef47d596966121784afec9924f9562a29b1691 - React-FabricImage: f14f371d678aa557101def954ac3ba27e48948ff + React-defaultsnativemodule: 11f6ee2cf69bf3af9d0f28a6253def33d21b5266 + React-domnativemodule: f940bbc4fa9e134190acbf3a4a9f95621b5a8f51 + React-Fabric: 6f5c357bf3a42ff11f8844ad3fc7a1eb04f4b9de + React-FabricComponents: 10e0c0209822ac9e69412913a8af1ca33573379b + React-FabricImage: f582e764072dfa4715ae8c42979a5bace9cbcc12 React-featureflags: d5facceff8f8f6de430e0acecf4979a9a0839ba9 - React-featureflagsnativemodule: 96f0ab285382d95c90f663e02526a5ceefa95a11 - React-graphics: 1a66ee0a3f093b125b853f6370296fadcaf6f233 - React-hermes: 8b86e5f54a65ecb69cdf22b3a00a11562eda82d2 - React-idlecallbacksnativemodule: 5c25ab145c602264d00cb26a397ab52e0efa031c - React-ImageManager: 15e34bd5ef1ac4a18e96660817ef70a7f99ee8c2 - React-jserrorhandler: 02cdf2cd45350108be1ffd2b164578936dbbdff7 - React-jsi: 6af1987cfbb1b6621664fdbf6c7b62bd4d38c923 - React-jsiexecutor: 51f372998e0303585cb0317232b938d694663cbd - React-jsinspector: 3539ad976d073bfaa8a7d2fa9bef35e70e55033e - React-jsinspectortracing: e8dbacaf67c201f23052ca1c2bae2f7b84dec443 - React-jsitooling: 95a34f41e3c249d42181de13b4f8d854f178ca9f - React-jsitracing: 25b029cf5cad488252d46da19dd8c4c134fd5fe4 - React-logger: 368570a253f00879a1e4fea24ed4047e72e7bbf3 - React-Mapbuffer: c04fcda1c6281fc0a6824c7dcc1633dd217ac1ec - React-microtasksnativemodule: ca2804a25fdcefffa0aa942aa23ab53b99614a34 - react-native-safe-area-context: 00d03dc688ba86664be66f9e3f203fc7d747d899 - react-native-skia: 443d0725a6cbbcce886edb96b591935eb3bc36d8 - react-native-wgpu: 282b5bac022287804e6a7b064f903b4e273c7024 - React-NativeModulesApple: 452b86b29fae99ed0a4015dca3ad9cd222f88abf + React-featureflagsnativemodule: a7dd141f1ef4b7c1331af0035689fbc742a49ff4 + React-graphics: 36ae3407172c1c77cea29265d2b12b90aaef6aa0 + React-hermes: 9116d4e6d07abeb519a2852672de087f44da8f12 + React-idlecallbacksnativemodule: ae7f5ffc6cf2d2058b007b78248e5b08172ad5c3 + React-ImageManager: 9daee0dc99ad6a001d4b9e691fbf37107e2b7b54 + React-jserrorhandler: 1e6211581071edaf4ecd5303147328120c73f4dc + React-jsi: 753ba30c902f3a41fa7f956aca8eea3317a44ee6 + React-jsiexecutor: 47520714aa7d9589c51c0f3713dfbfca4895d4f9 + React-jsinspector: cfd27107f6d6f1076a57d88c932401251560fe5f + React-jsinspectortracing: 76a7d791f3c0c09a0d2bf6f46dfb0e79a4fcc0ac + React-jsitooling: 995e826570dd58f802251490486ebd3244a037ab + React-jsitracing: 094ae3d8c123cea67b50211c945b7c0443d3e97b + React-logger: 8edfcedc100544791cd82692ca5a574240a16219 + React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468 + React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6 + react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06 + react-native-skia: 99362ce77dff006719636c97f16c9713e3ec221e + react-native-wgpu: 7a147fd65f5ee79c3e722e7aac156250e9d4d065 + React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c - React-perflogger: 6fd2f6811533e9c19a61e855c3033eecbf4ad2a0 - React-performancetimeline: abf31259d794c9274b3ea19c5016186925eec6c4 + React-perflogger: 9a151e0b4c933c9205fd648c246506a83f31395d + React-performancetimeline: 5b0dfc0acba29ea0269ddb34cd6dd59d3b8a1c66 React-RCTActionSheet: a499b0d6d9793886b67ba3e16046a3fef2cdbbc3 - React-RCTAnimation: 2595dcb10a82216a511b54742f8c28d793852ac6 - React-RCTAppDelegate: f03604b70f57c9469a84a159d8abecf793a5bcff - React-RCTBlob: e00f9b4e2f151938f4d9864cf33ebf24ac03328a - React-RCTFabric: 3945d116fd271598db262d4e6ed5691d431ed9e8 - React-RCTFBReactNativeSpec: 0f4d4f0da938101f2ca9d5333a8f46e527ad2819 - React-RCTImage: dac5e9f8ec476aefe6e60ee640ebc1dfaf1a4dbe - React-RCTLinking: 494b785a40d952a1dfbe712f43214376e5f0e408 - React-RCTNetwork: b3d7c30cd21793e268db107dd0980cb61b3c1c44 - React-RCTRuntime: a8ff419d437228e7b8a793b14f9d711e1cbb82af - React-RCTSettings: a060c7e381a3896104761b8eed7e284d95e37df3 - React-RCTText: 4f272b72dbb61f390d8c8274528f9fdbff983806 - React-RCTVibration: 0e5326220719aca12473d703aa46693e3b4ce67a + React-RCTAnimation: cc64adc259aabc3354b73065e2231d796dfce576 + React-RCTAppDelegate: 9d523da768f1c9e84c5f3b7e3624d097dfb0e16b + React-RCTBlob: e727f53eeefded7e6432eb76bd22b57bc880e5d1 + React-RCTFabric: 58590aa4fdb4ad546c06a7449b486cf6844e991f + React-RCTFBReactNativeSpec: 9064c63d99e467a3893e328ba3612745c3c3a338 + React-RCTImage: 7159cbdbb18a09d97ba1a611416eced75b3ccb29 + React-RCTLinking: 46293afdb859bccc63e1d3dedc6901a3c04ef360 + React-RCTNetwork: 4a6cd18f5bcd0363657789c64043123a896b1170 + React-RCTRuntime: 5ab904fd749aa52f267ef771d265612582a17880 + React-RCTSettings: 61e361dc85136d1cb0e148b7541993d2ee950ea7 + React-RCTText: abd1e196c3167175e6baef18199c6d9d8ac54b4e + React-RCTVibration: 490e0dcb01a3fe4a0dfb7bc51ad5856d8b84f343 React-rendererconsistency: 351fdbc5c1fe4da24243d939094a80f0e149c7a1 - React-renderercss: d333f2ada83969591100d91ec6b23ca2e17e1507 - React-rendererdebug: 039e5949b72ba63c703de020701e3fd152434c61 + React-renderercss: 3438814bee838ae7840a633ab085ac81699fd5cf + React-rendererdebug: 0ac2b9419ad6f88444f066d4b476180af311fb1e React-rncore: 57ed480649bb678d8bdc386d20fee8bf2b0c307c - React-RuntimeApple: 344a5e1105256000afabaa8df12c3e4cab880340 - React-RuntimeCore: 0e48fb5e5160acc0334c7a723a42d42cef4b58b6 + React-RuntimeApple: 8b7a9788f31548298ba1990620fe06b40de65ad7 + React-RuntimeCore: e03d96fbd57ce69fd9bca8c925942194a5126dbc React-runtimeexecutor: d60846710facedd1edb70c08b738119b3ee2c6c2 - React-RuntimeHermes: 064286a03871d932c99738e0f8ef854962ab4b99 - React-runtimescheduler: e917ab17ae08c204af1ebf8f669b7e411b0220c8 + React-RuntimeHermes: aab794755d9f6efd249b61f3af4417296904e3ba + React-runtimescheduler: c3cd124fa5db7c37f601ee49ca0d97019acd8788 React-timing: a90f4654cbda9c628614f9bee68967f1768bd6a5 - React-utils: 51c4e71608b8133fecc9a15801d244ae7bdf3758 - ReactAppDependencyProvider: d5dcc564f129632276bd3184e60f053fcd574d6b - ReactCodegen: c9a256facbe4996140f3fb95c7f03ba61c12acc9 - ReactCommon: 4d0da92a5eb8da86c08e3ec34bd23ab439fb2461 - ReactNativeHost: 2002cc963022a296ef9e85fc7825aa8f62c55ac7 - ReactTestApp-DevSupport: 8f2bfaea9444fcf141b1f694c02d2af51fd6ec1c + React-utils: a612d50555b6f0f90c74b7d79954019ad47f5de6 + ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584 + ReactCodegen: 7ea266ccd94436294f516247db7402b57b1214af + ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0 + ReactNativeHost: 86588bac1a403c7a1cdeafc806691b7106b7d1a1 + ReactTestApp-DevSupport: 45d6eeb4188c286d2ebf8f77ff17ee5d66b9f9a4 ReactTestApp-Resources: 1bd9ff10e4c24f2ad87101a32023721ae923bccf - RNGestureHandler: 5d8431415d4b8518e86e289e9ad5bb9be78f6dba - RNReanimated: 44c559bda6bcfa00af5be64f5c26c1b1184b83ca + RNGestureHandler: ebef699ea17e7c0006c1074e1e423ead60ce0121 + RNReanimated: fa8ba6aacc56dcbe0ebd91b7e6bb796b58588db7 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 9f110fc4b7aa538663cba3c14cbb1c335f43c13f + Yoga: c758bfb934100bb4bf9cbaccb52557cee35e8bdf PODFILE CHECKSUM: b4c1d70c599aba416a49b6bad5eea5084b4e43d0 -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/packages/webgpu/cpp/rnwgpu/api/AsyncRunner.h b/packages/webgpu/cpp/rnwgpu/api/AsyncRunner.h index dafe6a918..487a8903d 100644 --- a/packages/webgpu/cpp/rnwgpu/api/AsyncRunner.h +++ b/packages/webgpu/cpp/rnwgpu/api/AsyncRunner.h @@ -23,7 +23,7 @@ class AsyncRunner { }); } -private: +public: wgpu::Instance *instance; }; diff --git a/packages/webgpu/cpp/rnwgpu/api/GPUDevice.cpp b/packages/webgpu/cpp/rnwgpu/api/GPUDevice.cpp index 5e44783dd..932fbf89b 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPUDevice.cpp +++ b/packages/webgpu/cpp/rnwgpu/api/GPUDevice.cpp @@ -279,47 +279,68 @@ void GPUDevice::pushErrorScope(wgpu::ErrorFilter filter) { std::future>> GPUDevice::popErrorScope() { - return _async->runAsync([=](wgpu::Instance *instance) { - std::variant> result = nullptr; - auto future = _instance.PopErrorScope( - wgpu::CallbackMode::WaitAnyOnly, - [&result](wgpu::PopErrorScopeStatus, wgpu::ErrorType type, - char const *message) { - switch (type) { - case wgpu::ErrorType::NoError: - break; - case wgpu::ErrorType::OutOfMemory: { - result = std::make_shared(wgpu::ErrorType::OutOfMemory, - message); - break; - } - case wgpu::ErrorType::Validation: { - result = std::make_shared(wgpu::ErrorType::Validation, - message); - break; - } - case wgpu::ErrorType::Internal: { - result = - std::make_shared(wgpu::ErrorType::Internal, message); - break; - } - case wgpu::ErrorType::Unknown: - result = - std::make_shared(wgpu::ErrorType::Unknown, message); - break; - default: - throw std::runtime_error( - "unhandled error type (" + - std::to_string( - static_cast::type>( - type)) + - ")"); - break; - } - }); - instance->WaitAny(future, UINT64_MAX); - return result; - }); + // Create a promise to return a future, but do the work synchronously on main + // thread + auto promise = std::make_shared< + std::promise>>>(); + auto future = promise->get_future(); + + std::variant> result = nullptr; + + auto wgpu_future = _instance.PopErrorScope( + wgpu::CallbackMode::WaitAnyOnly, + [&result](wgpu::PopErrorScopeStatus status, wgpu::ErrorType type, + wgpu::StringView message) { + switch (status) { + case wgpu::PopErrorScopeStatus::Error: + // PopErrorScope itself failed, e.g. the error scope stack was empty. + return; + case wgpu::PopErrorScopeStatus::CallbackCancelled: + // The instance has been dropped. Shouldn't happen except maybe during + // shutdown. + return; + case wgpu::PopErrorScopeStatus::Success: + // This is the only case where `type` is set to a meaningful value. + break; + } + switch (type) { + case wgpu::ErrorType::NoError: + break; + case wgpu::ErrorType::OutOfMemory: { + result = std::make_shared(wgpu::ErrorType::OutOfMemory, + std::string(message)); + break; + } + case wgpu::ErrorType::Validation: { + result = std::make_shared(wgpu::ErrorType::Validation, + std::string(message)); + break; + } + case wgpu::ErrorType::Internal: { + result = std::make_shared(wgpu::ErrorType::Internal, + std::string(message)); + break; + } + case wgpu::ErrorType::Unknown: + result = std::make_shared(wgpu::ErrorType::Unknown, + std::string(message)); + break; + default: + throw std::runtime_error( + "unhandled error type (" + + std::to_string( + static_cast::type>( + type)) + + ")"); + break; + } + }); + + // Wait synchronously on main thread - both push and pop now on same thread + _async->instance->WaitAny(wgpu_future, UINT64_MAX); + + promise->set_value(result); + return future; } std::unordered_set GPUDevice::getFeatures() { diff --git a/packages/webgpu/cpp/rnwgpu/api/GPUError.h b/packages/webgpu/cpp/rnwgpu/api/GPUError.h index 40b081a65..09b857d21 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPUError.h +++ b/packages/webgpu/cpp/rnwgpu/api/GPUError.h @@ -12,11 +12,11 @@ namespace rnwgpu { class GPUError { public: - GPUError(wgpu::ErrorType aType, char const *aMessage) - : type(aType), message(aMessage) {} + GPUError(wgpu::ErrorType aType, std::string aMessage) + : type(aType), message(std::move(aMessage)) {} wgpu::ErrorType type; - char const *message; + std::string message; }; } // namespace rnwgpu @@ -33,8 +33,9 @@ template <> struct JSIConverter> { static jsi::Value toJSI(jsi::Runtime &runtime, std::shared_ptr arg) { jsi::Object result(runtime); - result.setProperty(runtime, "message", - jsi::String::createFromUtf8(runtime, arg->message)); + result.setProperty( + runtime, "message", + jsi::String::createFromUtf8(runtime, arg->message.c_str())); return result; } }; diff --git a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp index d7bab5cc5..99be1f252 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +++ b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp @@ -2,8 +2,8 @@ #include #include -#include "GPURenderPassEncoder.h" #include "Convertors.h" +#include "GPURenderPassEncoder.h" namespace rnwgpu { diff --git a/packages/webgpu/package.json b/packages/webgpu/package.json index e0d409824..fd0fdbd2b 100644 --- a/packages/webgpu/package.json +++ b/packages/webgpu/package.json @@ -1,6 +1,6 @@ { "name": "react-native-wgpu", - "version": "0.2.3", + "version": "0.2.4", "description": "React Native WebGPU", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/packages/webgpu/src/__tests__/ErrorScope.spec.ts b/packages/webgpu/src/__tests__/ErrorScope.spec.ts new file mode 100644 index 000000000..be4704945 --- /dev/null +++ b/packages/webgpu/src/__tests__/ErrorScope.spec.ts @@ -0,0 +1,92 @@ +import { client } from "./setup"; + +describe("Error Scope", () => { + it("should capture validation error when creating sampler with invalid maxAnisotropy", async () => { + const result = await client.eval(({ device }) => { + device.pushErrorScope("validation"); + device.createSampler({ + maxAnisotropy: 0, // Invalid, maxAnisotropy must be at least 1. + }); + return device.popErrorScope().then((error) => { + if (error) { + return { + hasError: true, + message: error.message, + messageLength: error.message.length, + messageNotEmpty: error.message.length > 0, + }; + } else { + return { + hasError: false, + message: "", + messageLength: 0, + messageNotEmpty: false, + }; + } + }); + }); + + expect(result.hasError).toBe(true); + expect(result.messageNotEmpty).toBe(true); + expect(result.messageLength).toBeGreaterThan(0); + }); + it("should capture and return error messages from popErrorScope", async () => { + const result = await client.eval(({ device }) => { + // Invalid WGSL shader with syntax error (missing closing parenthesis) + const invalidShaderWGSL = `@fragment + fn main() -> @location(0) vec4f { + return vec4(1.0, 0.0, 0.0, 1.0; + }`; + device.pushErrorScope("validation"); + // This should generate a validation error due to syntax error + device.createShaderModule({ + code: invalidShaderWGSL, + }); + return device.popErrorScope().then((error) => { + if (error) { + return { + hasError: true, + message: error.message, + messageLength: error.message.length, + messageNotEmpty: error.message.length > 0, + messageContainsExpected: + error.message.includes("expected") || + error.message.includes("error") || + error.message.includes("parsing"), + }; + } else { + return { + hasError: false, + message: "", + messageLength: 0, + messageNotEmpty: false, + messageContainsExpected: false, + }; + } + }); + }); + expect(result.hasError).toBe(true); + expect(result.messageNotEmpty).toBe(true); + expect(result.messageLength).toBeGreaterThan(0); + // The error message should contain some indication that it's a parsing error + expect(result.messageContainsExpected).toBe(true); + }); + + it("should return null when no error occurs", async () => { + const result = await client.eval(({ device, shaders: { redFragWGSL } }) => { + device.pushErrorScope("validation"); + // This should not generate any errors + device.createShaderModule({ + code: redFragWGSL, + }); + return device.popErrorScope().then((error) => { + return { + hasError: error !== null, + error: error, + }; + }); + }); + expect(result.hasError).toBe(false); + expect(result.error).toBe(null); + }); +}); From de9daec4eb2470c3f946fd96fd25480f5ba094d5 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Thu, 11 Sep 2025 14:29:00 +0200 Subject: [PATCH 2/4] :wrench: --- packages/webgpu/cpp/dawn_logging.cpp | 2 +- packages/webgpu/cpp/rnwgpu/api/GPUError.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/webgpu/cpp/dawn_logging.cpp b/packages/webgpu/cpp/dawn_logging.cpp index 5bbd6caeb..fcd000e4c 100644 --- a/packages/webgpu/cpp/dawn_logging.cpp +++ b/packages/webgpu/cpp/dawn_logging.cpp @@ -65,7 +65,7 @@ LogMessage::~LogMessage() { case LogSeverity::Error: severityName = "Error"; break; default: severityName = "Unknown"; break; } - + #ifdef __ANDROID__ int androidPriority; switch (mSeverity) { diff --git a/packages/webgpu/cpp/rnwgpu/api/GPUError.h b/packages/webgpu/cpp/rnwgpu/api/GPUError.h index 09b857d21..d4bd6c242 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPUError.h +++ b/packages/webgpu/cpp/rnwgpu/api/GPUError.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include "webgpu/webgpu_cpp.h" From ff61c7e1c3a578f2e417bd80ea6d12b08eef293d Mon Sep 17 00:00:00 2001 From: William Candillon Date: Thu, 11 Sep 2025 14:40:11 +0200 Subject: [PATCH 3/4] :green_heart: --- packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp index 99be1f252..d7bab5cc5 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +++ b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp @@ -2,8 +2,8 @@ #include #include -#include "Convertors.h" #include "GPURenderPassEncoder.h" +#include "Convertors.h" namespace rnwgpu { From c50f63440562e982a861b28884afe44c8ef284a8 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Thu, 11 Sep 2025 14:52:50 +0200 Subject: [PATCH 4/4] :wrench: --- packages/webgpu/cpp/rnwgpu/api/GPUError.h | 2 +- packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp | 1 - packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.h | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webgpu/cpp/rnwgpu/api/GPUError.h b/packages/webgpu/cpp/rnwgpu/api/GPUError.h index d4bd6c242..b6afa97f8 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPUError.h +++ b/packages/webgpu/cpp/rnwgpu/api/GPUError.h @@ -1,8 +1,8 @@ #pragma once #include -#include #include +#include #include "webgpu/webgpu_cpp.h" diff --git a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp index d7bab5cc5..227134583 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +++ b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.cpp @@ -3,7 +3,6 @@ #include #include "GPURenderPassEncoder.h" -#include "Convertors.h" namespace rnwgpu { diff --git a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.h b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.h index a2f17fd43..acfa0f98e 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.h +++ b/packages/webgpu/cpp/rnwgpu/api/GPURenderPassEncoder.h @@ -8,6 +8,7 @@ #include "Unions.h" +#include "Convertors.h" #include "RNFHybridObject.h" #include "AsyncRunner.h"