vulkayes_core/queue/
sharing_mode.rs

1use 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	// TODO: Cannot be const because of generic A
46	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}