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_indices: wgpu::BufferSlice<'a>,
|
||||
blend_modes: Vec<BlendMode>,
|
||||
num_masks: u32,
|
||||
}
|
||||
|
||||
impl<'a, 'b> CommandRenderer<'a, 'b> {
|
||||
|
@ -32,6 +33,7 @@ impl<'a, 'b> CommandRenderer<'a, 'b> {
|
|||
quad_vertices,
|
||||
quad_indices,
|
||||
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::DrawMaskedContent
|
||||
);
|
||||
self.num_masks += 1;
|
||||
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) {
|
||||
debug_assert!(
|
||||
self.frame.num_masks() > 0 && self.frame.mask_state() == MaskState::DrawMaskStencil
|
||||
);
|
||||
debug_assert!(self.num_masks > 0 && self.frame.mask_state() == MaskState::DrawMaskStencil);
|
||||
self.frame.set_mask_state(MaskState::DrawMaskedContent);
|
||||
self.frame.set_stencil(self.num_masks);
|
||||
}
|
||||
|
||||
fn deactivate_mask(&mut self) {
|
||||
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_stencil(self.num_masks);
|
||||
}
|
||||
|
||||
fn pop_mask(&mut self) {
|
||||
debug_assert!(
|
||||
self.frame.num_masks() > 0 && self.frame.mask_state() == MaskState::ClearMaskStencil
|
||||
);
|
||||
let num_masks = self.frame.num_masks() - 1;
|
||||
self.frame.set_mask_count(num_masks);
|
||||
if num_masks == 0 {
|
||||
debug_assert!(self.num_masks > 0 && self.frame.mask_state() == MaskState::ClearMaskStencil);
|
||||
self.num_masks -= 1;
|
||||
self.frame.set_stencil(self.num_masks);
|
||||
if self.num_masks == 0 {
|
||||
self.frame.set_mask_state(MaskState::NoMask);
|
||||
} else {
|
||||
self.frame.set_mask_state(MaskState::DrawMaskedContent);
|
||||
|
|
|
@ -8,7 +8,6 @@ pub struct Frame<'a> {
|
|||
descriptors: &'a Descriptors,
|
||||
uniform_buffers: UniformBuffer<'a, Transforms>,
|
||||
mask_state: MaskState,
|
||||
num_masks: u32,
|
||||
uniform_encoder: &'a mut wgpu::CommandEncoder,
|
||||
render_pass: wgpu::RenderPass<'a>,
|
||||
blend_mode: BlendMode,
|
||||
|
@ -27,7 +26,6 @@ impl<'a> Frame<'a> {
|
|||
descriptors,
|
||||
uniform_buffers,
|
||||
mask_state: MaskState::NoMask,
|
||||
num_masks: 0,
|
||||
uniform_encoder,
|
||||
render_pass,
|
||||
blend_mode: BlendMode::Normal,
|
||||
|
@ -191,10 +189,8 @@ impl<'a> Frame<'a> {
|
|||
self.mask_state = state;
|
||||
}
|
||||
|
||||
pub fn set_mask_count(&mut self, num: u32) {
|
||||
self.num_masks = num;
|
||||
|
||||
self.render_pass.set_stencil_reference(self.num_masks);
|
||||
pub fn set_stencil(&mut self, num: u32) {
|
||||
self.render_pass.set_stencil_reference(num);
|
||||
}
|
||||
|
||||
pub fn set_blend_mode(&mut self, blend_mode: BlendMode) {
|
||||
|
@ -204,8 +200,4 @@ impl<'a> Frame<'a> {
|
|||
pub fn mask_state(&self) -> MaskState {
|
||||
self.mask_state
|
||||
}
|
||||
|
||||
pub fn num_masks(&self) -> u32 {
|
||||
self.num_masks
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue