@@ -22,12 +22,10 @@ namespace {
2222
2323struct AdapterResult {
2424 WGPUAdapter adapter = nullptr ;
25- bool done = false ;
2625};
2726
2827struct DeviceResult {
2928 WGPUDevice device = nullptr ;
30- bool done = false ;
3129};
3230
3331void on_adapter_request (
@@ -47,7 +45,6 @@ void on_adapter_request(
4745 static_cast <int >(message.length ),
4846 message.data );
4947 }
50- result->done = true ;
5148}
5249
5350void on_device_request (
@@ -67,7 +64,6 @@ void on_device_request(
6764 static_cast <int >(message.length ),
6865 message.data );
6966 }
70- result->done = true ;
7167}
7268
7369void on_device_error (
@@ -89,34 +85,36 @@ void on_device_error(
8985WebGPUContext create_webgpu_context () {
9086 WebGPUContext ctx;
9187
92- ctx.instance = wgpuCreateInstance (nullptr );
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);
9399 if (!ctx.instance ) {
94100 throw std::runtime_error (" Failed to create WebGPU instance" );
95101 }
96102
97- // Request adapter using AllowSpontaneous mode (fires during
98- // wgpuInstanceProcessEvents or any other API call).
99103 AdapterResult adapter_result;
100104 WGPURequestAdapterCallbackInfo adapter_cb = {};
101- adapter_cb.mode = WGPUCallbackMode_AllowSpontaneous ;
105+ adapter_cb.mode = WGPUCallbackMode_WaitAnyOnly ;
102106 adapter_cb.callback = on_adapter_request;
103107 adapter_cb.userdata1 = &adapter_result;
104108
105- // Release Dawn has no bundled fallback adapter; pick the platform backend
106- // (Metal on Apple, Vulkan elsewhere -- SwiftShader via VK_ICD_FILENAMES).
109+ // No backend pin or forced fallback; Dawn auto-selects the adapter.
107110 WGPURequestAdapterOptions adapter_opts = {};
108- #if defined(__APPLE__)
109- adapter_opts.backendType = WGPUBackendType_Metal;
110- #else
111- adapter_opts.backendType = WGPUBackendType_Vulkan;
112- #endif
111+ adapter_opts.powerPreference = WGPUPowerPreference_HighPerformance;
113112 adapter_opts.forceFallbackAdapter = false ;
114- wgpuInstanceRequestAdapter (ctx.instance , &adapter_opts, adapter_cb);
115- while (!adapter_result.done ) {
116- webgpu_poll (ctx.instance );
117- }
113+ WGPUWaitStatus adapter_wait = webgpu_wait (
114+ ctx.instance ,
115+ wgpuInstanceRequestAdapter (ctx.instance , &adapter_opts, adapter_cb));
118116
119- if (!adapter_result.adapter ) {
117+ if (adapter_wait != WGPUWaitStatus_Success || !adapter_result.adapter ) {
120118 wgpuInstanceRelease (ctx.instance );
121119 ctx.instance = nullptr ;
122120 throw std::runtime_error (
@@ -128,7 +126,7 @@ WebGPUContext create_webgpu_context() {
128126 // Request device
129127 DeviceResult device_result;
130128 WGPURequestDeviceCallbackInfo device_cb = {};
131- device_cb.mode = WGPUCallbackMode_AllowSpontaneous ;
129+ device_cb.mode = WGPUCallbackMode_WaitAnyOnly ;
132130 device_cb.callback = on_device_request;
133131 device_cb.userdata1 = &device_result;
134132
@@ -141,12 +139,11 @@ WebGPUContext create_webgpu_context() {
141139 }
142140 device_desc.uncapturedErrorCallbackInfo .callback = on_device_error;
143141
144- wgpuAdapterRequestDevice (ctx.adapter , &device_desc, device_cb);
145- while (!device_result.done ) {
146- webgpu_poll (ctx.instance );
147- }
142+ WGPUWaitStatus device_wait = webgpu_wait (
143+ ctx.instance ,
144+ wgpuAdapterRequestDevice (ctx.adapter , &device_desc, device_cb));
148145
149- if (!device_result.device ) {
146+ if (device_wait != WGPUWaitStatus_Success || !device_result.device ) {
150147 wgpuAdapterRelease (ctx.adapter );
151148 wgpuInstanceRelease (ctx.instance );
152149 ctx.adapter = nullptr ;
0 commit comments