summary refs log tree commit diff
path: root/src/graphics/render.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/render.rs')
-rw-r--r--src/graphics/render.rs180
1 files changed, 16 insertions, 164 deletions
diff --git a/src/graphics/render.rs b/src/graphics/render.rs
index c88b1d6..00e55ee 100644
--- a/src/graphics/render.rs
+++ b/src/graphics/render.rs
@@ -1,8 +1,10 @@
 #![deny(unsafe_code)]
 use crate::error::*;
 use crate::assets::asset;
-use crate::graphics::{ Permanent, ForReinit, WindowDressing, Model, Texture };
-use crate::shader_data::{ Vertex, UniformBlock, VertexPushBlock };
+use crate::graphics::{
+  Permanent, ForReinit, WindowDressing, Frame, Model, Texture
+};
+use crate::shader_data::{ Vertex, VertexPushBlock };
 
 use std::mem::size_of;
 
@@ -22,9 +24,7 @@ pub struct Render {
 
   pub model: Option<Model>,
 
-  pub framebuffers: Vec<vk::Framebuffer>,
-  pub command_buffers: Vec<vk::CommandBuffer>,
-  pub descriptor_sets: Vec<vk::DescriptorSet>,
+  pub per_frame: Vec<Frame>,
 }
 
 
@@ -34,16 +34,10 @@ impl Render {
       -> Result<Self>
   {
     let device = &permanent.device;
-    let primary_command_pool = &permanent.primary_command_pool;
     let sample_count = for_reinit.sample_count;
     let descriptor_set_layout = &for_reinit.descriptor_set_layout;
     let swapchain = &window_dressing.swapchain;
     let depth_format = &window_dressing.depth_format;
-    let color_image_view = &window_dressing.color_image_view;
-    let depth_image_view = &window_dressing.depth_image_view;
-    let uniform_buffers = &window_dressing.uniform_buffers;
-    let descriptor_pool = &window_dressing.descriptor_pool;
-    let sampler = &window_dressing.sampler;
 
     let render_pass = init_render_pass(device, sample_count,
                                        &swapchain.format, &depth_format)?;
@@ -52,18 +46,8 @@ impl Render {
             = init_pipeline(device, descriptor_set_layout, &swapchain.extent,
                             sample_count, &render_pass)?;
 
-    let framebuffers = init_framebuffers(
-            device, &swapchain.extent, &swapchain.image_views,
-            &color_image_view, &depth_image_view, &render_pass)?;
-
-    let command_buffers = init_command_buffers(device, &framebuffers,
-                                               primary_command_pool)?;
-
-    let descriptor_sets
-            = init_descriptor_sets(device, descriptor_set_layout,
-                                   &uniform_buffers, &descriptor_pool,
-                                   swapchain.images.len(),
-                                   &texture.image_view, &sampler)?;
+    let per_frame = Frame::new(permanent, for_reinit, window_dressing,
+                               texture, &render_pass)?;
 
     let model = None;
 
@@ -72,9 +56,7 @@ impl Render {
       pipeline,
       pipeline_layout,
       model,
-      framebuffers,
-      command_buffers,
-      descriptor_sets,
+      per_frame,
     })
   }
 
@@ -88,16 +70,10 @@ impl Render {
     self.destroy_replaceable(permanent);
 
     let device = &permanent.device;
-    let primary_command_pool = &permanent.primary_command_pool;
     let sample_count = for_reinit.sample_count;
     let descriptor_set_layout = &for_reinit.descriptor_set_layout;
     let swapchain = &window_dressing.swapchain;
     let depth_format = &window_dressing.depth_format;
-    let color_image_view = &window_dressing.color_image_view;
-    let depth_image_view = &window_dressing.depth_image_view;
-    let uniform_buffers = &window_dressing.uniform_buffers;
-    let descriptor_pool = &window_dressing.descriptor_pool;
-    let sampler = &window_dressing.sampler;
 
     let render_pass = init_render_pass(device, sample_count,
                                        &swapchain.format, &depth_format)?;
@@ -106,26 +82,12 @@ impl Render {
             = init_pipeline(device, descriptor_set_layout, &swapchain.extent,
                             sample_count, &render_pass)?;
 
-    let framebuffers = init_framebuffers(
-            device, &swapchain.extent, &swapchain.image_views,
-            &color_image_view, &depth_image_view, &render_pass)?;
-
-    // Notice that we reused the command pool.
-    let command_buffers = init_command_buffers(device, &framebuffers,
-                                               primary_command_pool)?;
-
-    let descriptor_sets
-            = init_descriptor_sets(device, descriptor_set_layout,
-                                   &uniform_buffers, &descriptor_pool,
-                                   swapchain.images.len(),
-                                   &texture.image_view, sampler)?;
+    Frame::reinit(&mut self.per_frame, permanent, for_reinit, window_dressing,
+                  texture, &render_pass)?;
 
     self.render_pass = render_pass;
     self.pipeline = pipeline;
     self.pipeline_layout = pipeline_layout;
-    self.framebuffers = framebuffers;
-    self.command_buffers = command_buffers;
-    self.descriptor_sets = descriptor_sets;
 
     Ok(())
   }
@@ -145,8 +107,11 @@ impl Render {
   fn destroy_replaceable(&mut self, permanent: &Permanent) {
     let device = &permanent.device;
 
-    for framebuffer in &self.framebuffers {
-      unsafe { device.destroy_framebuffer(*framebuffer, None) };
+    let mut command_buffers = Vec::new();
+    for frame in &self.per_frame {
+      unsafe { device.destroy_framebuffer(frame.framebuffer, None) };
+
+      command_buffers.push(frame.command_buffer);
     }
 
     //   Notice that we free the buffers in the pool, but do not destroy the
@@ -156,7 +121,7 @@ impl Render {
     // immediately after using them.
     unsafe {
       device.free_command_buffers(permanent.primary_command_pool,
-                                  &self.command_buffers)
+                                  &command_buffers)
     };
 
     unsafe { device.destroy_pipeline(self.pipeline, None) };
@@ -392,116 +357,3 @@ fn init_pipeline(device: &Device,
   Ok((pipeline_layout, pipeline))
 }
 
-
-#[allow(unsafe_code)]
-fn init_framebuffers(device: &Device, extent: &vk::Extent2D,
-                     swapchain_image_views: &Vec<vk::ImageView>,
-                     color_image_view: &vk::ImageView,
-                     depth_image_view: &vk::ImageView,
-                     render_pass: &vk::RenderPass)
-    -> Result<Vec<vk::Framebuffer>>
-{
-  let mut framebuffers = Vec::new();
-
-  for color_resolve_image_view in swapchain_image_views {
-    let attachments = [*color_image_view,
-                       *depth_image_view,
-                       *color_resolve_image_view];
-
-    let framebuffer_info = vk::FramebufferCreateInfo::builder()
-            .render_pass(*render_pass)
-            .attachments(&attachments)
-            .width(extent.width)
-            .height(extent.height)
-            .layers(1);
-
-    let framebuffer = unsafe {
-      device.create_framebuffer(&framebuffer_info, None)
-    }?;
-
-    framebuffers.push(framebuffer);
-  }
-
-  Ok(framebuffers)
-}
-
-
-#[allow(unsafe_code)]
-fn init_command_buffers(device: &Device,
-                        framebuffers: &Vec<vk::Framebuffer>,
-                        command_pool: &vk::CommandPool)
-    -> Result<Vec<vk::CommandBuffer>>
-{
-  let command_buffer_allocation_info
-          = vk::CommandBufferAllocateInfo::builder()
-                .command_pool(*command_pool)
-                .level(vk::CommandBufferLevel::PRIMARY)
-                .command_buffer_count(framebuffers.len() as u32);
-  let command_buffers = unsafe {
-    device.allocate_command_buffers(&command_buffer_allocation_info)
-  }?;
-
-  Ok(command_buffers)
-}
-
-
-#[allow(unsafe_code)]
-fn init_descriptor_sets(device: &Device, layout: &vk::DescriptorSetLayout,
-                        buffers: &Vec<vk::Buffer>, pool: &vk::DescriptorPool,
-                        count: usize, texture_image_view: &vk::ImageView,
-                        sampler: &vk::Sampler)
-    -> Result<Vec<vk::DescriptorSet>>
-{
-  let layouts = vec![*layout; count];
-  let set_info = vk::DescriptorSetAllocateInfo::builder()
-          .descriptor_pool(*pool)
-          .set_layouts(&layouts);
-  let sets = unsafe { device.allocate_descriptor_sets(&set_info) }?;
-
-  for index in 0 .. count {
-    let buffer_info = vk::DescriptorBufferInfo::builder()
-            .buffer(buffers[index])
-            .offset(0)
-            .range(size_of::<UniformBlock<f32>>() as vk::DeviceSize);
-
-    let buffer_info_list = [buffer_info];
-    let uniform_block_write_info = vk::WriteDescriptorSet::builder()
-            .dst_set(sets[index])
-            .dst_binding(0)
-            .dst_array_element(0)
-            .descriptor_type(vk::DescriptorType::UNIFORM_BUFFER)
-            .buffer_info(&buffer_info_list);
-
-    let sampler_image_info = vk::DescriptorImageInfo::builder()
-            .sampler(*sampler);
-    let sampler_image_info_list = [sampler_image_info];
-    let sampler_write_info = vk::WriteDescriptorSet::builder()
-            .dst_set(sets[index])
-            .dst_binding(1)
-            .dst_array_element(0)
-            .descriptor_type(vk::DescriptorType::SAMPLER)
-            .image_info(&sampler_image_info_list);
-
-    let texture_image_info = vk::DescriptorImageInfo::builder()
-            .image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL)
-            .image_view(*texture_image_view);
-    let texture_image_info_list = [texture_image_info];
-    let texture_write_info = vk::WriteDescriptorSet::builder()
-            .dst_set(sets[index])
-            .dst_binding(2)
-            .dst_array_element(0)
-            .descriptor_type(vk::DescriptorType::SAMPLED_IMAGE)
-            .image_info(&texture_image_info_list);
-
-    let write_info_list = [
-            uniform_block_write_info, sampler_write_info, texture_write_info
-    ];
-    let copy_info_list: [vk::CopyDescriptorSet; 0] = [];
-
-    unsafe {
-      device.update_descriptor_sets(&write_info_list, &copy_info_list)
-    };
-  }
-
-  Ok(sets)
-}