diff options
| author | Irene Knapp <ireneista@irenes.space> | 2026-08-06 14:26:15 -0700 |
|---|---|---|
| committer | Irene Knapp <ireneista@irenes.space> | 2026-08-06 14:56:40 -0700 |
| commit | 5b5f7bb4b3cac1fa96b2325e7c3d0784ade28ebf (patch) | |
| tree | df536be69c964533bf19c75119a8e406f9daad31 /src/graphics_window_dressing.rs | |
| parent | 562693fe2d0afbe9c828fa1acb4473db9752eeed (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.rs | 135 |
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) } |