From 8237eea4e9dd3f8d4056c538fbd3d28db3d7aebe Mon Sep 17 00:00:00 2001 From: Jinny You Date: Fri, 13 Dec 2024 14:52:40 +0900 Subject: [PATCH] wasm: handle WebGPU initialization failure case --- src/bindings/wasm/tvgWasmLottieAnimation.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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;