summary refs log tree commit diff
path: root/src/graphics_window_dressing.rs
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-08-06 14:26:15 -0700
committerIrene Knapp <ireneista@irenes.space>2026-08-06 14:56:40 -0700
commit5b5f7bb4b3cac1fa96b2325e7c3d0784ade28ebf (patch)
treedf536be69c964533bf19c75119a8e406f9daad31 /src/graphics_window_dressing.rs
parent562693fe2d0afbe9c828fa1acb4473db9752eeed (diff)
factor out the render commands into a new scene module
use push constants

this concludes the tutorial; there's now a bit of fairly obvious refactoring to do to group objects in a way that reflects when they're needed, which can be followed by building a real scene graph

Change-Id: Id3b76d00d08ae915270095bd606e41767b7ec177
Force-Push: yes
Diffstat (limited to 'src/graphics_window_dressing.rs')
-rw-r--r--src/graphics_window_dressing.rs135
1 files changed, 34 insertions, 101 deletions
diff --git a/src/graphics_window_dressing.rs b/src/graphics_window_dressing.rs
index 3c9291c..51483cf 100644
--- a/src/graphics_window_dressing.rs
+++ b/src/graphics_window_dressing.rs
@@ -5,10 +5,11 @@ use crate::graphics_permanent::{
   EnableAnisotropy
 };
 use crate::model_loader::load_model;
-use crate::shader_data::{ Vertex, UniformBlock };
+use crate::shader_data::{ Vertex, UniformBlock, VertexPushBlock };
 
 use std::collections::BTreeSet;
 use std::io::Cursor;
+use std::mem::size_of;
 use std::ptr::copy_nonoverlapping;
 
 use png::Decoder;
