1
2use crate::prelude::*;
3use std::{
4 collections::HashMap,
5 sync::{Arc, RwLock},
6};
7
8#[derive(Debug)]
10pub enum DescriptorProp {
11 Samplers(Vec<Arc<VulkanSampler>>),
13
14 Images(Vec<TextureForSample>),
16
17 StorageBuffers(Vec<Arc<dyn GenericStorageBuffer>>),
19
20 UniformBuffers(Vec<Arc<dyn GenericUniformBuffer>>),
22
23 StorageTexelBuffers(Vec<Arc<VulkanBufferView>>),
25
26 UniformTexelBuffers(Vec<Arc<VulkanBufferView>>),
28}
29
30impl DescriptorProp {
31 pub fn new_sampler(sampler: Arc<VulkanSampler>) -> Self {
33 Self::Samplers(vec![sampler])
34 }
35
36 pub fn new_samplers(samplers: Vec<Arc<VulkanSampler>>) -> Self {
38 Self::Samplers(samplers)
39 }
40
41 pub fn new_texture(texture: TextureForSample) -> Self {
43 Self::Images(vec![texture])
44 }
45
46 pub fn new_textures(textures: Vec<TextureForSample>) -> Self {
48 Self::Images(textures)
49 }
50
51 pub fn new_storage_buffer(storage_buffer: Arc<dyn GenericStorageBuffer>) -> Self {
53 Self::StorageBuffers(vec![storage_buffer])
54 }
55
56 pub fn new_storage_buffers(storage_buffers: Vec<Arc<dyn GenericStorageBuffer>>) -> Self {
58 Self::StorageBuffers(storage_buffers)
59 }
60
61 pub fn new_uniform_buffer(uniform_buffer: Arc<dyn GenericUniformBuffer>) -> Self {
63 Self::UniformBuffers(vec![uniform_buffer])
64 }
65
66 pub fn new_uniform_buffers(uniform_buffers: Vec<Arc<dyn GenericUniformBuffer>>) -> Self {
68 Self::UniformBuffers(uniform_buffers)
69 }
70
71 pub fn new_storage_texel_buffer(storage_texel_buffer: Arc<VulkanBufferView>) -> Self {
73 Self::StorageTexelBuffers(vec![storage_texel_buffer])
74 }
75
76 pub fn new_storage_texel_buffers(storage_texel_buffers: Vec<Arc<VulkanBufferView>>) -> Self {
78 Self::StorageTexelBuffers(storage_texel_buffers)
79 }
80
81 pub fn new_uniform_texel_buffer(uniform_texel_buffer: Arc<VulkanBufferView>) -> Self {
83 Self::UniformTexelBuffers(vec![uniform_texel_buffer])
84 }
85
86 pub fn new_uniform_texel_buffers(uniform_texel_buffers: Vec<Arc<VulkanBufferView>>) -> Self {
88 Self::UniformTexelBuffers(uniform_texel_buffers)
89 }
90
91 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 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 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 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 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 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 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 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 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 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 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 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 pub fn is_samplers(&self) -> bool {
201 matches!(self, Self::Samplers(_))
202 }
203
204 pub fn is_images(&self) -> bool {
206 matches!(self, Self::Images(_))
207 }
208
209 pub fn is_uniform_buffers(&self) -> bool {
211 matches!(self, Self::UniformBuffers(_))
212 }
213
214 pub fn is_storage_buffers(&self) -> bool {
216 matches!(self, Self::StorageBuffers(_))
217 }
218
219 pub fn is_uniform_texel_buffers(&self) -> bool {
221 matches!(self, Self::UniformTexelBuffers(_))
222 }
223
224 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#[derive(Default, Debug)]
235pub struct DescriptorProps {
236 pub sets: RwLock<HashMap<u32 , HashMap<u32 , Arc<DescriptorProp>>>>,
238}
239
240impl DescriptorProps {
241 pub fn new() -> Self {
243 Self::default()
244 }
245
246 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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}