summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs48
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()
     {