summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-08-06 16:43:02 -0700
committerIrene Knapp <ireneista@irenes.space>2026-08-06 16:43:02 -0700
commit2c8110d93e04a1bfd976fe20c8c7493a41d51eae (patch)
treeac7b4271e07e58bdc61e009a06f56164186c08aa /src/main.rs
parent5b5f7bb4b3cac1fa96b2325e7c3d0784ade28ebf (diff)
state needed when rendering is now in its own struct
subdividing the lifetimes of all our various objects may feel questionable in general, but this particular division is a very natural one

Force-Push: yes
Change-Id: I499a32875a4d75965944af720e7bfd6ec5965c15
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs36
1 files changed, 21 insertions, 15 deletions
diff --git a/src/main.rs b/src/main.rs
index 8a42147..10b203a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,7 +4,7 @@ use crate::graphics_permanent::{
   PermanentGraphicsState, GraphicsStateForReinit
 };
 use crate::graphics_window_dressing::{
-  WindowDressing, N_SIMULTANEOUS_FRAMES
+  WindowDressing, RenderState, N_SIMULTANEOUS_FRAMES
 };
 use crate::linear_algebra::{ Vec3, Mat4, Transformation };
 use crate::shader_data::UniformBlock;
@@ -34,6 +34,7 @@ struct Surreality {
   permanent: RefCell<Option<PermanentGraphicsState>>,
   for_reinit: RefCell<Option<GraphicsStateForReinit>>,
   window_dressing: RefCell<Option<WindowDressing>>,
+  render_state: RefCell<Option<RenderState>>,
   is_minimized: bool,
   is_reinit_queued: bool,
   frame_index: usize,
@@ -50,6 +51,7 @@ impl Surreality {
       permanent: RefCell::new(None),
       for_reinit: RefCell::new(None),
       window_dressing: RefCell::new(None),
+      render_state: RefCell::new(None),
       is_minimized: false,
       is_reinit_queued: false,
       frame_index: 0,
@@ -66,9 +68,13 @@ impl Surreality {
         = PermanentGraphicsState::new(event_loop)?;
 
     if enable_swapchain.0 {
-      *self.window_dressing.get_mut()
-          = Some(WindowDressing::new(&permanent, &for_reinit,
-                                     enable_anisotropy)?);
+      let window_dressing = WindowDressing::new(&permanent, &for_reinit,
+                                                enable_anisotropy)?;
+      let render_state = RenderState::new(&permanent, &for_reinit,
+                                          &window_dressing)?;
+
+      *self.window_dressing.get_mut() = Some(window_dressing);
+      *self.render_state.get_mut() = Some(render_state);
     }
 
     *self.permanent.get_mut() = Some(permanent);
@@ -82,8 +88,10 @@ impl Surreality {
        && let Some(for_reinit) = self.for_reinit.borrow().as_ref()
        && let Some(window_dressing)
               = self.window_dressing.borrow_mut().as_mut()
+       && let Some(render_state) = self.render_state.borrow_mut().as_mut()
     {
       window_dressing.reinit(permanent, for_reinit)?;
+      render_state.reinit(permanent, for_reinit, &window_dressing)?;
     }
 
     Ok(())
@@ -109,6 +117,7 @@ impl Surreality {
     if let Some(permanent) = self.permanent.borrow().as_ref()
        && let Some(window_dressing)
               = self.window_dressing.borrow_mut().as_mut()
+       && let Some(render_state) = self.render_state.borrow_mut().as_mut()
        && window_id == permanent.window.id()
     {
       let device = &permanent.device;
@@ -141,16 +150,9 @@ impl Surreality {
 
       let time = self.simulation_start.elapsed().as_secs_f32();
 
-      let command_buffer = window_dressing.command_buffers[image_index];
-      let framebuffer = window_dressing.framebuffers[image_index];
-      let descriptor_set = window_dressing.descriptor_sets[image_index];
-
-      crate::graphics_scene::generate_scene_commands(
-          &command_buffer, time, device, &window_dressing.swapchain.extent,
-          &framebuffer, &window_dressing.render_pass,
-          &window_dressing.pipeline_layout, &window_dressing.pipeline,
-          &window_dressing.vertex_buffer, &window_dressing.index_buffer,
-          window_dressing.index_count, &descriptor_set)?;
+      let command_buffer = crate::graphics_scene::generate_scene_commands(
+              image_index, time, &render_state, device,
+              &window_dressing.swapchain.extent)?;
 
       render_uniforms(time, device,
                       &window_dressing.uniform_buffer_memory[image_index],
@@ -160,7 +162,7 @@ impl Surreality {
       let second_semaphores = [*rendering_finished_semaphore];
 
       let wait_stages = [vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT];
-      let command_buffers = [command_buffer];
+      let command_buffers = [*command_buffer];
       let submit_info = vk::SubmitInfo::builder()
                             .wait_semaphores(&first_semaphores)
                             .wait_dst_stage_mask(&wait_stages)
@@ -213,6 +215,10 @@ impl Drop for Surreality {
       unsafe { permanent.device.device_wait_idle() }.unwrap();
 
       if let Some(window_dressing) = self.window_dressing.replace(None) {
+        if let Some(render_state) = self.render_state.replace(None) {
+          render_state.destroy(&permanent.device, &window_dressing);
+        }
+
         window_dressing.destroy(&permanent.device);
       }