use crate::{
device::Device, image::SampleCount, Requires, RequiresAllOf, RequiresOneOf, ValidationError,
};
#[derive(Copy, Clone, Debug)]
pub struct MultisampleState {
pub rasterization_samples: SampleCount,
pub sample_shading: Option<f32>,
pub sample_mask: [u32; 2],
pub alpha_to_coverage_enable: bool,
pub alpha_to_one_enable: bool,
pub _ne: crate::NonExhaustive,
}
impl Default for MultisampleState {
#[inline]
fn default() -> Self {
Self {
rasterization_samples: SampleCount::Sample1,
sample_shading: None,
sample_mask: [u32::MAX; 2],
alpha_to_coverage_enable: false,
alpha_to_one_enable: false,
_ne: crate::NonExhaustive(()),
}
}
}
impl MultisampleState {
#[inline]
#[deprecated(since = "0.34.0", note = "use `MultisampleState::default` instead")]
pub fn new() -> MultisampleState {
Self::default()
}
pub(crate) fn validate(&self, device: &Device) -> Result<(), Box<ValidationError>> {
let &Self {
rasterization_samples,
sample_shading,
sample_mask: _,
alpha_to_coverage_enable: _,
alpha_to_one_enable,
_ne: _,
} = self;
rasterization_samples
.validate_device(device)
.map_err(|err| {
err.add_context("rasterization_samples").set_vuids(&[
"VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-parameter",
])
})?;
if let Some(min_sample_shading) = sample_shading {
if !device.enabled_features().sample_rate_shading {
return Err(Box::new(ValidationError {
context: "min_sample_shading".into(),
problem: "is `Some`".into(),
requires_one_of: RequiresOneOf(&[RequiresAllOf(&[Requires::Feature(
"sample_rate_shading",
)])]),
vuids: &["VUID-VkPipelineMultisampleStateCreateInfo-sampleShadingEnable-00784"],
}));
}
if !(0.0..=1.0).contains(&min_sample_shading) {
return Err(Box::new(ValidationError {
context: "min_sample_shading".into(),
problem: "is not between 0.0 and 1.0 inclusive".into(),
vuids: &["VUID-VkPipelineMultisampleStateCreateInfo-minSampleShading-00786"],
..Default::default()
}));
}
}
if alpha_to_one_enable && !device.enabled_features().alpha_to_one {
return Err(Box::new(ValidationError {
context: "alpha_to_one_enable".into(),
problem: "is `true`".into(),
requires_one_of: RequiresOneOf(&[RequiresAllOf(&[Requires::Feature(
"alpha_to_one",
)])]),
vuids: &["VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785"],
}));
}
Ok(())
}
}