diff --git a/src/device_handles.rs b/src/device_handles.rs index 44bfa25..9338bc3 100644 --- a/src/device_handles.rs +++ b/src/device_handles.rs @@ -3,6 +3,10 @@ use vulkan_sys::prelude::*; static mut DEVICE_FN_HANDLES: Option = None; +pub fn is_device_fns_initialized() -> bool { + unsafe { DEVICE_FN_HANDLES.is_some() } +} + pub fn device_fns() -> &'static VkDeviceHandles { unsafe { DEVICE_FN_HANDLES.as_ref().unwrap() } } diff --git a/src/instance_handles.rs b/src/instance_handles.rs index 7a78be4..5f0efef 100644 --- a/src/instance_handles.rs +++ b/src/instance_handles.rs @@ -2,6 +2,10 @@ use vulkan_sys::prelude::*; static mut INSTANCE_FN_HANDLES: Option = None; +pub fn is_instance_fns_initialized() -> bool { + unsafe { INSTANCE_FN_HANDLES.is_some() } +} + pub fn instance_fns() -> &'static VkInstanceHandles { unsafe { INSTANCE_FN_HANDLES.as_ref().unwrap() } } diff --git a/src/lib.rs b/src/lib.rs index b75d496..3d4d689 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,7 @@ mod instance_handles; mod device_handles; use std::{ + ffi::c_void, fs::{File, OpenOptions}, io::Write, mem, @@ -265,11 +266,41 @@ fn get_function(function_name: *const c_char) -> PFN_vkVoidFunction { _ => (), }; + if let Some(vk_fn) = load_vk_fn(&func_string) { + return vk_fn; + } + write_log(format!("\trequested fn: {}", s)); write_log(format!("\t-> not found")); Functions::Null.convert() } +fn load_vk_fn(name: &VkString) -> Option { + unsafe { + if is_instance_fns_initialized() { + let instance_fn = instance_fns() + .static_functions + .vkGetInstanceProcAddr(instance_fns().instance, name.as_ptr()); + + if mem::transmute::(instance_fn) != ptr::null() { + return Some(instance_fn); + } + } + + if is_device_fns_initialized() { + let device_fn = instance_fns() + .instance_functions + .vkGetDeviceProcAddr(device_fns().device, name.as_ptr()); + + if mem::transmute::(device_fn) != ptr::null() { + return Some(device_fn); + } + } + + return None; + } +} + extern "system" fn create_instance( create_info: *const VkInstanceCreateInfo, allocator: *const VkAllocationCallbacks,