egui: fall back to software rendering
This commit is contained in:
parent
8ff205a266
commit
17e434ba34
1 changed files with 45 additions and 38 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue