use crate::sys::*;
use crate::core::*;
use crate::ffi::*;
#[no_mangle]
pub unsafe extern "C" fn vkCreateDevice(
physicalDevice: VkPhysicalDevice,
pCreateInfo: *const VkDeviceCreateInfo,
pAllocator: *const VkAllocationCallbacks,
pDevice: *mut VkDevice,
) -> VkResult {
if physicalDevice.is_null() || pCreateInfo.is_null() || pDevice.is_null() {
return VkResult::ErrorInitializationFailed;
}
if let Some(icd) = super::icd_loader::get_icd() {
if let Some(create_device_fn) = icd.create_device {
let result = create_device_fn(physicalDevice, pCreateInfo, pAllocator, pDevice);
if result == VkResult::Success {
if let Ok(mut icd_mut) = super::icd_loader::ICD_LOADER.lock() {
if let Some(icd) = icd_mut.as_mut() {
let _ = super::icd_loader::load_device_functions(icd, *pDevice);
}
}
}
return result;
}
}
VkResult::ErrorInitializationFailed
}
#[no_mangle]
pub unsafe extern "C" fn vkDestroyDevice(
device: VkDevice,
pAllocator: *const VkAllocationCallbacks,
) {
if device.is_null() {
return;
}
if let Some(icd) = super::forward::get_icd_if_enabled() {
if let Some(destroy_device) = icd.destroy_device {
destroy_device(device, pAllocator);
}
}
}
#[no_mangle]
pub unsafe extern "C" fn vkGetDeviceQueue(
device: VkDevice,
queueFamilyIndex: u32,
queueIndex: u32,
pQueue: *mut VkQueue,
) {
if device.is_null() || pQueue.is_null() {
return;
}
if let Some(icd) = super::forward::get_icd_if_enabled() {
if let Some(get_device_queue) = icd.get_device_queue {
get_device_queue(device, queueFamilyIndex, queueIndex, pQueue);
}
}
}
#[no_mangle]
pub unsafe extern "C" fn vkQueueSubmit(
queue: VkQueue,
submitCount: u32,
pSubmits: *const VkSubmitInfo,
fence: VkFence,
) -> VkResult {
if queue.is_null() {
return VkResult::ErrorDeviceLost;
}
if let Some(icd) = super::forward::get_icd_if_enabled() {
if let Some(queue_submit) = icd.queue_submit {
return queue_submit(queue, submitCount, pSubmits, fence);
}
}
VkResult::ErrorInitializationFailed
}
#[no_mangle]
pub unsafe extern "C" fn vkQueueWaitIdle(queue: VkQueue) -> VkResult {
if queue.is_null() {
return VkResult::ErrorDeviceLost;
}
if let Some(icd) = super::forward::get_icd_if_enabled() {
if let Some(queue_wait_idle) = icd.queue_wait_idle {
return queue_wait_idle(queue);
}
}
VkResult::ErrorInitializationFailed
}
#[no_mangle]
pub unsafe extern "C" fn vkDeviceWaitIdle(device: VkDevice) -> VkResult {
if device.is_null() {
return VkResult::ErrorDeviceLost;
}
if let Some(icd) = super::forward::get_icd_if_enabled() {
if let Some(device_wait_idle) = icd.device_wait_idle {
return device_wait_idle(device);
}
}
VkResult::ErrorInitializationFailed
}