vulkayes_core/queue/
sharing_mode.rs1use ash::vk;
2use thiserror::Error;
3
4use crate::queue::Queue;
5
6#[derive(Debug, Copy, Clone)]
7pub struct SharingMode<A: AsRef<[u32]> = [u32; 1]>(A);
8impl SharingMode<[u32; 1]> {
9 pub const fn one(queue: u32) -> Self {
10 SharingMode([queue])
11 }
12}
13impl<A: AsRef<[u32]>> SharingMode<A> {
14 pub fn new(queues: A) -> Result<Self, SharingModeError> {
15 let ref_queues = queues.as_ref();
16
17 if ref_queues.len() == 0 {
18 return Err(SharingModeError::ZeroQueues)
19 }
20
21 let duplicate = ref_queues.iter().enumerate().any(|(index, first)| {
22 ref_queues
23 .iter()
24 .skip(index + 1)
25 .any(|second| first == second)
26 });
27
28 if duplicate {
29 return Err(SharingModeError::NotUnique)
30 }
31
32 Ok(SharingMode(queues))
33 }
34
35 pub fn sharing_mode(&self) -> vk::SharingMode {
36 debug_assert_ne!(self.0.as_ref().len(), 0);
37
38 if self.0.as_ref().len() == 1 {
39 ash::vk::SharingMode::EXCLUSIVE
40 } else {
41 ash::vk::SharingMode::CONCURRENT
42 }
43 }
44
45 pub fn indices(&self) -> &[u32] {
47 self.0.as_ref()
48 }
49}
50impl<'a> From<&'a super::Queue> for SharingMode<[u32; 1]> {
51 fn from(queue: &'a Queue) -> Self {
52 SharingMode::one(queue.queue_family_index())
53 }
54}
55
56#[derive(Error, Debug)]
57pub enum SharingModeError {
58 #[error("All specified queue families must be unique")]
59 NotUnique,
60
61 #[error("Must specify at least one queue")]
62 ZeroQueues
63}