rFactor2_vk_hud/src/vk_handles.rs

86 lines
2.3 KiB
Rust
Raw Normal View History

2023-01-11 14:03:32 +00:00
use anyhow::Result;
2023-01-11 17:51:31 +00:00
use std::{collections::HashMap, ffi::c_void, mem, ptr};
2023-01-11 14:03:32 +00:00
use vulkan_sys::prelude::*;
static mut FN_HANDLES: Option<VkTypedefHandles> = None;
pub fn vk_handles() -> &'static VkTypedefHandles {
unsafe { FN_HANDLES.as_ref().unwrap() }
}
pub fn vk_handles_mut() -> &'static mut VkTypedefHandles {
unsafe { FN_HANDLES.as_mut().unwrap() }
}
pub fn set_vk_handles(handles: VkTypedefHandles) {
unsafe { FN_HANDLES = Some(handles) };
}
pub struct VkTypedefHandles {
typedefs: Vec<String>,
functions: HashMap<String, PFN_vkVoidFunction>,
instance: VkInstance,
device: VkDevice,
}
impl VkTypedefHandles {
2023-01-11 17:51:31 +00:00
pub fn new() -> Result<Self> {
let fns = include_str!("../vk_functions");
let symbols = fns.lines().map(|s| s.to_string()).collect();
2023-01-11 14:03:32 +00:00
Ok(Self {
typedefs: symbols,
functions: HashMap::new(),
instance: VkInstance::NULL_HANDLE,
device: VkDevice::NULL_HANDLE,
})
}
pub fn load_instance_functions(
&mut self,
instance: VkInstance,
proc_addr: PFN_vkGetInstanceProcAddr,
) {
self.instance = instance;
unsafe {
for symbol in &self.typedefs {
let name = VkString::new(symbol);
let function = proc_addr(instance, name.as_ptr());
if mem::transmute::<PFN_vkVoidFunction, *const c_void>(function) != ptr::null() {
self.functions.insert(symbol.clone(), function);
}
}
}
}
pub fn load_device_functions(&mut self, device: VkDevice, proc_addr: PFN_vkGetDeviceProcAddr) {
self.device = device;
unsafe {
for symbol in &self.typedefs {
let name = VkString::new(symbol);
let function = proc_addr(device, name.as_ptr());
if mem::transmute::<PFN_vkVoidFunction, *const c_void>(function) != ptr::null() {
self.functions.insert(symbol.clone(), function);
}
}
}
}
pub fn handle(&self, symbol_name: impl ToString) -> Option<PFN_vkVoidFunction> {
self.functions.get(&symbol_name.to_string()).cloned()
}
pub fn instance(&self) -> VkInstance {
self.instance
}
pub fn device(&self) -> VkDevice {
self.device
}
}