From b2730fecbd48777e25b4be8056620387b7aed638 Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 19 Jan 2025 18:45:42 +0100 Subject: [PATCH] device: allow attributes in device_owned_handle types, fix device creation --- crates/renderer/src/device.rs | 76 ++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/crates/renderer/src/device.rs b/crates/renderer/src/device.rs index 45c2528..1e163d1 100644 --- a/crates/renderer/src/device.rs +++ b/crates/renderer/src/device.rs @@ -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::>(); + .collect::>(); 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); pub type WeakDevice = std::sync::Weak; impl Device { - pub fn new_from_default_desc(display_handle: Option) -> crate::Result { + pub fn new_from_default_desc( + display_handle: Option, + with_instance_extensions: &[Extension<'_>], + ) -> crate::Result { 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 { + 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 for DeviceAndQueues { #[derive(Clone)] pub struct DeviceOwnedDebugObject { - device: Device, - object: T, + pub(crate) device: Device, + pub(crate) object: T, #[cfg(debug_assertions)] name: Option>, } @@ -1034,19 +1051,20 @@ pub trait DeviceOwned { 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 {