Skip to content

Commit 13b12d5

Browse files
committed
Update
[ghstack-poisoned]
2 parents 65133d0 + 683cce0 commit 13b12d5

3 files changed

Lines changed: 29 additions & 34 deletions

File tree

backends/webgpu/runtime/WebGPUCompat.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010

1111
#include <webgpu/webgpu.h>
1212

13-
#include <cstdint>
14-
1513
#if defined(__EMSCRIPTEN__)
1614
#include <emscripten/emscripten.h>
1715
#else
@@ -21,14 +19,9 @@
2119

2220
namespace executorch::backends::webgpu {
2321

24-
// Caller's instance must enable TimedWaitAny; returns the WaitAny status.
25-
inline WGPUWaitStatus webgpu_wait(WGPUInstance instance, WGPUFuture future) {
26-
WGPUFutureWaitInfo info = {};
27-
info.future = future;
28-
return wgpuInstanceWaitAny(instance, 1, &info, UINT64_MAX);
29-
}
30-
31-
// Blocking event-loop pump for the output-map readback (browser: JS yield).
22+
// Make progress on pending WebGPU callbacks; callers loop until their done flag
23+
// is set. Native (Dawn): pump the event queue + brief yield (no busy-spin).
24+
// Browser: yield to the JS event loop.
3225
inline void webgpu_poll(WGPUInstance instance) {
3326
#if defined(__EMSCRIPTEN__)
3427
(void)instance;

backends/webgpu/runtime/WebGPUDevice.cpp

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ namespace {
2222

2323
struct AdapterResult {
2424
WGPUAdapter adapter = nullptr;
25+
bool done = false;
2526
};
2627

2728
struct DeviceResult {
2829
WGPUDevice device = nullptr;
30+
bool done = false;
2931
};
3032

3133
void 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

5053
void 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

6973
void on_device_error(
@@ -85,36 +89,34 @@ void on_device_error(
8589
WebGPUContext 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;

backends/webgpu/runtime/WebGPUGraph.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,6 @@ void WebGPUGraph::copy_outputs(std::vector<std::pair<void*, size_t>>& outputs) {
619619
cb_info);
620620
}
621621

622-
// WaitAny returns pre-queue on CI Dawn+SwiftShader here; pump until mapped.
623622
bool all_mapped = false;
624623
while (!all_mapped) {
625624
webgpu_poll(instance_);

0 commit comments

Comments
 (0)