@@ -41,22 +42,22 @@ pub struct WindowDressing {
   depth_image_view: vk::ImageView,
   depth_format: vk::Format,
 
-  render_pass: vk::RenderPass,
+  pub render_pass: vk::RenderPass,
 
-  pipeline: vk::Pipeline,
-  pipeline_layout: vk::PipelineLayout,
+  pub pipeline: vk::Pipeline,
+  pub pipeline_layout: vk::PipelineLayout,
 
-  framebuffers: Vec<vk::Framebuffer>,
+  pub framebuffers: Vec<vk::Framebuffer>,
 
   primary_command_pool: vk::CommandPool,
   transient_command_pool: vk::CommandPool,
 
-  vertex_buffer: vk::Buffer,
+  pub vertex_buffer: vk::Buffer,
   vertex_buffer_memory: vk::DeviceMemory,
 
-  index_buffer: vk::Buffer,
+  pub index_buffer: vk::Buffer,
   index_buffer_memory: vk::DeviceMemory,
-  index_count: usize,
+  pub index_count: usize,
 
   texture_image: vk::Image,
   texture_image_memory: vk::DeviceMemory,
@@ -68,7 +69,7 @@ pub struct WindowDressing {
   pub uniform_buffer_memory: Vec<vk::DeviceMemory>,
 
   descriptor_pool: vk::DescriptorPool,
-  descriptor_sets: Vec<vk::DescriptorSet>,
+  pub descriptor_sets: Vec<vk::DescriptorSet>,
 
   pub command_buffers: Vec<vk::CommandBuffer>,
 
@@ -179,7 +180,7 @@ impl WindowDressing {
                                    swapchain.images.len(),
                                    &texture_image_view, &sampler)?;
 
-    let command_buffers = init_commands(
+    let command_buffers = init_command_buffers(
             device, &swapchain.extent, &framebuffers, &render_pass,
             &pipeline_layout, &pipeline, &vertex_buffer, &index_buffer,
             index_count, &descriptor_sets, &primary_command_pool)?;
@@ -276,7 +277,7 @@ impl WindowDressing {
                                    &self.texture_image_view, &self.sampler)?;
 
     // Notice that we reused the command pool.
-    let command_buffers = init_commands(
+    let command_buffers = init_command_buffers(
             device, &swapchain.extent, &framebuffers, &render_pass,
             &pipeline_layout, &pipeline, &self.vertex_buffer,
             &self.index_buffer, self.index_count, &descriptor_sets,
@@ -696,9 +697,16 @@ fn init_pipeline(device: &Device,
           .attachments(&blend_attachments)
           .blend_constants([0.0, 0.0, 0.0, 0.0]);
 
+  let vertex_push_constant_range = vk::PushConstantRange::builder()
+          .stage_flags(vk::ShaderStageFlags::VERTEX)
+          .offset(0)
+          .size(size_of::<VertexPushBlock<f32>>() as u32);
+
   let layouts = [*descriptor_set_layout];
+  let push_constant_ranges = [vertex_push_constant_range];
   let pipeline_layout_info = vk::PipelineLayoutCreateInfo::builder()
-                                 .set_layouts(&layouts);
+                                 .set_layouts(&layouts)
+                                 .push_constant_ranges(&push_constant_ranges);
 
   let pipeline_layout = unsafe {
     device.create_pipeline_layout(&pipeline_layout_info, None)
@@ -1014,8 +1022,9 @@ fn init_command_pools(device: &Device, indices: &QueueFamilyIndices)
     -> Result<(vk::CommandPool, vk::CommandPool)>
 {
   let command_pool_info = vk::CommandPoolCreateInfo::builder()
-                              .flags(vk::CommandPoolCreateFlags::empty())
-                              .queue_family_index(indices.graphics);
+          .flags(vk::CommandPoolCreateFlags::TRANSIENT
+                 | vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER)
+          .queue_family_index(indices.graphics);
 
   let primary = unsafe {
     device.create_command_pool(&command_pool_info, None)
@@ -1031,17 +1040,17 @@ fn init_command_pools(device: &Device, indices: &QueueFamilyIndices)
 
 
 #[allow(unsafe_code)]
-fn init_commands(device: &Device,
-                 extent: &vk::Extent2D,
-                 framebuffers: &Vec<vk::Framebuffer>,
-                 render_pass: &vk::RenderPass,
-                 pipeline_layout: &vk::PipelineLayout,
-                 pipeline: &vk::Pipeline,
-                 vertex_buffer: &vk::Buffer,
-                 index_buffer: &vk::Buffer,
-                 index_count: usize,
-                 descriptor_sets: &Vec<vk::DescriptorSet>,
-                 command_pool: &vk::CommandPool)
+fn init_command_buffers(device: &Device,
+                        extent: &vk::Extent2D,
+                        framebuffers: &Vec<vk::Framebuffer>,
+                        render_pass: &vk::RenderPass,
+                        pipeline_layout: &vk::PipelineLayout,
+                        pipeline: &vk::Pipeline,
+                        vertex_buffer: &vk::Buffer,
+                        index_buffer: &vk::Buffer,
+                        index_count: usize,
+                        descriptor_sets: &Vec<vk::DescriptorSet>,
+                        command_pool: &vk::CommandPool)
     -> Result<Vec<vk::CommandBuffer>>
 {
   let command_buffer_allocation_info
@@ -1053,82 +1062,6 @@ fn init_commands(device: &Device,
     device.allocate_command_buffers(&command_buffer_allocation_info)
   }?;
 
-  for (index, framebuffer) in framebuffers.iter().enumerate() {
-    let command_buffer = command_buffers[index];
-
-    let inheritance_info = vk::CommandBufferInheritanceInfo::builder();
-
-    let command_buffer_begin_info = vk::CommandBufferBeginInfo::builder()
-            .flags(vk::CommandBufferUsageFlags::empty())
-            .inheritance_info(&inheritance_info);
-
-    unsafe {
-      device.begin_command_buffer(command_buffer, &command_buffer_begin_info)
-    }?;
-
-    let render_area = vk::Rect2D::builder()
-            .offset(vk::Offset2D::default())
-            .extent(*extent);
-
-    let color_clear_value = vk::ClearValue {
-      color: vk::ClearColorValue {
-        float32: [0.0, 0.0, 0.0, 1.0]
-      }
-    };
-    let depth_clear_value = vk::ClearValue {
-      depth_stencil: vk::ClearDepthStencilValue {
-        depth: 1.0,
-        stencil: 0,
-      }
-    };
-    let clear_values = [color_clear_value, depth_clear_value];
-
-    let begin_pass_info = vk::RenderPassBeginInfo::builder()
-            .render_pass(*render_pass)
-            .framebuffer(*framebuffer)
-            .render_area(render_area)
-            .clear_values(&clear_values);
-
-    unsafe {
-      device.cmd_begin_render_pass(command_buffer, &begin_pass_info,
-                                   vk::SubpassContents::INLINE)
-    };
-
-    unsafe {
-      device.cmd_bind_pipeline(command_buffer,
-                               vk::PipelineBindPoint::GRAPHICS,
-                               *pipeline)
-    };
-
-    unsafe {
-      device.cmd_bind_vertex_buffers(command_buffer, 0,
-                                     &[*vertex_buffer], &[0])
-    };
-
-    unsafe {
-      device.cmd_bind_index_buffer(command_buffer, *index_buffer, 0,
-                                   vk::IndexType::UINT32)
-    };
-
-    unsafe {
-      device.cmd_bind_descriptor_sets(command_buffer,
-                                      vk::PipelineBindPoint::GRAPHICS,
-                                      *pipeline_layout,
-                                      0,
-                                      &[descriptor_sets[index]],
-                                      &[])
-    };
-
-    unsafe {
-      device.cmd_draw_indexed(command_buffer, index_count as u32,
-                              1, 0, 0, 0)
-    };
-
-    unsafe { device.cmd_end_render_pass(command_buffer) };
-
-    unsafe { device.end_command_buffer(command_buffer) }?;
-  }
-
   Ok(command_buffers)
 }