aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-05-02 17:52:06 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-05-02 17:52:06 +0400
commitc6d64dae7aae12379d25b2e90630d19aeef5444b (patch)
tree2df6f7ad0d298838f0549ff54746f22837de3304
parent5dddc850fcae23289d40623b6c060b88233bf57f (diff)
downloadniri-c6d64dae7aae12379d25b2e90630d19aeef5444b.tar.gz
niri-c6d64dae7aae12379d25b2e90630d19aeef5444b.tar.bz2
niri-c6d64dae7aae12379d25b2e90630d19aeef5444b.zip
Add debug-toggle-opaque-regions
-rw-r--r--niri-config/src/lib.rs2
-rw-r--r--niri-ipc/src/lib.rs2
-rw-r--r--src/input.rs4
-rw-r--r--src/niri.rs14
-rw-r--r--src/render_helpers/debug.rs58
-rw-r--r--src/render_helpers/mod.rs1
6 files changed, 81 insertions, 0 deletions
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<String>),
#[knuffel(skip)]
ConfirmScreenshot,
@@ -982,6 +983,7 @@ impl From<niri_ipc::Action> 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<ExitConfirmDialog>,
+ pub debug_draw_opaque_regions: bool,
+
#[cfg(feature = "dbus")]
pub dbus: Option<crate::dbus::DBusServers>,
#[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<R: NiriRenderer>(
+ elements: &mut Vec<OutputRenderElements<R>>,
+ scale: Scale<f64>,
+) {
+ 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;