use std::ops::Range;
use std::u32;
use vk;
#[derive(Debug, Clone)]
pub struct DepthStencil {
pub depth_compare: Compare,
pub depth_write: bool,
pub depth_bounds_test: DepthBounds,
pub stencil_front: Stencil,
pub stencil_back: Stencil,
}
impl DepthStencil {
#[inline]
pub fn disabled() -> DepthStencil {
DepthStencil {
depth_write: false,
depth_compare: Compare::Always,
depth_bounds_test: DepthBounds::Disabled,
stencil_front: Default::default(),
stencil_back: Default::default(),
}
}
#[inline]
pub fn simple_depth_test() -> DepthStencil {
DepthStencil {
depth_write: true,
depth_compare: Compare::Less,
depth_bounds_test: DepthBounds::Disabled,
stencil_front: Default::default(),
stencil_back: Default::default(),
}
}
}
impl Default for DepthStencil {
#[inline]
fn default() -> DepthStencil {
DepthStencil::disabled()
}
}
#[derive(Debug, Copy, Clone)]
pub struct Stencil {
pub compare: Compare,
pub pass_op: StencilOp,
pub fail_op: StencilOp,
pub depth_fail_op: StencilOp,
pub compare_mask: Option<u32>,
pub write_mask: Option<u32>,
pub reference: Option<u32>,
}
impl Stencil {
#[inline]
pub fn always_keep(&self) -> bool {
match self.compare {
Compare::Always => self.pass_op == StencilOp::Keep &&
self.depth_fail_op == StencilOp::Keep,
Compare::Never => self.fail_op == StencilOp::Keep,
_ => self.pass_op == StencilOp::Keep && self.fail_op == StencilOp::Keep &&
self.depth_fail_op == StencilOp::Keep,
}
}
}
impl Default for Stencil {
#[inline]
fn default() -> Stencil {
Stencil {
compare: Compare::Never,
pass_op: StencilOp::Keep,
fail_op: StencilOp::Keep,
depth_fail_op: StencilOp::Keep,
compare_mask: Some(u32::MAX),
write_mask: Some(u32::MAX),
reference: Some(u32::MAX),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u32)]
pub enum StencilOp {
Keep = vk::STENCIL_OP_KEEP,
Zero = vk::STENCIL_OP_ZERO,
Replace = vk::STENCIL_OP_REPLACE,
IncrementAndClamp = vk::STENCIL_OP_INCREMENT_AND_CLAMP,
DecrementAndClamp = vk::STENCIL_OP_DECREMENT_AND_CLAMP,
Invert = vk::STENCIL_OP_INVERT,
IncrementAndWrap = vk::STENCIL_OP_INCREMENT_AND_WRAP,
DecrementAndWrap = vk::STENCIL_OP_DECREMENT_AND_WRAP,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DepthBounds {
Disabled,
Fixed(Range<f32>),
Dynamic,
}
impl DepthBounds {
#[inline]
pub fn is_dynamic(&self) -> bool {
match self {
&DepthBounds::Dynamic => true,
_ => false,
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u32)]
pub enum Compare {
Never = vk::COMPARE_OP_NEVER,
Less = vk::COMPARE_OP_LESS,
Equal = vk::COMPARE_OP_EQUAL,
LessOrEqual = vk::COMPARE_OP_LESS_OR_EQUAL,
Greater = vk::COMPARE_OP_GREATER,
NotEqual = vk::COMPARE_OP_NOT_EQUAL,
GreaterOrEqual = vk::COMPARE_OP_GREATER_OR_EQUAL,
Always = vk::COMPARE_OP_ALWAYS,
}