vkobject_rs/
descprops.rs

1
2use crate::prelude::*;
3use std::{
4	collections::HashMap,
5	sync::Arc,
6};
7
8/// The properties for the descriptor set
9#[derive(Debug)]
10pub enum DescriptorProp {
11	/// The props for the samplers
12	Samplers(Vec<Arc<VulkanSampler>>),
13
14	/// The props for the image
15	Images(Vec<TextureForSample>),
16
17	/// The props for the storage buffer
18	StorageBuffers(Vec<Arc<dyn GenericStorageBuffer>>),
19
20	/// The props for the uniform buffers
21	UniformBuffers(Vec<Arc<dyn GenericUniformBuffer>>),
22
23	/// The props for the storage texel buffer
24	StorageTexelBuffers(Vec<VulkanBufferView>),
25
26	/// The props for the uniform texel buffers
27	UniformTexelBuffers(Vec<VulkanBufferView>),
28}
29
30impl DescriptorProp {
31	/// Get samplers
32	pub fn get_samplers(&self) -> Result<&[Arc<VulkanSampler>], VulkanError> {
33		if let Self::Samplers(samplers) = self {
34			Ok(samplers)
35		} else {
36			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::Samplers`, got {self:?}")))
37		}
38	}
39
40	/// Get images
41	pub fn get_images(&self) -> Result<&[TextureForSample], VulkanError> {
42		if let Self::Images(images) = self {
43			Ok(images)
44		} else {
45			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::Images`, got {self:?}")))
46		}
47	}
48
49	/// Get uniform buffers
50	pub fn get_uniform_buffers(&self) -> Result<&[Arc<dyn GenericUniformBuffer>], VulkanError> {
51		if let Self::UniformBuffers(uniform_buffers) = self {
52			Ok(uniform_buffers)
53		} else {
54			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::UniformBuffers`, got {self:?}")))
55		}
56	}
57
58	/// Get storage buffers
59	pub fn get_storage_buffers(&self) -> Result<&[Arc<dyn GenericStorageBuffer>], VulkanError> {
60		if let Self::StorageBuffers(uniform_buffers) = self {
61			Ok(uniform_buffers)
62		} else {
63			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::StorageBuffers`, got {self:?}")))
64		}
65	}
66
67	/// Get uniform texel buffers
68	pub fn get_uniform_texel_buffers(&self) -> Result<&[VulkanBufferView], VulkanError> {
69		if let Self::UniformTexelBuffers(uniform_buffers) = self {
70			Ok(uniform_buffers)
71		} else {
72			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::UniformTexelBuffers`, got {self:?}")))
73		}
74	}
75
76	/// Get storage texel buffers
77	pub fn get_storage_texel_buffers(&self) -> Result<&[VulkanBufferView], VulkanError> {
78		if let Self::StorageTexelBuffers(uniform_buffers) = self {
79			Ok(uniform_buffers)
80		} else {
81			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::StorageTexelBuffers`, got {self:?}")))
82		}
83	}
84
85	/// Unwrap for samplers
86	pub fn unwrap_samplers(&self) -> &[Arc<VulkanSampler>] {
87		if let Self::Samplers(samplers) = self {
88			samplers
89		} else {
90			panic!("Expected `DescriptorProp::Samplers`, got {self:?}")
91		}
92	}
93
94	/// Unwrap for images
95	pub fn unwrap_images(&self) -> &[TextureForSample] {
96		if let Self::Images(images) = self {
97			images
98		} else {
99			panic!("Expected `DescriptorProp::Images`, got {self:?}")
100		}
101	}
102
103	/// Unwrap for uniform buffers
104	pub fn unwrap_uniform_buffers(&self) -> &[Arc<dyn GenericUniformBuffer>] {
105		if let Self::UniformBuffers(uniform_buffers) = self {
106			uniform_buffers
107		} else {
108			panic!("Expected `DescriptorProp::UniformBuffers`, got {self:?}")
109		}
110	}
111
112	/// Unwrap for storage buffers
113	pub fn unwrap_storage_buffers(&self) -> &[Arc<dyn GenericStorageBuffer>] {
114		if let Self::StorageBuffers(storage_buffers) = self {
115			storage_buffers
116		} else {
117			panic!("Expected `DescriptorProp::StorageBuffers`, got {self:?}")
118		}
119	}
120
121	/// Unwrap for uniform texel buffers
122	pub fn unwrap_uniform_texel_buffers(&self) -> &[VulkanBufferView] {
123		if let Self::UniformTexelBuffers(uniform_texel_buffers) = self {
124			uniform_texel_buffers
125		} else {
126			panic!("Expected `DescriptorProp::UniformTexelBuffers`, got {self:?}")
127		}
128	}
129
130	/// Unwrap for storage texel buffers
131	pub fn unwrap_storage_texel_buffers(&self) -> &[VulkanBufferView] {
132		if let Self::StorageTexelBuffers(storage_texel_buffers) = self {
133			storage_texel_buffers
134		} else {
135			panic!("Expected `DescriptorProp::StorageTexelBuffers`, got {self:?}")
136		}
137	}
138
139	/// Check if it is samplers
140	pub fn is_samplers(&self) -> bool {
141		matches!(self, Self::Samplers(_))
142	}
143
144	/// Check if it is images
145	pub fn is_images(&self) -> bool {
146		matches!(self, Self::Images(_))
147	}
148
149	/// Check if it is uniform buffers
150	pub fn is_uniform_buffers(&self) -> bool {
151		matches!(self, Self::UniformBuffers(_))
152	}
153
154	/// Check if it is storage buffers
155	pub fn is_storage_buffers(&self) -> bool {
156		matches!(self, Self::StorageBuffers(_))
157	}
158
159	/// Check if it is uniform texel buffers
160	pub fn is_uniform_texel_buffers(&self) -> bool {
161		matches!(self, Self::UniformTexelBuffers(_))
162	}
163
164	/// Check if it is storage texel buffers
165	pub fn is_storage_texel_buffers(&self) -> bool {
166		matches!(self, Self::StorageTexelBuffers(_))
167	}
168}
169
170/// The descriptor set properties
171#[derive(Default, Debug, Clone)]
172pub struct DescriptorProps {
173	/// The descriptor sets
174	pub sets: HashMap<u32 /* set */, HashMap<u32 /* binding */, Arc<DescriptorProp>>>,
175}
176
177impl DescriptorProps {
178	/// Create a new `DescriptorProps`
179	pub fn new(sets: HashMap<u32, HashMap<u32, Arc<DescriptorProp>>>) -> Self {
180		Self {
181			sets,
182		}
183	}
184
185	/// Insert a prop
186	pub fn insert(&mut self, set: u32, binding: u32, prop: Arc<DescriptorProp>) -> Option<Arc<DescriptorProp>> {
187		if let Some(bindings) = self.sets.get_mut(&set) {
188			bindings.insert(binding, prop)
189		} else {
190			self.sets.insert(set, HashMap::new());
191			self.sets.get_mut(&set).unwrap().insert(binding, prop)
192		}
193	}
194
195	/// Get from the set
196	pub fn get(&self, set: u32, binding: u32) -> Option<&Arc<DescriptorProp>> {
197		if let Some(bindings) = self.sets.get(&set) {
198			bindings.get(&binding)
199		} else {
200			None
201		}
202	}
203
204	/// Get specific number of samplers from a `HashMap<String, DescriptorProp>`
205	pub fn get_desc_props_samplers(&self, set: u32, binding: u32, desired_count: usize) -> Result<&[Arc<VulkanSampler>], VulkanError> {
206		let samplers = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?.get_samplers()?;
207		if samplers.len() != desired_count {
208			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} sampler(s) is needed for `layout(set = {set}, binding = {binding})`, but {} sampler(s) were provided.", samplers.len())));
209		}
210		Ok(samplers)
211	}
212
213	/// Get specific number of textures from a `HashMap<String, DescriptorProp>`
214	pub fn get_desc_props_textures(&self, set: u32, binding: u32, desired_count: usize) -> Result<&[TextureForSample], VulkanError> {
215		let textures = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?.get_images()?;
216		if textures.len() != desired_count {
217			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} texture(s) is needed for `layout(set = {set}, binding = {binding})`, but {} texture(s) were provided.", textures.len())));
218		}
219		Ok(textures)
220	}
221
222	/// Get specific number of uniform buffers from a `HashMap<String, DescriptorProp>`
223	pub fn get_desc_props_uniform_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<&[Arc<dyn GenericUniformBuffer>], VulkanError> {
224		let uniform_buffers = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?.get_uniform_buffers()?;
225		if uniform_buffers.len() != desired_count {
226			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} uniform buffer(s) is needed for `layout(set = {set}, binding = {binding})`, but {} uniform buffer(s) were provided.", uniform_buffers.len())));
227		}
228		Ok(uniform_buffers)
229	}
230
231	/// Get specific number of uniform buffers from a `HashMap<String, DescriptorProp>`
232	pub fn get_desc_props_storage_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<&[Arc<dyn GenericStorageBuffer>], VulkanError> {
233		let storage_buffers = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?.get_storage_buffers()?;
234		if storage_buffers.len() != desired_count {
235			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} storage buffer(s) is needed for `layout(set = {set}, binding = {binding})`, but {} storage buffer(s) were provided.", storage_buffers.len())));
236		}
237		Ok(storage_buffers)
238	}
239
240	/// Get specific number of uniform texel buffers from a `HashMap<String, DescriptorProp>`
241	pub fn get_desc_props_uniform_texel_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<&[VulkanBufferView], VulkanError> {
242		let uniform_texel_buffers = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?.get_uniform_texel_buffers()?;
243		if uniform_texel_buffers.len() != desired_count {
244			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} uniform buffer(s) is needed for `layout(set = {set}, binding = {binding})`, but {} uniform buffer(s) were provided.", uniform_texel_buffers.len())));
245		}
246		Ok(uniform_texel_buffers)
247	}
248
249	/// Get specific number of uniform texel buffers from a `HashMap<String, DescriptorProp>`
250	pub fn get_desc_props_storage_texel_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<&[VulkanBufferView], VulkanError> {
251		let storage_texel_buffers = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?.get_storage_texel_buffers()?;
252		if storage_texel_buffers.len() != desired_count {
253			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} storage buffer(s) is needed for `layout(set = {set}, binding = {binding})`, but {} storage buffer(s) were provided.", storage_texel_buffers.len())));
254		}
255		Ok(storage_texel_buffers)
256	}
257}