1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
use prelude::*; use std::ptr; use std::mem; use instance::Instance; use device::Device; use vk; use std::ffi::CStr; pub struct Swapchain { handle: vk::Device, swapchain_fn: vk::SwapchainFn, } impl Swapchain { pub fn new(instance: &Instance, device: &Device) -> Result<Swapchain, String> { let swapchain_fn = vk::SwapchainFn::load(|name| { unsafe { mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr())) } })?; Ok(Swapchain { handle: device.handle(), swapchain_fn: swapchain_fn, }) } pub fn name() -> &'static CStr{ CStr::from_bytes_with_nul(b"VK_KHR_swapchain\0").expect("Wrong extension string") } pub unsafe fn destroy_swapchain_khr(&self, swapchain: vk::SwapchainKHR) { self.swapchain_fn.destroy_swapchain_khr(self.handle, swapchain, ptr::null()); } pub unsafe fn acquire_next_image_khr(&self, swapchain: vk::SwapchainKHR, timeout: vk::uint64_t, semaphore: vk::Semaphore, fence: vk::Fence) -> VkResult<vk::uint32_t> { let mut index = mem::uninitialized(); let err_code = self.swapchain_fn .acquire_next_image_khr(self.handle, swapchain, timeout, semaphore, fence, &mut index); match err_code { vk::Result::Success => Ok(index), _ => Err(err_code), } } pub fn create_swapchain_khr(&self, create_info: &vk::SwapchainCreateInfoKHR) -> VkResult<vk::SwapchainKHR> { unsafe { let mut swapchain = mem::uninitialized(); let err_code = self.swapchain_fn .create_swapchain_khr(self.handle, create_info, ptr::null(), &mut swapchain); match err_code { vk::Result::Success => Ok(swapchain), _ => Err(err_code), } } } pub fn get_swapchain_images_khr(&self, swapchain: vk::SwapchainKHR) -> VkResult<Vec<vk::Image>> { unsafe { let mut count = 0; self.swapchain_fn .get_swapchain_images_khr(self.handle, swapchain, &mut count, ptr::null_mut()); let mut v = Vec::with_capacity(count as vk::size_t); let err_code = self.swapchain_fn .get_swapchain_images_khr(self.handle, swapchain, &mut count, v.as_mut_ptr()); v.set_len(count as vk::size_t); match err_code { vk::Result::Success => Ok(v), _ => Err(err_code), } } } }