diff --git a/ash/src/vk.rs b/ash/src/vk.rs index 13cb8bcd6..cd6775e5e 100644 --- a/ash/src/vk.rs +++ b/ash/src/vk.rs @@ -30,6 +30,12 @@ pub mod native; mod platform_types; pub use platform_types::*; +pub trait DispatchableHandle: Handle { + // We choose to use a pointer type for the parameter to avoid possible integer-to-pointer cast, + // to keep the pointer provenance. See details at https://github.com/ash-rs/ash/issues/996. + fn from_raw_ptr(_: *mut u8) -> Self; +} + pub trait Handle: Sized { const TYPE: ObjectType; fn as_raw(self) -> u64; diff --git a/ash/src/vk/macros.rs b/ash/src/vk/macros.rs index a9b76f8d3..a928a77a2 100644 --- a/ash/src/vk/macros.rs +++ b/ash/src/vk/macros.rs @@ -141,6 +141,11 @@ macro_rules! define_handle { Self(x as _) } } + impl $crate::vk::DispatchableHandle for $name { + fn from_raw_ptr(x: *mut u8) -> Self { + Self(x) + } + } unsafe impl Send for $name {} unsafe impl Sync for $name {} impl $name {