device: allow attributes in device_owned_handle types, fix device creation

This commit is contained in:
Janis 2025-01-19 18:45:42 +01:00
parent 0db6b7790d
commit b2730fecbd

View file

@ -1,6 +1,6 @@
use std::{
borrow::Cow,
collections::{BTreeMap, BTreeSet, HashSet},
collections::{BTreeMap, BTreeSet, HashMap, HashSet},
ffi::{CStr, CString},
ops::Deref,
sync::Arc,
@ -192,11 +192,11 @@ impl<'a> Default for DeviceDesc<'a> {
app_version: Default::default(),
#[cfg(debug_assertions)]
layers: &DEBUG_LAYERS,
#[cfg(not(debug_assertions))]
layers: &[],
#[cfg(debug_assertions)]
layer_settings: Self::debug_layer_settings(),
#[cfg(not(debug_assertions))]
layers: &[],
#[cfg(not(debug_assertions))]
layer_settings: &[],
instance_extensions: Default::default(),
display_handle: Default::default(),
@ -509,18 +509,20 @@ impl DeviceBuilder {
let available_extension_names = available_extensions
.iter()
.filter_map(|ext| {
Some(Extension {
name: ext.extension_name_as_c_str().ok()?.to_str().ok()?,
version: ext.spec_version,
Some((
ext.extension_name_as_c_str().ok()?.to_str().ok()?,
ext.spec_version,
))
})
})
.collect::<HashSet<_>>();
.collect::<HashMap<_, _>>();
let mut out_extensions = Vec::new();
let mut unsupported_extensions = Vec::new();
for extension in extensions {
if available_extension_names.contains(&extension) {
if let Some(available_version) = available_extension_names.get(&extension.name)
&& *available_version >= extension.version
{
out_extensions.push(extension);
} else {
unsupported_extensions.push(extension);
@ -537,7 +539,10 @@ impl DeviceBuilder {
name: extension.to_str()?,
version: 0,
};
if available_extension_names.contains(&extension) {
if let Some(available_version) = available_extension_names.get(&extension.name)
&& *available_version >= extension.version
{
out_extensions.push(extension);
} else {
unsupported_extensions.push(extension);
@ -589,7 +594,10 @@ pub struct Device(Arc<DeviceInner>);
pub type WeakDevice = std::sync::Weak<DeviceInner>;
impl Device {
pub fn new_from_default_desc(display_handle: Option<RawDisplayHandle>) -> crate::Result<Self> {
pub fn new_from_default_desc(
display_handle: Option<RawDisplayHandle>,
with_instance_extensions: &[Extension<'_>],
) -> crate::Result<Self> {
Self::new_from_desc(DeviceDesc {
app_name: Some("Vidya"),
app_version: vk::make_api_version(0, 0, 1, 0),
@ -634,10 +642,12 @@ impl Device {
khr::spirv_1_4::NAME,
khr::spirv_1_4::SPEC_VERSION,
)]),
instance_extensions: with_instance_extensions,
..Default::default()
})
}
pub fn new_from_desc(desc: DeviceDesc) -> crate::Result<Self> {
tracing::debug!("creating new device with: {desc:#?}");
let entry = unsafe { ash::Entry::load()? };
let app_name = desc
@ -648,27 +658,30 @@ impl Device {
let app_info = vk::ApplicationInfo::default()
.api_version(desc.features.version)
.application_name(&app_name)
.engine_name(c"VidyaEngine")
.application_version(desc.app_version)
.engine_name(c"VidyaEngine")
.engine_version(vk::make_api_version(0, 0, 1, 0));
let mut validation_info =
vk::LayerSettingsCreateInfoEXT::default().settings(&desc.layer_settings);
let extra_layers = (!desc.layer_settings.is_empty())
.then_some(Extension {
name: "VK_EXT_debug_utils",
version: 1,
})
.into_iter()
.chain(
cfg_if::cfg_if! {if #[cfg(debug_assertions)] {
[Extension {
cfg_if::cfg_if! {
if #[cfg(debug_assertions)] {
let debug_layers = [Extension {
name: "VK_EXT_layer_settings",
version: 2,
}]} else {[]}}
.into_iter(),
);
}];
} else {
let debug_layers = [];
}
};
let extra_instance_extensions = [Extension {
name: "VK_EXT_debug_utils",
version: 1,
}]
.into_iter()
.chain(debug_layers.into_iter());
let layers = DeviceBuilder::get_layers(&entry, desc.layers.into_iter().cloned()).unwrap();
@ -678,7 +691,7 @@ impl Device {
desc.instance_extensions
.into_iter()
.cloned()
.chain(extra_layers),
.chain(extra_instance_extensions),
desc.display_handle,
)?;
@ -698,6 +711,10 @@ impl Device {
.enabled_layer_names(&layers.names)
.push_next(&mut validation_info);
tracing::debug!(
"Creating instance:\napp_info: {app_info:#?}\ncreate_info: {create_info:#?}"
);
let instance = unsafe { entry.create_instance(&create_info, None)? };
let debug_info = vk::DebugUtilsMessengerCreateInfoEXT::default()
@ -962,8 +979,8 @@ impl AsRef<ash::khr::swapchain::Device> for DeviceAndQueues {
#[derive(Clone)]
pub struct DeviceOwnedDebugObject<T> {
device: Device,
object: T,
pub(crate) device: Device,
pub(crate) object: T,
#[cfg(debug_assertions)]
name: Option<Cow<'static, str>>,
}
@ -1034,19 +1051,20 @@ pub trait DeviceOwned<T> {
macro_rules! define_device_owned_handle {
($(#[$attr:meta])*
$ty_vis:vis $ty:ident($handle:ty) {
$($field_vis:vis $field_name:ident : $field_ty:ty),*
$($(#[$field_attr:meta])* $field_vis:vis $field_name:ident : $field_ty:ty),*
$(,)?
} $(=> |$this:ident| $dtor:stmt)?) => {
$(#[$attr])*
$ty_vis struct $ty {
inner: crate::device::DeviceOwnedDebugObject<$handle>,
$(
$(#[$field_attr])*
$field_vis $field_name: $field_ty,
)*
}
impl crate::device::DeviceOwned<$handle> for $ty {
fn device(&self) -> &Device {
fn device(&self) -> &crate::device::Device {
self.inner.dev()
}
fn handle(&self) -> $handle {