wip; wgpu fix

this avoids enumerating adapters if possible
This commit is contained in:
Ashley Wulber 2026-02-04 09:42:26 -05:00
parent e2918e0de9
commit 37572b76f9
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820

View file

@ -98,21 +98,19 @@ impl Compositor {
log::info!("{settings:#?}"); log::info!("{settings:#?}");
let available_adapters = instance.enumerate_adapters(settings.backends);
unsafe { unsafe {
std::env::remove_var("VK_LOADER_DRIVERS_DISABLE"); std::env::remove_var("VK_LOADER_DRIVERS_DISABLE");
} }
#[cfg(not(target_arch = "wasm32"))] // #[cfg(not(target_arch = "wasm32"))]
if log::max_level() >= log::LevelFilter::Info { // if log::max_level() >= log::LevelFilter::Info {
let available_adapters: Vec<_> = instance // let available_adapters: Vec<_> = instance
.enumerate_adapters(settings.backends) // .enumerate_adapters(settings.backends)
.iter() // .iter()
.map(wgpu::Adapter::get_info) // .map(wgpu::Adapter::get_info)
.collect(); // .collect();
log::info!("Available adapters: {available_adapters:#?}"); // log::info!("Available adapters: {available_adapters:#?}");
} // }
#[allow(unsafe_code)] #[allow(unsafe_code)]
let compatible_surface = compatible_window let compatible_surface = compatible_window
@ -133,12 +131,50 @@ impl Compositor {
not(target_os = "redox") not(target_os = "redox")
))] ))]
if let Some((vendor_id, device_id)) = ids { if let Some((vendor_id, device_id)) = ids {
adapter = available_adapters let a = instance
.request_adapter(&adapter_options)
.await
.map_err(|_error| {
Error::NoAdapterFound(format!("{adapter_options:?}"))
})?;
let info = a.get_info();
adapter = if info.device == device_id as u32
&& info.vendor == vendor_id as u32
{
Some(a)
} else {
instance
.enumerate_adapters(settings.backends)
.into_iter()
.filter(|adapter| {
let info = adapter.get_info();
info.device == device_id as u32
&& info.vendor == vendor_id as u32
})
.find(|adapter| {
if let Some(surface) = compatible_surface.as_ref() {
adapter.is_surface_supported(surface)
} else {
true
}
})
};
}
} else if let Ok(name) = std::env::var("WGPU_ADAPTER_NAME") {
let a = instance.request_adapter(&adapter_options).await.map_err(
|_error| Error::NoAdapterFound(format!("{adapter_options:?}")),
)?;
let info = a.get_info();
adapter = if info.name == name
{
Some(a)
} else {
instance
.enumerate_adapters(settings.backends)
.into_iter() .into_iter()
.filter(|adapter| { .filter(|adapter| {
let info = adapter.get_info(); let info = adapter.get_info();
info.device == device_id as u32 info.name == name
&& info.vendor == vendor_id as u32
}) })
.find(|adapter| { .find(|adapter| {
if let Some(surface) = compatible_surface.as_ref() { if let Some(surface) = compatible_surface.as_ref() {
@ -146,24 +182,10 @@ impl Compositor {
} else { } else {
true true
} }
}); })
} };
} else if let Ok(name) = std::env::var("WGPU_ADAPTER_NAME") {
adapter = available_adapters
.into_iter()
.filter(|adapter| {
let info = adapter.get_info();
info.name == name
})
.find(|adapter| {
if let Some(surface) = compatible_surface.as_ref() {
adapter.is_surface_supported(surface)
} else {
true
}
});
} }
dbg!(&adapter);
let adapter = match adapter { let adapter = match adapter {
Some(adapter) => adapter, Some(adapter) => adapter,
None => instance.request_adapter(&adapter_options).await.map_err( None => instance.request_adapter(&adapter_options).await.map_err(