diff --git a/crates/renderer/src/lib.rs b/crates/renderer/src/lib.rs index 4400bda..ded82f1 100644 --- a/crates/renderer/src/lib.rs +++ b/crates/renderer/src/lib.rs @@ -41,6 +41,10 @@ pub struct Renderer { swapchain_extent: vk::Extent2D, /// The views into the swapchain images. swapchain_image_views: Vec, + /// The pool used to allocate command buffers. + command_pool: vk::CommandPool, + /// The buffer used to record GPU commands. + command_buffer: vk::CommandBuffer, } impl Renderer { @@ -128,6 +132,22 @@ impl Renderer { // Create image views for the swapchain images let image_views = Self::create_image_views(&device, &swapchain_images, swapchain_format)?; + // Create the command pool + let pool_create_info = vk::CommandPoolCreateInfo::default() + .queue_family_index(graphics_queue_index) + // Allows us to reuse the command buffer every frame by resetting it + .flags(vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER); + + let command_pool = unsafe { device.create_command_pool(&pool_create_info, None)? }; + + // Allocate the main command buffer used for rendering + let alloc_info = vk::CommandBufferAllocateInfo::default() + .command_pool(command_pool) + .level(vk::CommandBufferLevel::PRIMARY) + .command_buffer_count(1); + + let command_buffer = unsafe { device.allocate_command_buffers(&alloc_info)?[0] }; + Ok(Self { _entry: entry, instance, @@ -145,6 +165,8 @@ impl Renderer { swapchain_format, swapchain_extent, swapchain_image_views: image_views, + command_pool, + command_buffer, }) } @@ -355,6 +377,8 @@ impl Renderer { impl Drop for Renderer { fn drop(&mut self) { unsafe { + self.device.destroy_command_pool(self.command_pool, None); + // Destroy the swapchain self.swapchain_loader.destroy_swapchain(self.swapchain, None);