1
2use crate::prelude::*;
3use std::{
4 collections::HashMap,
5 sync::Arc,
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<VulkanBufferView>),
25
26 UniformTexelBuffers(Vec<VulkanBufferView>),
28}
29
30impl DescriptorProp {
31 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 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 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 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 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 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 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 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 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 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 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 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 pub fn is_samplers(&self) -> bool {
141 matches!(self, Self::Samplers(_))
142 }
143
144 pub fn is_images(&self) -> bool {
146 matches!(self, Self::Images(_))
147 }
148
149 pub fn is_uniform_buffers(&self) -> bool {
151 matches!(self, Self::UniformBuffers(_))
152 }
153
154 pub fn is_storage_buffers(&self) -> bool {
156 matches!(self, Self::StorageBuffers(_))
157 }
158
159 pub fn is_uniform_texel_buffers(&self) -> bool {
161 matches!(self, Self::UniformTexelBuffers(_))
162 }
163
164 pub fn is_storage_texel_buffers(&self) -> bool {
166 matches!(self, Self::StorageTexelBuffers(_))
167 }
168}
169
170#[derive(Default, Debug, Clone)]
172pub struct DescriptorProps {
173 pub sets: HashMap<u32 , HashMap<u32 , Arc<DescriptorProp>>>,
175}
176
177impl DescriptorProps {
178 pub fn new(sets: HashMap<u32, HashMap<u32, Arc<DescriptorProp>>>) -> Self {
180 Self {
181 sets,
182 }
183 }
184
185 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 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 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 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 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 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 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 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}