diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index e864d27..f4e93cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -128,6 +128,8 @@ struct Surreality { // other, and other things of that nature. It's a first-class thing but for // now, we use at most one of it. We also support running without one. swapchain: OnceCell<vk::SwapchainKHR>, + swapchain_images: OnceCell<Vec<vk::Image>>, + swapchain_image_views: OnceCell<Vec<vk::ImageView>>, } impl Surreality { @@ -146,6 +148,8 @@ impl Surreality { graphics_queue: OnceCell::new(), presentation_queue: OnceCell::new(), swapchain: OnceCell::new(), + swapchain_images: OnceCell::new(), + swapchain_image_views: OnceCell::new(), } } @@ -592,9 +596,43 @@ impl Surreality { let swapchain = unsafe { device.create_swapchain_khr(&swapchain_info, None) }?; - println!("swapchain {:?}", swapchain); + + let images = unsafe { + device.get_swapchain_images_khr(swapchain) + }?; + + let mut image_views = Vec::new(); + for image in &images { + let components = vk::ComponentMapping::builder() + .r(vk::ComponentSwizzle::IDENTITY) + .g(vk::ComponentSwizzle::IDENTITY) + .b(vk::ComponentSwizzle::IDENTITY) + .a(vk::ComponentSwizzle::IDENTITY); + + let subresource_range = vk::ImageSubresourceRange::builder() + .aspect_mask(vk::ImageAspectFlags::COLOR) + .base_mip_level(0) + .level_count(1) + .base_array_layer(0) + .layer_count(1); + + let view_info = vk::ImageViewCreateInfo::builder() + .image(*image) + .view_type(vk::ImageViewType::_2D) + .format(format.format) + .components(components) + .subresource_range(subresource_range); + + let view = unsafe { + device.create_image_view(&view_info, None) + }?; + + image_views.push(view); + } self.swapchain.set(swapchain).unwrap(); + self.swapchain_images.set(images).unwrap(); + self.swapchain_image_views.set(image_views).unwrap(); } Ok(()) @@ -874,6 +912,14 @@ impl Surreality { impl Drop for Surreality { #[allow(unsafe_code)] fn drop(&mut self) { + if let Some(image_views) = self.swapchain_image_views.get() + && let Some(device) = self.device.get() + { + for view in image_views { + unsafe { device.destroy_image_view(*view, None) }; + } + } + if let Some(swapchain) = self.swapchain.get() && let Some(device) = self.device.get() { |