device: allow attributes in device_owned_handle types, fix device creation
This commit is contained in:
parent
0db6b7790d
commit
b2730fecbd
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue