mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-22 06:44:14 +00:00
Align stencil reference flags between pipeline creation and setting
This commit is contained in:
parent
05ae7d5f5b
commit
4501a4a3d3
@ -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,
|
||||
@ -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(())
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
@ -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());
|
||||
}
|
||||
@ -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];
|
||||
@ -1187,11 +1194,16 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
||||
}
|
||||
}
|
||||
RenderCommand::SetStencilReference(value) => {
|
||||
state.stencil_reference = OptionalState::Set;
|
||||
state.stencil_reference = value;
|
||||
if state
|
||||
.pipeline_flags
|
||||
.contains(PipelineFlags::STENCIL_REFERENCE)
|
||||
{
|
||||
unsafe {
|
||||
raw.set_stencil_reference(hal::pso::Face::all(), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
RenderCommand::SetViewport {
|
||||
ref rect,
|
||||
depth_min,
|
||||
|
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user