vkobject_rs/
descprops.rs

1
2use crate::prelude::*;
3use std::{
4	collections::HashMap,
5	sync::{Arc, RwLock},
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<Arc<VulkanBufferView>>),
25
26	/// The props for the uniform texel buffers
27	UniformTexelBuffers(Vec<Arc<VulkanBufferView>>),
28}
29
30impl DescriptorProp {
31	/// Create as a sampler
32	pub fn new_sampler(sampler: Arc<VulkanSampler>) -> Self {
33		Self::Samplers(vec![sampler])
34	}
35
36	/// Create as samplers
37	pub fn new_samplers(samplers: Vec<Arc<VulkanSampler>>) -> Self {
38		Self::Samplers(samplers)
39	}
40
41	/// Create as a texture
42	pub fn new_texture(texture: TextureForSample) -> Self {
43		Self::Images(vec![texture])
44	}
45
46	/// Create as textures
47	pub fn new_textures(textures: Vec<TextureForSample>) -> Self {
48		Self::Images(textures)
49	}
50
51	/// Create as a storage buffer
52	pub fn new_storage_buffer(storage_buffer: Arc<dyn GenericStorageBuffer>) -> Self {
53		Self::StorageBuffers(vec![storage_buffer])
54	}
55
56	/// Create as storage buffers
57	pub fn new_storage_buffers(storage_buffers: Vec<Arc<dyn GenericStorageBuffer>>) -> Self {
58		Self::StorageBuffers(storage_buffers)
59	}
60
61	/// Create as a uniform buffer
62	pub fn new_uniform_buffer(uniform_buffer: Arc<dyn GenericUniformBuffer>) -> Self {
63		Self::UniformBuffers(vec![uniform_buffer])
64	}
65
66	/// Create as uniform buffers
67	pub fn new_uniform_buffers(uniform_buffers: Vec<Arc<dyn GenericUniformBuffer>>) -> Self {
68		Self::UniformBuffers(uniform_buffers)
69	}
70
71	/// Create as a storage texel buffer
72	pub fn new_storage_texel_buffer(storage_texel_buffer: Arc<VulkanBufferView>) -> Self {
73		Self::StorageTexelBuffers(vec![storage_texel_buffer])
74	}
75
76	/// Create as storage texel buffers
77	pub fn new_storage_texel_buffers(storage_texel_buffers: Vec<Arc<VulkanBufferView>>) -> Self {
78		Self::StorageTexelBuffers(storage_texel_buffers)
79	}
80
81	/// Create as a uniform texel buffer
82	pub fn new_uniform_texel_buffer(uniform_texel_buffer: Arc<VulkanBufferView>) -> Self {
83		Self::UniformTexelBuffers(vec![uniform_texel_buffer])
84	}
85
86	/// Create as uniform texel buffers
87	pub fn new_uniform_texel_buffers(uniform_texel_buffers: Vec<Arc<VulkanBufferView>>) -> Self {
88		Self::UniformTexelBuffers(uniform_texel_buffers)
89	}
90
91	/// Get samplers
92	pub fn get_samplers(&self) -> Result<&[Arc<VulkanSampler>], VulkanError> {
93		if let Self::Samplers(samplers) = self {
94			Ok(samplers)
95		} else {
96			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::Samplers`, got {self:?}")))
97		}
98	}
99
100	/// Get images
101	pub fn get_images(&self) -> Result<&[TextureForSample], VulkanError> {
102		if let Self::Images(images) = self {
103			Ok(images)
104		} else {
105			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::Images`, got {self:?}")))
106		}
107	}
108
109	/// Get uniform buffers
110	pub fn get_uniform_buffers(&self) -> Result<&[Arc<dyn GenericUniformBuffer>], VulkanError> {
111		if let Self::UniformBuffers(uniform_buffers) = self {
112			Ok(uniform_buffers)
113		} else {
114			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::UniformBuffers`, got {self:?}")))
115		}
116	}
117
118	/// Get storage buffers
119	pub fn get_storage_buffers(&self) -> Result<&[Arc<dyn GenericStorageBuffer>], VulkanError> {
120		if let Self::StorageBuffers(uniform_buffers) = self {
121			Ok(uniform_buffers)
122		} else {
123			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::StorageBuffers`, got {self:?}")))
124		}
125	}
126
127	/// Get uniform texel buffers
128	pub fn get_uniform_texel_buffers(&self) -> Result<&[Arc<VulkanBufferView>], VulkanError> {
129		if let Self::UniformTexelBuffers(uniform_buffers) = self {
130			Ok(uniform_buffers)
131		} else {
132			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::UniformTexelBuffers`, got {self:?}")))
133		}
134	}
135
136	/// Get storage texel buffers
137	pub fn get_storage_texel_buffers(&self) -> Result<&[Arc<VulkanBufferView>], VulkanError> {
138		if let Self::StorageTexelBuffers(uniform_buffers) = self {
139			Ok(uniform_buffers)
140		} else {
141			Err(VulkanError::ShaderInputTypeMismatch(format!("Expected `DescriptorProp::StorageTexelBuffers`, got {self:?}")))
142		}
143	}
144
145	/// Unwrap for samplers
146	pub fn unwrap_samplers(&self) -> &[Arc<VulkanSampler>] {
147		if let Self::Samplers(samplers) = self {
148			samplers
149		} else {
150			panic!("Expected `DescriptorProp::Samplers`, got {self:?}")
151		}
152	}
153
154	/// Unwrap for images
155	pub fn unwrap_images(&self) -> &[TextureForSample] {
156		if let Self::Images(images) = self {
157			images
158		} else {
159			panic!("Expected `DescriptorProp::Images`, got {self:?}")
160		}
161	}
162
163	/// Unwrap for uniform buffers
164	pub fn unwrap_uniform_buffers(&self) -> &[Arc<dyn GenericUniformBuffer>] {
165		if let Self::UniformBuffers(uniform_buffers) = self {
166			uniform_buffers
167		} else {
168			panic!("Expected `DescriptorProp::UniformBuffers`, got {self:?}")
169		}
170	}
171
172	/// Unwrap for storage buffers
173	pub fn unwrap_storage_buffers(&self) -> &[Arc<dyn GenericStorageBuffer>] {
174		if let Self::StorageBuffers(storage_buffers) = self {
175			storage_buffers
176		} else {
177			panic!("Expected `DescriptorProp::StorageBuffers`, got {self:?}")
178		}
179	}
180
181	/// Unwrap for uniform texel buffers
182	pub fn unwrap_uniform_texel_buffers(&self) -> &[Arc<VulkanBufferView>] {
183		if let Self::UniformTexelBuffers(uniform_texel_buffers) = self {
184			uniform_texel_buffers
185		} else {
186			panic!("Expected `DescriptorProp::UniformTexelBuffers`, got {self:?}")
187		}
188	}
189
190	/// Unwrap for storage texel buffers
191	pub fn unwrap_storage_texel_buffers(&self) -> &[Arc<VulkanBufferView>] {
192		if let Self::StorageTexelBuffers(storage_texel_buffers) = self {
193			storage_texel_buffers
194		} else {
195			panic!("Expected `DescriptorProp::StorageTexelBuffers`, got {self:?}")
196		}
197	}
198
199	/// Check if it is samplers
200	pub fn is_samplers(&self) -> bool {
201		matches!(self, Self::Samplers(_))
202	}
203
204	/// Check if it is images
205	pub fn is_images(&self) -> bool {
206		matches!(self, Self::Images(_))
207	}
208
209	/// Check if it is uniform buffers
210	pub fn is_uniform_buffers(&self) -> bool {
211		matches!(self, Self::UniformBuffers(_))
212	}
213
214	/// Check if it is storage buffers
215	pub fn is_storage_buffers(&self) -> bool {
216		matches!(self, Self::StorageBuffers(_))
217	}
218
219	/// Check if it is uniform texel buffers
220	pub fn is_uniform_texel_buffers(&self) -> bool {
221		matches!(self, Self::UniformTexelBuffers(_))
222	}
223
224	/// Check if it is storage texel buffers
225	pub fn is_storage_texel_buffers(&self) -> bool {
226		matches!(self, Self::StorageTexelBuffers(_))
227	}
228}
229
230unsafe impl Send for DescriptorProp {}
231unsafe impl Sync for DescriptorProp {}
232
233/// The descriptor set properties
234#[derive(Default, Debug)]
235pub struct DescriptorProps {
236	/// The descriptor sets
237	pub sets: RwLock<HashMap<u32 /* set */, HashMap<u32 /* binding */, Arc<DescriptorProp>>>>,
238}
239
240impl DescriptorProps {
241	/// Create a new `DescriptorProps`
242	pub fn new() -> Self {
243		Self::default()
244	}
245
246	/// Insert a prop
247	pub fn insert(&self, set: u32, binding: u32, prop: Arc<DescriptorProp>) -> Option<Arc<DescriptorProp>> {
248		let mut w_lock = self.sets.write().unwrap();
249		if let Some(bindings) = w_lock.get_mut(&set) {
250			bindings.insert(binding, prop)
251		} else {
252			w_lock.insert(set, HashMap::new());
253			w_lock.get_mut(&set).unwrap().insert(binding, prop)
254		}
255	}
256
257	/// Get from the set
258	pub fn get(&self, set: u32, binding: u32) -> Option<Arc<DescriptorProp>> {
259		let r_lock = self.sets.read().unwrap();
260		if let Some(bindings) = r_lock.get(&set) {
261			bindings.get(&binding).cloned()
262		} else {
263			None
264		}
265	}
266
267	/// Create as a sampler
268	pub fn new_sampler(&self, set: u32, binding: u32, sampler: Arc<VulkanSampler>) -> Option<Arc<DescriptorProp>> {
269		self.insert(set, binding, Arc::new(DescriptorProp::new_sampler(sampler)))
270	}
271
272	/// Create as samplers
273	pub fn new_samplers(&self, set: u32, binding: u32, samplers: Vec<Arc<VulkanSampler>>) -> Option<Arc<DescriptorProp>> {
274		self.insert(set, binding, Arc::new(DescriptorProp::new_samplers(samplers)))
275	}
276
277	/// Create as a texture
278	pub fn new_texture(&self, set: u32, binding: u32, texture: TextureForSample) -> Option<Arc<DescriptorProp>> {
279		self.insert(set, binding, Arc::new(DescriptorProp::new_texture(texture)))
280	}
281
282	/// Create as textures
283	pub fn new_textures(&self, set: u32, binding: u32, textures: Vec<TextureForSample>) -> Option<Arc<DescriptorProp>> {
284		self.insert(set, binding, Arc::new(DescriptorProp::new_textures(textures)))
285	}
286
287	/// Create as a storage buffer
288	pub fn new_storage_buffer(&self, set: u32, binding: u32, storage_buffer: Arc<dyn GenericStorageBuffer>) -> Option<Arc<DescriptorProp>> {
289		self.insert(set, binding, Arc::new(DescriptorProp::new_storage_buffer(storage_buffer)))
290	}
291
292	/// Create as storage buffers
293	pub fn new_storage_buffers(&self, set: u32, binding: u32, storage_buffers: Vec<Arc<dyn GenericStorageBuffer>>) -> Option<Arc<DescriptorProp>> {
294		self.insert(set, binding, Arc::new(DescriptorProp::new_storage_buffers(storage_buffers)))
295	}
296
297	/// Create as a uniform buffer
298	pub fn new_uniform_buffer(&self, set: u32, binding: u32, uniform_buffer: Arc<dyn GenericUniformBuffer>) -> Option<Arc<DescriptorProp>> {
299		self.insert(set, binding, Arc::new(DescriptorProp::new_uniform_buffer(uniform_buffer)))
300	}
301
302	/// Create as uniform buffers
303	pub fn new_uniform_buffers(&self, set: u32, binding: u32, uniform_buffers: Vec<Arc<dyn GenericUniformBuffer>>) -> Option<Arc<DescriptorProp>> {
304		self.insert(set, binding, Arc::new(DescriptorProp::new_uniform_buffers(uniform_buffers)))
305	}
306
307	/// Create as a storage texel buffer
308	pub fn new_storage_texel_buffer(&self, set: u32, binding: u32, storage_texel_buffer: Arc<VulkanBufferView>) -> Option<Arc<DescriptorProp>> {
309		self.insert(set, binding, Arc::new(DescriptorProp::new_storage_texel_buffer(storage_texel_buffer)))
310	}
311
312	/// Create as storage texel buffers
313	pub fn new_storage_texel_buffers(&self, set: u32, binding: u32, storage_texel_buffers: Vec<Arc<VulkanBufferView>>) -> Option<Arc<DescriptorProp>> {
314		self.insert(set, binding, Arc::new(DescriptorProp::new_storage_texel_buffers(storage_texel_buffers)))
315	}
316
317	/// Create as a uniform texel buffer
318	pub fn new_uniform_texel_buffer(&self, set: u32, binding: u32, uniform_texel_buffer: Arc<VulkanBufferView>) -> Option<Arc<DescriptorProp>> {
319		self.insert(set, binding, Arc::new(DescriptorProp::new_uniform_texel_buffer(uniform_texel_buffer)))
320	}
321
322	/// Create as uniform texel buffers
323	pub fn new_uniform_texel_buffers(&self, set: u32, binding: u32, uniform_texel_buffers: Vec<Arc<VulkanBufferView>>) -> Option<Arc<DescriptorProp>> {
324		self.insert(set, binding, Arc::new(DescriptorProp::new_uniform_texel_buffers(uniform_texel_buffers)))
325	}
326
327	/// Get specific number of samplers from a `HashMap<String, DescriptorProp>`
328	pub fn get_desc_props_samplers(&self, set: u32, binding: u32, desired_count: usize) -> Result<Vec<Arc<VulkanSampler>>, VulkanError> {
329		let prop = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?;
330		let samplers = prop.get_samplers()?;
331		if samplers.len() != desired_count {
332			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} sampler(s) is needed for `layout(set = {set}, binding = {binding})`, but {} sampler(s) were provided.", samplers.len())));
333		}
334		Ok(samplers.to_vec())
335	}
336
337	/// Get specific number of textures from a `HashMap<String, DescriptorProp>`
338	pub fn get_desc_props_textures(&self, set: u32, binding: u32, desired_count: usize) -> Result<Vec<TextureForSample>, VulkanError> {
339		let prop = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?;
340		let textures = prop.get_images()?;
341		if textures.len() != desired_count {
342			return Err(VulkanError::ShaderInputLengthMismatch(format!("{desired_count} texture(s) is needed for `layout(set = {set}, binding = {binding})`, but {} texture(s) were provided.", textures.len())));
343		}
344		Ok(textures.to_vec())
345	}
346
347	/// Get specific number of uniform buffers from a `HashMap<String, DescriptorProp>`
348	pub fn get_desc_props_uniform_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<Vec<Arc<dyn GenericUniformBuffer>>, VulkanError> {
349		let prop = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?;
350		let uniform_buffers = prop.get_uniform_buffers()?;
351		if uniform_buffers.len() != desired_count {
352			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())));
353		}
354		Ok(uniform_buffers.to_vec())
355	}
356
357	/// Get specific number of uniform buffers from a `HashMap<String, DescriptorProp>`
358	pub fn get_desc_props_storage_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<Vec<Arc<dyn GenericStorageBuffer>>, VulkanError> {
359		let prop = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?;
360		let storage_buffers = prop.get_storage_buffers()?;
361		if storage_buffers.len() != desired_count {
362			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())));
363		}
364		Ok(storage_buffers.to_vec())
365	}
366
367	/// Get specific number of uniform texel buffers from a `HashMap<String, DescriptorProp>`
368	pub fn get_desc_props_uniform_texel_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<Vec<Arc<VulkanBufferView>>, VulkanError> {
369		let prop = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?;
370		let uniform_texel_buffers = prop.get_uniform_texel_buffers()?;
371		if uniform_texel_buffers.len() != desired_count {
372			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())));
373		}
374		Ok(uniform_texel_buffers.to_vec())
375	}
376
377	/// Get specific number of uniform texel buffers from a `HashMap<String, DescriptorProp>`
378	pub fn get_desc_props_storage_texel_buffers(&self, set: u32, binding: u32, desired_count: usize) -> Result<Vec<Arc<VulkanBufferView>>, VulkanError> {
379		let prop = self.get(set, binding).ok_or(VulkanError::MissingShaderInputs(format!("layout(set = {set}, binding = {binding})")))?;
380		let storage_texel_buffers = prop.get_storage_texel_buffers()?;
381		if storage_texel_buffers.len() != desired_count {
382			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())));
383		}
384		Ok(storage_texel_buffers.to_vec())
385	}
386}