@@ -22,10 +22,12 @@ namespace {
2222
2323struct AdapterResult {
2424 WGPUAdapter adapter = nullptr ;
25+ bool done = false ;
2526};
2627
2728struct DeviceResult {
2829 WGPUDevice device = nullptr ;
30+ bool done = false ;
2931};
3032
3133void on_adapter_request (
@@ -45,6 +47,7 @@ void on_adapter_request(
4547 static_cast <int >(message.length ),
4648 message.data );
4749 }
50+ result->done = true ;
4851}
4952
5053void on_device_request (
@@ -64,6 +67,7 @@ void on_device_request(
6467 static_cast <int >(message.length ),
6568 message.data );
6669 }
70+ result->done = true ;
6771}
6872
6973void on_device_error (
@@ -85,36 +89,34 @@ void on_device_error(
8589WebGPUContext create_webgpu_context () {
8690 WebGPUContext ctx;
8791
88- // TimedWaitAny lets webgpu_wait() block on futures via wgpuInstanceWaitAny.
89- WGPUInstanceDescriptor instance_desc = {};
90- #if defined(__EMSCRIPTEN__)
91- instance_desc.capabilities .timedWaitAnyEnable = true ;
92- instance_desc.capabilities .timedWaitAnyMaxCount = 1 ;
93- #else
94- WGPUInstanceFeatureName features[1 ] = {WGPUInstanceFeatureName_TimedWaitAny};
95- instance_desc.requiredFeatureCount = 1 ;
96- instance_desc.requiredFeatures = features;
97- #endif
98- ctx.instance = wgpuCreateInstance (&instance_desc);
92+ ctx.instance = wgpuCreateInstance (nullptr );
9993 if (!ctx.instance ) {
10094 throw std::runtime_error (" Failed to create WebGPU instance" );
10195 }
10296
97+ // Request adapter using AllowSpontaneous mode (fires during
98+ // wgpuInstanceProcessEvents or any other API call).
10399 AdapterResult adapter_result;
104100 WGPURequestAdapterCallbackInfo adapter_cb = {};
105- adapter_cb.mode = WGPUCallbackMode_WaitAnyOnly ;
101+ adapter_cb.mode = WGPUCallbackMode_AllowSpontaneous ;
106102 adapter_cb.callback = on_adapter_request;
107103 adapter_cb.userdata1 = &adapter_result;
108104
109- // No backend pin or forced fallback; Dawn auto-selects the adapter.
105+ // Release Dawn has no bundled fallback adapter; pick the platform backend
106+ // (Metal on Apple, Vulkan elsewhere -- SwiftShader via VK_ICD_FILENAMES).
110107 WGPURequestAdapterOptions adapter_opts = {};
111- adapter_opts.powerPreference = WGPUPowerPreference_HighPerformance;
108+ #if defined(__APPLE__)
109+ adapter_opts.backendType = WGPUBackendType_Metal;
110+ #else
111+ adapter_opts.backendType = WGPUBackendType_Vulkan;
112+ #endif
112113 adapter_opts.forceFallbackAdapter = false ;
113- WGPUWaitStatus adapter_wait = webgpu_wait (
114- ctx.instance ,
115- wgpuInstanceRequestAdapter (ctx.instance , &adapter_opts, adapter_cb));
114+ wgpuInstanceRequestAdapter (ctx.instance , &adapter_opts, adapter_cb);
115+ while (!adapter_result.done ) {
116+ webgpu_poll (ctx.instance );
117+ }
116118
117- if (adapter_wait != WGPUWaitStatus_Success || !adapter_result.adapter ) {
119+ if (!adapter_result.adapter ) {
118120 wgpuInstanceRelease (ctx.instance );
119121 ctx.instance = nullptr ;
120122 throw std::runtime_error (
@@ -126,7 +128,7 @@ WebGPUContext create_webgpu_context() {
126128 // Request device
127129 DeviceResult device_result;
128130 WGPURequestDeviceCallbackInfo device_cb = {};
129- device_cb.mode = WGPUCallbackMode_WaitAnyOnly ;
131+ device_cb.mode = WGPUCallbackMode_AllowSpontaneous ;
130132 device_cb.callback = on_device_request;
131133 device_cb.userdata1 = &device_result;
132134
@@ -139,11 +141,12 @@ WebGPUContext create_webgpu_context() {
139141 }
140142 device_desc.uncapturedErrorCallbackInfo .callback = on_device_error;
141143
142- WGPUWaitStatus device_wait = webgpu_wait (
143- ctx.instance ,
144- wgpuAdapterRequestDevice (ctx.adapter , &device_desc, device_cb));
144+ wgpuAdapterRequestDevice (ctx.adapter , &device_desc, device_cb);
145+ while (!device_result.done ) {
146+ webgpu_poll (ctx.instance );
147+ }
145148
146- if (device_wait != WGPUWaitStatus_Success || !device_result.device ) {
149+ if (!device_result.device ) {
147150 wgpuAdapterRelease (ctx.adapter );
148151 wgpuInstanceRelease (ctx.instance );
149152 ctx.adapter = nullptr ;
0 commit comments