gravitron 0.1.2

A GameEngine based on an ECS and Vulkan
Documentation
use ash::vk;

use crate::queues::QueueFamilies;

pub struct Pools {
  pub command_pool_graphics: vk::CommandPool,
  pub command_pool_transfer: vk::CommandPool,
}

impl Pools {
  pub fn init(
    logical_device: &ash::Device,
    queue_families: &QueueFamilies,
  ) -> Result<Self, vk::Result> {
    let command_pool_create_info = vk::CommandPoolCreateInfo::default()
      .queue_family_index(queue_families.graphics_q_index.unwrap())
      .flags(vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER);
    let command_pool_graphics =
      unsafe { logical_device.create_command_pool(&command_pool_create_info, None) }?;

    let command_pool_create_info = vk::CommandPoolCreateInfo::default()
      .queue_family_index(queue_families.transfer_q_index.unwrap())
      .flags(vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER);
    let command_pool_transfer =
      unsafe { logical_device.create_command_pool(&command_pool_create_info, None) }?;

    Ok(Self {
      command_pool_graphics,
      command_pool_transfer,
    })
  }

  pub unsafe fn cleanup(&self, logical_device: &ash::Device) {
    logical_device.destroy_command_pool(self.command_pool_graphics, None);
    logical_device.destroy_command_pool(self.command_pool_transfer, None);
  }
}

pub fn create_command_buffers(
  logical_device: &ash::Device,
  pools: &Pools,
  amount: usize,
) -> Result<Vec<vk::CommandBuffer>, vk::Result> {
  let command_buffer_allocate_info = vk::CommandBufferAllocateInfo::default()
    .command_pool(pools.command_pool_graphics)
    .command_buffer_count(amount as u32);
  unsafe { logical_device.allocate_command_buffers(&command_buffer_allocate_info) }
}