From c6d64dae7aae12379d25b2e90630d19aeef5444b Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Thu, 2 May 2024 17:52:06 +0400 Subject: Add debug-toggle-opaque-regions --- niri-config/src/lib.rs | 2 ++ niri-ipc/src/lib.rs | 2 ++ src/input.rs | 4 ++++ src/niri.rs | 14 +++++++++++ src/render_helpers/debug.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++ src/render_helpers/mod.rs | 1 + 6 files changed, 81 insertions(+) create mode 100644 src/render_helpers/debug.rs diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index f4728e61..c72493ec 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -846,6 +846,7 @@ pub enum Action { Suspend, PowerOffMonitors, ToggleDebugTint, + DebugToggleOpaqueRegions, Spawn(#[knuffel(arguments)] Vec), #[knuffel(skip)] ConfirmScreenshot, @@ -982,6 +983,7 @@ impl From for Action { niri_ipc::Action::MoveWorkspaceToMonitorDown => Self::MoveWorkspaceToMonitorDown, niri_ipc::Action::MoveWorkspaceToMonitorUp => Self::MoveWorkspaceToMonitorUp, niri_ipc::Action::ToggleDebugTint => Self::ToggleDebugTint, + niri_ipc::Action::DebugToggleOpaqueRegions => Self::DebugToggleOpaqueRegions, } } } diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs index 26b89283..e3234e29 100644 --- a/niri-ipc/src/lib.rs +++ b/niri-ipc/src/lib.rs @@ -217,6 +217,8 @@ pub enum Action { MoveWorkspaceToMonitorUp, /// Toggle a debug tint on windows. ToggleDebugTint, + /// Toggle visualization of render element opaque regions. + DebugToggleOpaqueRegions, } /// Change in window or column size. diff --git a/src/input.rs b/src/input.rs index 49546faa..d9b902a8 100644 --- a/src/input.rs +++ b/src/input.rs @@ -368,6 +368,10 @@ impl State { self.backend.toggle_debug_tint(); self.niri.queue_redraw_all(); } + Action::DebugToggleOpaqueRegions => { + self.niri.debug_draw_opaque_regions = !self.niri.debug_draw_opaque_regions; + self.niri.queue_redraw_all(); + } Action::Spawn(command) => { spawn(command); } diff --git a/src/niri.rs b/src/niri.rs index 8e2807db..79808ac4 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -107,6 +107,7 @@ use crate::protocols::foreign_toplevel::{self, ForeignToplevelManagerState}; use crate::protocols::gamma_control::GammaControlManagerState; use crate::protocols::screencopy::{Screencopy, ScreencopyManagerState}; use crate::pw_utils::{Cast, PipeWire}; +use crate::render_helpers::debug::draw_opaque_regions; use crate::render_helpers::renderer::NiriRenderer; use crate::render_helpers::{ render_to_shm, render_to_texture, render_to_vec, shaders, RenderTarget, @@ -236,6 +237,8 @@ pub struct Niri { pub hotkey_overlay: HotkeyOverlay, pub exit_confirm_dialog: Option, + pub debug_draw_opaque_regions: bool, + #[cfg(feature = "dbus")] pub dbus: Option, #[cfg(feature = "dbus")] @@ -1422,6 +1425,8 @@ impl Niri { hotkey_overlay, exit_confirm_dialog, + debug_draw_opaque_regions: false, + #[cfg(feature = "dbus")] dbus: None, #[cfg(feature = "dbus")] @@ -2382,6 +2387,9 @@ impl Niri { .into(), ); + if self.debug_draw_opaque_regions { + draw_opaque_regions(&mut elements, output_scale); + } return elements; } @@ -2408,6 +2416,9 @@ impl Niri { // Add the background for outputs that were connected while the screenshot UI was open. elements.push(background); + if self.debug_draw_opaque_regions { + draw_opaque_regions(&mut elements, output_scale); + } return elements; } @@ -2463,6 +2474,9 @@ impl Niri { // Then the background. elements.push(background); + if self.debug_draw_opaque_regions { + draw_opaque_regions(&mut elements, output_scale); + } elements } diff --git a/src/render_helpers/debug.rs b/src/render_helpers/debug.rs new file mode 100644 index 00000000..f67abdb3 --- /dev/null +++ b/src/render_helpers/debug.rs @@ -0,0 +1,58 @@ +use smithay::backend::renderer::element::solid::SolidColorRenderElement; +use smithay::backend::renderer::element::{Element, Id, Kind}; +use smithay::backend::renderer::utils::CommitCounter; +use smithay::utils::Scale; + +use super::renderer::NiriRenderer; +use crate::niri::OutputRenderElements; + +pub fn draw_opaque_regions( + elements: &mut Vec>, + scale: Scale, +) { + let _span = tracy_client::span!("draw_opaque_regions"); + + let mut i = 0; + while i < elements.len() { + let elem = &elements[i]; + i += 1; + + // HACK + if format!("{elem:?}").contains("ExtraDamage") { + continue; + } + + let geo = elem.geometry(scale); + let mut opaque = elem.opaque_regions(scale); + + for rect in &mut opaque { + rect.loc += geo.loc; + } + + let semitransparent = geo.subtract_rects(opaque.iter().copied()); + + for rect in opaque { + let color = SolidColorRenderElement::new( + Id::new(), + rect, + CommitCounter::default(), + [0., 0., 0.2, 0.2], + Kind::Unspecified, + ); + elements.insert(i - 1, OutputRenderElements::SolidColor(color)); + i += 1; + } + + for rect in semitransparent { + let color = SolidColorRenderElement::new( + Id::new(), + rect, + CommitCounter::default(), + [0.3, 0., 0., 0.3], + Kind::Unspecified, + ); + elements.insert(i - 1, OutputRenderElements::SolidColor(color)); + i += 1; + } + } +} diff --git a/src/render_helpers/mod.rs b/src/render_helpers/mod.rs index b1f8fd03..c7a4025a 100644 --- a/src/render_helpers/mod.rs +++ b/src/render_helpers/mod.rs @@ -19,6 +19,7 @@ use self::primary_gpu_texture::PrimaryGpuTextureRenderElement; pub mod border; pub mod clipped_surface; pub mod damage; +pub mod debug; pub mod offscreen; pub mod primary_gpu_texture; pub mod render_elements; -- cgit