1
0
Fork 0
forked from wry/wry

egui: fall back to software rendering

This commit is contained in:
Julian Orth 2026-03-14 14:10:27 +01:00
parent 8ff205a266
commit 17e434ba34

View file

@ -408,50 +408,57 @@ impl EgvRenderer {
.enumerate_physical_devices() .enumerate_physical_devices()
.map_err(EgvError::EnumeratePhysicalDevice)? .map_err(EgvError::EnumeratePhysicalDevice)?
}; };
'outer: for phy in devices { for software in [false, true] {
let res = unsafe { instance.enumerate_device_extension_properties(phy) }; 'outer: for &phy in &devices {
let exts = match res { let res = unsafe { instance.enumerate_device_extension_properties(phy) };
Ok(res) => map_extension_properties(res), let exts = match res {
Err(e) => { Ok(res) => map_extension_properties(res),
log::error!( Err(e) => {
"Could not enumerate extensions of physical device: {}", log::error!(
ErrorFmt(e), "Could not enumerate extensions of physical device: {}",
); ErrorFmt(e),
continue; );
continue;
}
};
let mut drm_props = PhysicalDeviceDrmPropertiesEXT::default();
let mut props = PhysicalDeviceProperties2::default().push_next(&mut drm_props);
unsafe {
instance.get_physical_device_properties2(phy, &mut props);
} }
}; let props = props.properties;
let mut drm_props = PhysicalDeviceDrmPropertiesEXT::default(); physical_device = phy;
let mut props = PhysicalDeviceProperties2::default().push_next(&mut drm_props); device_extensions = exts;
unsafe { device_properties = props;
instance.get_physical_device_properties2(phy, &mut props); if let Some(dev) = dev
} && !software
let props = props.properties; {
physical_device = phy; if device_extensions.not_contains_key(physical_device_drm::NAME) {
device_extensions = exts; continue 'outer;
device_properties = props; }
if let Some(dev) = dev { let major = uapi::major(dev) as i64;
if device_extensions.not_contains_key(physical_device_drm::NAME) { let minor = uapi::minor(dev) as i64;
continue 'outer; let matches = (drm_props.has_primary == vk::TRUE
} && drm_props.primary_major == major
let major = uapi::major(dev) as i64; && drm_props.primary_minor == minor)
let minor = uapi::minor(dev) as i64; || (drm_props.has_render == vk::TRUE
let matches = (drm_props.has_primary == vk::TRUE && drm_props.render_major == major
&& drm_props.primary_major == major && drm_props.render_minor == minor);
&& drm_props.primary_minor == minor) if matches {
|| (drm_props.has_render == vk::TRUE break 'find_device;
&& drm_props.render_major == major }
&& drm_props.render_minor == minor); } else {
if matches { if device_properties.device_type == PhysicalDeviceType::CPU {
break 'find_device; break 'find_device;
} }
} else {
if device_properties.device_type == PhysicalDeviceType::CPU {
break 'find_device;
} }
} }
} }
return Err(EgvError::NoVulkanDevice); return Err(EgvError::NoVulkanDevice);
} }
if device_properties.device_type == PhysicalDeviceType::CPU && dev.is_some() {
log::warn!("Using software rendering");
}
if device_properties.api_version < VULKAN_API_VERSION { if device_properties.api_version < VULKAN_API_VERSION {
return Err(EgvError::NoVulkan13); return Err(EgvError::NoVulkan13);
} }