wgpu: Simplify stencil usage from Frame's perspective
This commit is contained in:
parent
794b30e10e
commit
a1d1da5d25
|
@ -15,6 +15,7 @@ pub struct CommandRenderer<'a, 'b> {
|
||||||
quad_vertices: wgpu::BufferSlice<'a>,
|
quad_vertices: wgpu::BufferSlice<'a>,
|
||||||
quad_indices: wgpu::BufferSlice<'a>,
|
quad_indices: wgpu::BufferSlice<'a>,
|
||||||
blend_modes: Vec<BlendMode>,
|
blend_modes: Vec<BlendMode>,
|
||||||
|
num_masks: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'b> CommandRenderer<'a, 'b> {
|
impl<'a, 'b> CommandRenderer<'a, 'b> {
|
||||||
|
@ -32,6 +33,7 @@ impl<'a, 'b> CommandRenderer<'a, 'b> {
|
||||||
quad_vertices,
|
quad_vertices,
|
||||||
quad_indices,
|
quad_indices,
|
||||||
blend_modes: vec![BlendMode::Normal],
|
blend_modes: vec![BlendMode::Normal],
|
||||||
|
num_masks: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,31 +130,30 @@ impl<'a, 'b> CommandHandler for CommandRenderer<'a, 'b> {
|
||||||
self.frame.mask_state() == MaskState::NoMask
|
self.frame.mask_state() == MaskState::NoMask
|
||||||
|| self.frame.mask_state() == MaskState::DrawMaskedContent
|
|| self.frame.mask_state() == MaskState::DrawMaskedContent
|
||||||
);
|
);
|
||||||
|
self.num_masks += 1;
|
||||||
self.frame.set_mask_state(MaskState::DrawMaskStencil);
|
self.frame.set_mask_state(MaskState::DrawMaskStencil);
|
||||||
self.frame.set_mask_count(self.frame.num_masks() + 1);
|
self.frame.set_stencil(self.num_masks - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn activate_mask(&mut self) {
|
fn activate_mask(&mut self) {
|
||||||
debug_assert!(
|
debug_assert!(self.num_masks > 0 && self.frame.mask_state() == MaskState::DrawMaskStencil);
|
||||||
self.frame.num_masks() > 0 && self.frame.mask_state() == MaskState::DrawMaskStencil
|
|
||||||
);
|
|
||||||
self.frame.set_mask_state(MaskState::DrawMaskedContent);
|
self.frame.set_mask_state(MaskState::DrawMaskedContent);
|
||||||
|
self.frame.set_stencil(self.num_masks);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deactivate_mask(&mut self) {
|
fn deactivate_mask(&mut self) {
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
self.frame.num_masks() > 0 && self.frame.mask_state() == MaskState::DrawMaskedContent
|
self.num_masks > 0 && self.frame.mask_state() == MaskState::DrawMaskedContent
|
||||||
);
|
);
|
||||||
self.frame.set_mask_state(MaskState::ClearMaskStencil);
|
self.frame.set_mask_state(MaskState::ClearMaskStencil);
|
||||||
|
self.frame.set_stencil(self.num_masks);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pop_mask(&mut self) {
|
fn pop_mask(&mut self) {
|
||||||
debug_assert!(
|
debug_assert!(self.num_masks > 0 && self.frame.mask_state() == MaskState::ClearMaskStencil);
|
||||||
self.frame.num_masks() > 0 && self.frame.mask_state() == MaskState::ClearMaskStencil
|
self.num_masks -= 1;
|
||||||
);
|
self.frame.set_stencil(self.num_masks);
|
||||||
let num_masks = self.frame.num_masks() - 1;
|
if self.num_masks == 0 {
|
||||||
self.frame.set_mask_count(num_masks);
|
|
||||||
if num_masks == 0 {
|
|
||||||
self.frame.set_mask_state(MaskState::NoMask);
|
self.frame.set_mask_state(MaskState::NoMask);
|
||||||
} else {
|
} else {
|
||||||
self.frame.set_mask_state(MaskState::DrawMaskedContent);
|
self.frame.set_mask_state(MaskState::DrawMaskedContent);
|
||||||
|
|
|
@ -8,7 +8,6 @@ pub struct Frame<'a> {
|
||||||
descriptors: &'a Descriptors,
|
descriptors: &'a Descriptors,
|
||||||
uniform_buffers: UniformBuffer<'a, Transforms>,
|
uniform_buffers: UniformBuffer<'a, Transforms>,
|
||||||
mask_state: MaskState,
|
mask_state: MaskState,
|
||||||
num_masks: u32,
|
|
||||||
uniform_encoder: &'a mut wgpu::CommandEncoder,
|
uniform_encoder: &'a mut wgpu::CommandEncoder,
|
||||||
render_pass: wgpu::RenderPass<'a>,
|
render_pass: wgpu::RenderPass<'a>,
|
||||||
blend_mode: BlendMode,
|
blend_mode: BlendMode,
|
||||||
|
@ -27,7 +26,6 @@ impl<'a> Frame<'a> {
|
||||||
descriptors,
|
descriptors,
|
||||||
uniform_buffers,
|
uniform_buffers,
|
||||||
mask_state: MaskState::NoMask,
|
mask_state: MaskState::NoMask,
|
||||||
num_masks: 0,
|
|
||||||
uniform_encoder,
|
uniform_encoder,
|
||||||
render_pass,
|
render_pass,
|
||||||
blend_mode: BlendMode::Normal,
|
blend_mode: BlendMode::Normal,
|
||||||
|
@ -191,10 +189,8 @@ impl<'a> Frame<'a> {
|
||||||
self.mask_state = state;
|
self.mask_state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_mask_count(&mut self, num: u32) {
|
pub fn set_stencil(&mut self, num: u32) {
|
||||||
self.num_masks = num;
|
self.render_pass.set_stencil_reference(num);
|
||||||
|
|
||||||
self.render_pass.set_stencil_reference(self.num_masks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_blend_mode(&mut self, blend_mode: BlendMode) {
|
pub fn set_blend_mode(&mut self, blend_mode: BlendMode) {
|
||||||
|
@ -204,8 +200,4 @@ impl<'a> Frame<'a> {
|
||||||
pub fn mask_state(&self) -> MaskState {
|
pub fn mask_state(&self) -> MaskState {
|
||||||
self.mask_state
|
self.mask_state
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn num_masks(&self) -> u32 {
|
|
||||||
self.num_masks
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue