wgpu: Simplify stencil usage from Frame's perspective

This commit is contained in:
Nathan Adams 2022-09-07 12:03:51 +02:00
parent 794b30e10e
commit a1d1da5d25
2 changed files with 14 additions and 21 deletions

View File

@ -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);

View File

@ -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
}
}