diff options
Diffstat (limited to 'third_party/rust/ash/src/entry_libloading.rs')
-rw-r--r-- | third_party/rust/ash/src/entry_libloading.rs | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/third_party/rust/ash/src/entry_libloading.rs b/third_party/rust/ash/src/entry_libloading.rs new file mode 100644 index 0000000000..edf2e4eb3f --- /dev/null +++ b/third_party/rust/ash/src/entry_libloading.rs @@ -0,0 +1,69 @@ +use crate::entry::EntryCustom; +use libloading::Library; +use std::error::Error; +use std::fmt; +use std::ptr; +use std::sync::Arc; + +#[cfg(windows)] +const LIB_PATH: &str = "vulkan-1.dll"; + +#[cfg(all( + unix, + not(any(target_os = "macos", target_os = "ios", target_os = "android")) +))] +const LIB_PATH: &str = "libvulkan.so.1"; + +#[cfg(target_os = "android")] +const LIB_PATH: &str = "libvulkan.so"; + +#[cfg(any(target_os = "macos", target_os = "ios"))] +const LIB_PATH: &str = "libvulkan.dylib"; + +/// Function loader +pub type Entry = EntryCustom<Arc<Library>>; + +#[derive(Debug)] +pub struct LoadingError(libloading::Error); + +impl fmt::Display for LoadingError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Display::fmt(&self.0, f) + } +} + +impl Error for LoadingError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + Error::source(&self.0) + } +} + +impl EntryCustom<Arc<Library>> { + /// ```rust,no_run + /// use ash::{vk, Entry, version::EntryV1_0}; + /// # fn main() -> Result<(), Box<std::error::Error>> { + /// let entry = Entry::new()?; + /// let app_info = vk::ApplicationInfo { + /// api_version: vk::make_version(1, 0, 0), + /// ..Default::default() + /// }; + /// let create_info = vk::InstanceCreateInfo { + /// p_application_info: &app_info, + /// ..Default::default() + /// }; + /// let instance = unsafe { entry.create_instance(&create_info, None)? }; + /// # Ok(()) } + /// ``` + pub fn new() -> Result<Entry, LoadingError> { + let lib = Library::new(&LIB_PATH) + .map_err(LoadingError) + .map(Arc::new)?; + + Ok(Self::new_custom(lib, |vk_lib, name| unsafe { + vk_lib + .get(name.to_bytes_with_nul()) + .map(|symbol| *symbol) + .unwrap_or(ptr::null_mut()) + })) + } +} |