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