Skip to content

Commit

Permalink
Align stencil reference flags between pipeline creation and setting
Browse files Browse the repository at this point in the history
  • Loading branch information
kvark committed Oct 14, 2020
1 parent 05ae7d5 commit 4501a4a
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 13 deletions.
36 changes: 24 additions & 12 deletions wgpu-core/src/command/render.rs
Expand Up @@ -269,9 +269,10 @@ impl VertexState {

#[derive(Debug)]
struct State {
pipeline_flags: PipelineFlags,
binder: Binder,
blend_color: OptionalState,
stencil_reference: OptionalState,
stencil_reference: u32,
pipeline: OptionalState,
index: IndexState,
vertex: VertexState,
Expand All @@ -294,9 +295,6 @@ impl State {
if self.blend_color == OptionalState::Required {
return Err(DrawError::MissingBlendColor);
}
if self.stencil_reference == OptionalState::Required {
return Err(DrawError::MissingStencilReference);
}
Ok(())
}

Expand Down Expand Up @@ -929,9 +927,10 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
};

let mut state = State {
pipeline_flags: PipelineFlags::empty(),
binder: Binder::new(cmd_buf.limits.max_bind_groups),
blend_color: OptionalState::Unused,
stencil_reference: OptionalState::Unused,
stencil_reference: 0,
pipeline: OptionalState::Required,
index: IndexState::default(),
vertex: VertexState::default(),
Expand Down Expand Up @@ -995,12 +994,14 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
};
}
RenderCommand::SetPipeline(pipeline_id) => {
state.pipeline = OptionalState::Set;
let pipeline = trackers
.render_pipes
.use_extend(&*pipeline_guard, pipeline_id, (), ())
.unwrap();

state.pipeline = OptionalState::Set;
state.pipeline_flags = pipeline.flags;

if !context.compatible(&pipeline.pass_context) {
return Err(RenderCommandError::IncompatiblePipeline.into());
}
Expand All @@ -1013,14 +1014,20 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
state
.blend_color
.require(pipeline.flags.contains(PipelineFlags::BLEND_COLOR));
state
.stencil_reference
.require(pipeline.flags.contains(PipelineFlags::STENCIL_REFERENCE));

unsafe {
raw.bind_graphics_pipeline(&pipeline.raw);
}

if pipeline.flags.contains(PipelineFlags::STENCIL_REFERENCE) {
unsafe {
raw.set_stencil_reference(
hal::pso::Face::all(),
state.stencil_reference,
);
}
}

// Rebind resource
if state.binder.pipeline_layout_id != Some(pipeline.layout_id.value) {
let pipeline_layout = &pipeline_layout_guard[pipeline.layout_id.value];
Expand Down Expand Up @@ -1187,9 +1194,14 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
}
}
RenderCommand::SetStencilReference(value) => {
state.stencil_reference = OptionalState::Set;
unsafe {
raw.set_stencil_reference(hal::pso::Face::all(), value);
state.stencil_reference = value;
if state
.pipeline_flags
.contains(PipelineFlags::STENCIL_REFERENCE)
{
unsafe {
raw.set_stencil_reference(hal::pso::Face::all(), value);
}
}
}
RenderCommand::SetViewport {
Expand Down
2 changes: 1 addition & 1 deletion wgpu-core/src/device/mod.rs
Expand Up @@ -2928,7 +2928,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
}
}
if let Some(ds) = depth_stencil_state.as_ref() {
if ds.stencil.needs_ref_value() {
if ds.stencil.is_enabled() && ds.stencil.needs_ref_value() {
flags |= pipeline::PipelineFlags::STENCIL_REFERENCE;
}
if !ds.is_read_only() {
Expand Down

0 comments on commit 4501a4a

Please sign in to comment.