diff --git a/crates/renderer/Cargo.toml b/crates/renderer/Cargo.toml index 212b3ff..115a6bc 100644 --- a/crates/renderer/Cargo.toml +++ b/crates/renderer/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] +renderer_macros = { path = "renderer_macros" } tinyvec = { workspace = true } arrayvec = { workspace = true } indexmap = { workspace = true } diff --git a/crates/renderer/renderer_macros/Cargo.toml b/crates/renderer/renderer_macros/Cargo.toml index f2c668f..31cf8d6 100644 --- a/crates/renderer/renderer_macros/Cargo.toml +++ b/crates/renderer/renderer_macros/Cargo.toml @@ -3,6 +3,10 @@ name = "renderer_macros" version = "0.1.0" edition = "2024" +[lib] +proc-macro = true + [dependencies] proc-macro2 = "1.0" -quote = "1.0" \ No newline at end of file +quote = "1.0" +syn = "2" diff --git a/crates/renderer/src/device.rs b/crates/renderer/src/device.rs index 5a51fed..32395fa 100644 --- a/crates/renderer/src/device.rs +++ b/crates/renderer/src/device.rs @@ -858,16 +858,17 @@ pub(crate) mod asdf { }; use ash::vk; + use ash::vk::Handle; use crate::{device::DeviceInner, util::DebugName}; pub mod traits { /// A trait describing an object owned by some manager-type, which is /// responsible for destroying it. - pub trait ExternallyManagedObject { + pub trait ExternallyManagedObject { /// # Safety /// The caller must ensure this function is only called once for a given object. - unsafe fn destroy(self, owner: &T); + unsafe fn destroy(self, owner: &Owner); } /// A trait describing an object which can have a debug name assigned to it. @@ -1043,6 +1044,29 @@ pub(crate) mod asdf { } } + impl std::fmt::Debug for DeviceObject + where + T: std::fmt::Debug + traits::ExternallyManagedObject, + O: AsRef, + { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut fmt = f.debug_struct(core::any::type_name::()); + let inner: &T = &self.inner; + + fmt.field_with("device", |f| { + write!( + f, + "0x{:x}", + self.inner.owner().as_ref().raw.handle().as_raw() + ) + }) + .field_with("handle", |f| write!(f, "{inner:?}")) + .field("name", &self.name); + + fmt.finish() + } + } + impl Deref for DeviceObject where T: traits::ExternallyManagedObject, @@ -1051,7 +1075,7 @@ pub(crate) mod asdf { type Target = T; fn deref(&self) -> &Self::Target { - &*self.inner + &self.inner } } @@ -1061,7 +1085,7 @@ pub(crate) mod asdf { O: AsRef, { fn deref_mut(&mut self) -> &mut Self::Target { - &mut *self.inner + &mut self.inner } }