@@ -135,9 +135,35 @@ async::AsyncTaskHandle GPUAdapter::requestDevice(
135135 deviceLostBinding,
136136 creationRuntime](const async::AsyncTaskHandle::ResolveFunction &resolve,
137137 const async::AsyncTaskHandle::RejectFunction &reject) {
138- (void )descriptor;
138+ // Build a local mutable copy so we can chain Dawn's device toggles.
139+ // The toggle name strings are owned by `descriptor` (captured above),
140+ // and the const char* / DawnTogglesDescriptor locals live for the
141+ // whole synchronous RequestDevice call below, which is when Dawn reads
142+ // the chained struct.
143+ wgpu::DeviceDescriptor deviceDesc = aDescriptor;
144+ wgpu::DawnTogglesDescriptor toggles{};
145+ std::vector<const char *> enabledToggles;
146+ std::vector<const char *> disabledToggles;
147+ if (descriptor.has_value () && descriptor.value ()->dawnToggles ) {
148+ const auto &dawnToggles = descriptor.value ()->dawnToggles .value ();
149+ if (dawnToggles->enabledToggles ) {
150+ for (const auto &t : dawnToggles->enabledToggles .value ()) {
151+ enabledToggles.push_back (t.c_str ());
152+ }
153+ toggles.enabledToggleCount = enabledToggles.size ();
154+ toggles.enabledToggles = enabledToggles.data ();
155+ }
156+ if (dawnToggles->disabledToggles ) {
157+ for (const auto &t : dawnToggles->disabledToggles .value ()) {
158+ disabledToggles.push_back (t.c_str ());
159+ }
160+ toggles.disabledToggleCount = disabledToggles.size ();
161+ toggles.disabledToggles = disabledToggles.data ();
162+ }
163+ deviceDesc.nextInChain = &toggles;
164+ }
139165 _instance.RequestDevice (
140- &aDescriptor , wgpu::CallbackMode::AllowProcessEvents,
166+ &deviceDesc , wgpu::CallbackMode::AllowProcessEvents,
141167 [asyncRunner = _async, resolve, reject, label, creationRuntime,
142168 deviceLostBinding](wgpu::RequestDeviceStatus status,
143169 wgpu::Device device,
0 commit comments