1 use crate::{command::CommandBuffer, conv, Backend, RawDevice}; 2 use hal::{command, pool}; 3 4 use ash::{version::DeviceV1_0, vk}; 5 use inplace_it::inplace_or_alloc_from_iter; 6 7 use std::sync::Arc; 8 9 #[derive(Debug)] 10 pub struct RawCommandPool { 11 pub(crate) raw: vk::CommandPool, 12 pub(crate) device: Arc<RawDevice>, 13 } 14 15 impl pool::CommandPool<Backend> for RawCommandPool { reset(&mut self, release_resources: bool)16 unsafe fn reset(&mut self, release_resources: bool) { 17 let flags = if release_resources { 18 vk::CommandPoolResetFlags::RELEASE_RESOURCES 19 } else { 20 vk::CommandPoolResetFlags::empty() 21 }; 22 23 assert_eq!(Ok(()), self.device.raw.reset_command_pool(self.raw, flags)); 24 } 25 allocate<E>(&mut self, num: usize, level: command::Level, list: &mut E) where E: Extend<CommandBuffer>,26 unsafe fn allocate<E>(&mut self, num: usize, level: command::Level, list: &mut E) 27 where 28 E: Extend<CommandBuffer>, 29 { 30 let info = vk::CommandBufferAllocateInfo::builder() 31 .command_pool(self.raw) 32 .level(conv::map_command_buffer_level(level)) 33 .command_buffer_count(num as u32); 34 35 let device = &self.device; 36 37 list.extend( 38 device 39 .raw 40 .allocate_command_buffers(&info) 41 .expect("Error on command buffer allocation") 42 .into_iter() 43 .map(|buffer| CommandBuffer { 44 raw: buffer, 45 device: Arc::clone(device), 46 }), 47 ); 48 } 49 free<I>(&mut self, command_buffers: I) where I: Iterator<Item = CommandBuffer>,50 unsafe fn free<I>(&mut self, command_buffers: I) 51 where 52 I: Iterator<Item = CommandBuffer>, 53 { 54 let cbufs_iter = command_buffers.map(|buffer| buffer.raw); 55 inplace_or_alloc_from_iter(cbufs_iter, |cbufs| { 56 if !cbufs.is_empty() { 57 self.device.raw.free_command_buffers(self.raw, cbufs); 58 } 59 }) 60 } 61 } 62