#![cfg(feature = "vkfft")]
use crate::{Device, GpuError};
use ash::vk::Handle;
#[derive(Debug, Clone, Copy)]
pub struct RawVulkanHandles {
pub physical_device: u64,
pub device: u64,
pub queue: u64,
pub queue_family_index: u32,
pub instance: u64,
}
impl Device {
pub fn raw_vulkan(&self) -> Result<RawVulkanHandles, GpuError> {
use wgpu::hal::api::Vulkan;
let phys_dev: u64;
let instance: u64;
unsafe {
let hal_adapter = self
.adapter
.as_hal::<Vulkan>()
.ok_or(GpuError::VulkanHandlesUnavailable)?;
phys_dev = hal_adapter.raw_physical_device().as_raw();
let hal_instance = self
.instance
.as_hal::<Vulkan>()
.ok_or(GpuError::VulkanHandlesUnavailable)?;
instance = hal_instance.shared_instance().raw_instance().handle().as_raw();
}
let (device, queue, queue_family_index) = unsafe {
let hal_device = self
.device
.as_hal::<Vulkan>()
.ok_or(GpuError::VulkanHandlesUnavailable)?;
let d = hal_device.raw_device().handle().as_raw();
let q = hal_device.raw_queue().as_raw();
let qf = hal_device.queue_family_index();
(d, q, qf)
};
Ok(RawVulkanHandles {
physical_device: phys_dev,
device,
queue,
queue_family_index,
instance,
})
}
}