diff --git a/wgpu-core/src/command/render.rs b/wgpu-core/src/command/render.rs index 883ae6ceee..a95ea4cdd5 100644 --- a/wgpu-core/src/command/render.rs +++ b/wgpu-core/src/command/render.rs @@ -1206,8 +1206,14 @@ impl Global { } RenderCommand::SetBlendConstant(ref color) => { state.blend_constant = OptionalState::Set; + let array = [ + color.r as f32, + color.g as f32, + color.b as f32, + color.a as f32, + ]; unsafe { - raw.set_blend_constants(color); + raw.set_blend_constants(&array); } } RenderCommand::SetStencilReference(value) => { diff --git a/wgpu-hal/src/dx12/command.rs b/wgpu-hal/src/dx12/command.rs index dc7001b92e..7beffa8a01 100644 --- a/wgpu-hal/src/dx12/command.rs +++ b/wgpu-hal/src/dx12/command.rs @@ -46,6 +46,7 @@ impl crate::CommandEncoder for super::CommandEncoder { } self.list = Some(list); self.temp.clear(); + self.has_pass_label = false; Ok(()) } unsafe fn discard_encoding(&mut self) { @@ -387,8 +388,18 @@ impl crate::CommandEncoder for super::CommandEncoder { // render - unsafe fn begin_render_pass(&mut self, desc: &crate::RenderPassDescriptor) {} - unsafe fn end_render_pass(&mut self) {} + unsafe fn begin_render_pass(&mut self, desc: &crate::RenderPassDescriptor) { + if let Some(label) = desc.label { + self.begin_debug_marker(label); + self.has_pass_label = true; + } + } + unsafe fn end_render_pass(&mut self) { + if self.has_pass_label { + self.end_debug_marker(); + self.has_pass_label = false; + } + } unsafe fn set_bind_group( &mut self, @@ -437,10 +448,32 @@ impl crate::CommandEncoder for super::CommandEncoder { binding: crate::BufferBinding<'a, super::Api>, ) { } - unsafe fn set_viewport(&mut self, rect: &crate::Rect, depth_range: Range) {} - unsafe fn set_scissor_rect(&mut self, rect: &crate::Rect) {} - unsafe fn set_stencil_reference(&mut self, value: u32) {} - unsafe fn set_blend_constants(&mut self, color: &wgt::Color) {} + unsafe fn set_viewport(&mut self, rect: &crate::Rect, depth_range: Range) { + let raw_vp = d3d12::D3D12_VIEWPORT { + TopLeftX: rect.x, + TopLeftY: rect.y, + Width: rect.w, + Height: rect.h, + MinDepth: depth_range.start, + MaxDepth: depth_range.end, + }; + self.list.unwrap().RSSetViewports(1, &raw_vp); + } + unsafe fn set_scissor_rect(&mut self, rect: &crate::Rect) { + let raw_rect = d3d12::D3D12_RECT { + left: rect.x as i32, + top: rect.y as i32, + right: (rect.x + rect.w) as i32, + bottom: (rect.y + rect.h) as i32, + }; + self.list.unwrap().RSSetScissorRects(1, &raw_rect); + } + unsafe fn set_stencil_reference(&mut self, value: u32) { + self.list.unwrap().set_stencil_reference(value); + } + unsafe fn set_blend_constants(&mut self, color: &[f32; 4]) { + self.list.unwrap().set_blend_factor(*color); + } unsafe fn draw( &mut self, @@ -536,8 +569,18 @@ impl crate::CommandEncoder for super::CommandEncoder { // compute - unsafe fn begin_compute_pass(&mut self, desc: &crate::ComputePassDescriptor) {} - unsafe fn end_compute_pass(&mut self) {} + unsafe fn begin_compute_pass(&mut self, desc: &crate::ComputePassDescriptor) { + if let Some(label) = desc.label { + self.begin_debug_marker(label); + self.has_pass_label = true; + } + } + unsafe fn end_compute_pass(&mut self) { + if self.has_pass_label { + self.end_debug_marker(); + self.has_pass_label = false; + } + } unsafe fn set_compute_pipeline(&mut self, pipeline: &Resource) {} diff --git a/wgpu-hal/src/dx12/device.rs b/wgpu-hal/src/dx12/device.rs index efcc088a13..2b2cad28e3 100644 --- a/wgpu-hal/src/dx12/device.rs +++ b/wgpu-hal/src/dx12/device.rs @@ -783,6 +783,7 @@ impl crate::Device for super::Device { shared: Arc::clone(&self.shared), list: None, free_lists: Vec::new(), + has_pass_label: false, temp: super::Temp::default(), }) } diff --git a/wgpu-hal/src/dx12/mod.rs b/wgpu-hal/src/dx12/mod.rs index 244d070d5d..30e26561d7 100644 --- a/wgpu-hal/src/dx12/mod.rs +++ b/wgpu-hal/src/dx12/mod.rs @@ -228,6 +228,7 @@ pub struct CommandEncoder { shared: Arc, list: Option, free_lists: Vec, + has_pass_label: bool, temp: Temp, } diff --git a/wgpu-hal/src/empty.rs b/wgpu-hal/src/empty.rs index 3c6a51eaec..c2710e4532 100644 --- a/wgpu-hal/src/empty.rs +++ b/wgpu-hal/src/empty.rs @@ -322,7 +322,7 @@ impl crate::CommandEncoder for Encoder { unsafe fn set_viewport(&mut self, rect: &crate::Rect, depth_range: Range) {} unsafe fn set_scissor_rect(&mut self, rect: &crate::Rect) {} unsafe fn set_stencil_reference(&mut self, value: u32) {} - unsafe fn set_blend_constants(&mut self, color: &wgt::Color) {} + unsafe fn set_blend_constants(&mut self, color: &[f32; 4]) {} unsafe fn draw( &mut self, diff --git a/wgpu-hal/src/gles/command.rs b/wgpu-hal/src/gles/command.rs index 5fb632f330..b5e8ff8355 100644 --- a/wgpu-hal/src/gles/command.rs +++ b/wgpu-hal/src/gles/command.rs @@ -767,14 +767,8 @@ impl crate::CommandEncoder for super::CommandEncoder { self.state.stencil.back.reference = value; self.rebind_stencil_func(); } - unsafe fn set_blend_constants(&mut self, color: &wgt::Color) { - let color = [ - color.r as f32, - color.g as f32, - color.b as f32, - color.a as f32, - ]; - self.cmd_buffer.commands.push(C::SetBlendConstant(color)); + unsafe fn set_blend_constants(&mut self, color: &[f32; 4]) { + self.cmd_buffer.commands.push(C::SetBlendConstant(*color)); } unsafe fn draw( diff --git a/wgpu-hal/src/lib.rs b/wgpu-hal/src/lib.rs index 97ae478821..4c8f434944 100644 --- a/wgpu-hal/src/lib.rs +++ b/wgpu-hal/src/lib.rs @@ -437,7 +437,7 @@ pub trait CommandEncoder: Send + Sync { unsafe fn set_viewport(&mut self, rect: &Rect, depth_range: Range); unsafe fn set_scissor_rect(&mut self, rect: &Rect); unsafe fn set_stencil_reference(&mut self, value: u32); - unsafe fn set_blend_constants(&mut self, color: &wgt::Color); + unsafe fn set_blend_constants(&mut self, color: &[f32; 4]); unsafe fn draw( &mut self, diff --git a/wgpu-hal/src/metal/command.rs b/wgpu-hal/src/metal/command.rs index e395f9320c..5fb648e151 100644 --- a/wgpu-hal/src/metal/command.rs +++ b/wgpu-hal/src/metal/command.rs @@ -673,14 +673,9 @@ impl crate::CommandEncoder for super::CommandEncoder { let encoder = self.state.render.as_ref().unwrap(); encoder.set_stencil_front_back_reference_value(value, value); } - unsafe fn set_blend_constants(&mut self, color: &wgt::Color) { + unsafe fn set_blend_constants(&mut self, color: &[f32; 4]) { let encoder = self.state.render.as_ref().unwrap(); - encoder.set_blend_color( - color.r as f32, - color.g as f32, - color.b as f32, - color.a as f32, - ); + encoder.set_blend_color(color[0], color[1], color[2], color[3]); } unsafe fn draw( diff --git a/wgpu-hal/src/vulkan/command.rs b/wgpu-hal/src/vulkan/command.rs index fded155bd2..d87a7361e1 100644 --- a/wgpu-hal/src/vulkan/command.rs +++ b/wgpu-hal/src/vulkan/command.rs @@ -568,16 +568,8 @@ impl crate::CommandEncoder for super::CommandEncoder { .raw .cmd_set_stencil_reference(self.active, vk::StencilFaceFlags::all(), value); } - unsafe fn set_blend_constants(&mut self, color: &wgt::Color) { - let vk_constants = [ - color.r as f32, - color.g as f32, - color.b as f32, - color.a as f32, - ]; - self.device - .raw - .cmd_set_blend_constants(self.active, &vk_constants); + unsafe fn set_blend_constants(&mut self, color: &[f32; 4]) { + self.device.raw.cmd_set_blend_constants(self.active, color); } unsafe fn draw(