diff --git a/src/bindings/wasm/tvgWasmLottieAnimation.cpp b/src/bindings/wasm/tvgWasmLottieAnimation.cpp index b076ebff..61d1a2f8 100644 --- a/src/bindings/wasm/tvgWasmLottieAnimation.cpp +++ b/src/bindings/wasm/tvgWasmLottieAnimation.cpp @@ -43,12 +43,15 @@ static const char* NoError = "None"; static WGPUDevice device{}; static bool adapterRequested = false; static bool deviceRequested = false; + static bool initializationFailed = false; #endif // 0: success, 1: fail, 2: wait for async request int init() { #ifdef THORVG_WG_RASTER_SUPPORT + if (initializationFailed) return 1; + //Init WebGPU if (!instance) instance = wgpuCreateInstance(nullptr); @@ -57,7 +60,13 @@ int init() if (adapterRequested) return 2; const WGPURequestAdapterOptions requestAdapterOptions { .nextInChain = nullptr, .powerPreference = WGPUPowerPreference_HighPerformance, .forceFallbackAdapter = false }; - auto onAdapterRequestEnded = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, char const * message, void * pUserData) { *((WGPUAdapter*)pUserData) = adapter; }; + auto onAdapterRequestEnded = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, char const* message, void* pUserData) { + if (status != WGPURequestAdapterStatus_Success) { + initializationFailed = true; + return; + } + *((WGPUAdapter*)pUserData) = adapter; + }; wgpuInstanceRequestAdapter(instance, &requestAdapterOptions, onAdapterRequestEnded, &adapter); adapterRequested = true; @@ -71,7 +80,13 @@ int init() size_t featuresCount = wgpuAdapterEnumerateFeatures(adapter, featureNames); if (!device) { const WGPUDeviceDescriptor deviceDesc { .nextInChain = nullptr, .label = "The device", .requiredFeatureCount = featuresCount, .requiredFeatures = featureNames }; - auto onDeviceRequestEnded = [](WGPURequestDeviceStatus status, WGPUDevice device, char const * message, void * pUserData) { *((WGPUDevice*)pUserData) = device; }; + auto onDeviceRequestEnded = [](WGPURequestDeviceStatus status, WGPUDevice device, char const* message, void* pUserData) { + if (status != WGPURequestDeviceStatus_Success) { + initializationFailed = true; + return; + } + *((WGPUDevice*)pUserData) = device; + }; wgpuAdapterRequestDevice(adapter, &deviceDesc, onDeviceRequestEnded, &device); deviceRequested = true;