use std::error;
use std::fmt;
use descriptor::descriptor_set::DescriptorSetsCollection;
use descriptor::pipeline_layout::PipelineLayoutDesc;
pub fn check_descriptor_sets_validity<Pl, D>(pipeline: &Pl, descriptor_sets: &D)
-> Result<(), CheckDescriptorSetsValidityError>
where Pl: ?Sized + PipelineLayoutDesc,
D: ?Sized + DescriptorSetsCollection,
{
for set_num in 0 .. pipeline.num_sets() {
for binding_num in 0 .. pipeline.num_bindings_in_set(set_num).unwrap_or(0) {
let set_desc = descriptor_sets.descriptor(set_num, binding_num);
let pipeline_desc = pipeline.descriptor(set_num, binding_num);
let (set_desc, pipeline_desc) = match (set_desc, pipeline_desc) {
(Some(s), Some(p)) => (s, p),
(None, Some(_)) => return Err(CheckDescriptorSetsValidityError::MissingDescriptor {
set_num: set_num,
binding_num: binding_num,
}),
(Some(_), None) => continue,
(None, None) => continue,
};
if !set_desc.is_superset_of(&pipeline_desc) {
return Err(CheckDescriptorSetsValidityError::IncompatibleDescriptor {
set_num: set_num,
binding_num: binding_num,
});
}
}
}
Ok(())
}
#[derive(Debug, Copy, Clone)]
pub enum CheckDescriptorSetsValidityError {
MissingDescriptor {
set_num: usize,
binding_num: usize,
},
IncompatibleDescriptor {
set_num: usize,
binding_num: usize,
},
}
impl error::Error for CheckDescriptorSetsValidityError {
#[inline]
fn description(&self) -> &str {
match *self {
CheckDescriptorSetsValidityError::MissingDescriptor { .. } => {
"a descriptor is missing in the descriptor sets that were provided"
},
CheckDescriptorSetsValidityError::IncompatibleDescriptor { .. } => {
"a descriptor in the provided sets is not compatible with what is expected"
},
}
}
}
impl fmt::Display for CheckDescriptorSetsValidityError {
#[inline]
fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(fmt, "{}", error::Error::description(self))
}
}