use crate::{
device::Device, macros::vulkan_enum, pipeline::graphics::viewport::Scissor, ValidationError,
};
#[derive(Clone, Debug)]
pub struct DiscardRectangleState {
pub mode: DiscardRectangleMode,
pub rectangles: Vec<Scissor>,
pub _ne: crate::NonExhaustive,
}
impl Default for DiscardRectangleState {
#[inline]
fn default() -> Self {
Self {
mode: DiscardRectangleMode::Exclusive,
rectangles: Vec::new(),
_ne: crate::NonExhaustive(()),
}
}
}
impl DiscardRectangleState {
#[inline]
#[deprecated(
since = "0.34.0",
note = "use `DiscardRectangleState::default` instead"
)]
pub fn new() -> Self {
Self::default()
}
pub(crate) fn validate(&self, device: &Device) -> Result<(), Box<ValidationError>> {
let &Self {
mode,
ref rectangles,
_ne: _,
} = self;
let properties = device.physical_device().properties();
mode.validate_device(device).map_err(|err| {
err.add_context("mode").set_vuids(&[
"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter",
])
})?;
if rectangles.len() as u32 > properties.max_discard_rectangles.unwrap() {
return Err(Box::new(ValidationError {
context: "rectangles".into(),
problem: "the length exceeds the `max_discard_rectangles` limit".into(),
vuids: &[
"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582",
],
..Default::default()
}));
}
Ok(())
}
}
vulkan_enum! {
#[non_exhaustive]
DiscardRectangleMode = DiscardRectangleModeEXT(i32);
Inclusive = INCLUSIVE,
Exclusive = EXCLUSIVE,
}