aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-05-03 10:25:51 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-05-03 10:33:31 +0400
commit1a8d6b1f1df80009795ed23e9ce0298fac65d766 (patch)
treeeec3d15d9a69f81722077ca1390b8d026429543f /src
parent185f294200b8e20d85dab828fa95265330762594 (diff)
downloadniri-1a8d6b1f1df80009795ed23e9ce0298fac65d766.tar.gz
niri-1a8d6b1f1df80009795ed23e9ce0298fac65d766.tar.bz2
niri-1a8d6b1f1df80009795ed23e9ce0298fac65d766.zip
Add a semi-working debug-toggle-damage binding
Diffstat (limited to 'src')
-rw-r--r--src/backend/tty.rs9
-rw-r--r--src/backend/winit.rs9
-rw-r--r--src/input.rs3
-rw-r--r--src/niri.rs19
-rw-r--r--src/render_helpers/debug.rs23
5 files changed, 61 insertions, 2 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index 3eb75a87..abcc93d3 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -58,6 +58,7 @@ use wayland_protocols::wp::presentation_time::server::wp_presentation_feedback;
use super::{IpcOutputMap, RenderResult};
use crate::frame_clock::FrameClock;
use crate::niri::{Niri, RedrawState, State};
+use crate::render_helpers::debug::draw_damage;
use crate::render_helpers::renderer::AsGlesRenderer;
use crate::render_helpers::{resources, shaders, RenderTarget};
use crate::utils::{get_monotonic_time, logical_output};
@@ -1243,9 +1244,15 @@ impl Tty {
};
// Render the elements.
- let elements =
+ let mut elements =
niri.render::<TtyRenderer>(&mut renderer, output, true, RenderTarget::Output);
+ // Visualize the damage, if enabled.
+ if niri.debug_draw_damage {
+ let output_state = niri.output_state.get_mut(output).unwrap();
+ draw_damage(&mut output_state.debug_damage_tracker, &mut elements);
+ }
+
// Hand them over to the DRM.
let drm_compositor = &mut surface.compositor;
match drm_compositor.render_frame::<_, _>(&mut renderer, &elements, [0.; 4]) {
diff --git a/src/backend/winit.rs b/src/backend/winit.rs
index 1d1dbc8a..f61c1c9f 100644
--- a/src/backend/winit.rs
+++ b/src/backend/winit.rs
@@ -19,6 +19,7 @@ use smithay::reexports::winit::window::WindowBuilder;
use super::{IpcOutputMap, RenderResult};
use crate::niri::{Niri, RedrawState, State};
+use crate::render_helpers::debug::draw_damage;
use crate::render_helpers::{resources, shaders, RenderTarget};
use crate::utils::{get_monotonic_time, logical_output};
@@ -159,13 +160,19 @@ impl Winit {
let _span = tracy_client::span!("Winit::render");
// Render the elements.
- let elements = niri.render::<GlesRenderer>(
+ let mut elements = niri.render::<GlesRenderer>(
self.backend.renderer(),
output,
true,
RenderTarget::Output,
);
+ // Visualize the damage, if enabled.
+ if niri.debug_draw_damage {
+ let output_state = niri.output_state.get_mut(output).unwrap();
+ draw_damage(&mut output_state.debug_damage_tracker, &mut elements);
+ }
+
// Hand them over to winit.
self.backend.bind().unwrap();
let age = self.backend.buffer_age().unwrap();
diff --git a/src/input.rs b/src/input.rs
index d9b902a8..63a22450 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -372,6 +372,9 @@ impl State {
self.niri.debug_draw_opaque_regions = !self.niri.debug_draw_opaque_regions;
self.niri.queue_redraw_all();
}
+ Action::DebugToggleDamage => {
+ self.niri.debug_toggle_damage();
+ }
Action::Spawn(command) => {
spawn(command);
}
diff --git a/src/niri.rs b/src/niri.rs
index 79808ac4..f3f5396a 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -13,6 +13,7 @@ use anyhow::{ensure, Context};
use calloop::futures::Scheduler;
use niri_config::{Config, Key, Modifiers, PreviewRender, TrackLayout};
use smithay::backend::allocator::Fourcc;
+use smithay::backend::renderer::damage::OutputDamageTracker;
use smithay::backend::renderer::element::memory::MemoryRenderBufferRenderElement;
use smithay::backend::renderer::element::solid::{SolidColorBuffer, SolidColorRenderElement};
use smithay::backend::renderer::element::surface::{
@@ -238,6 +239,7 @@ pub struct Niri {
pub exit_confirm_dialog: Option<ExitConfirmDialog>,
pub debug_draw_opaque_regions: bool,
+ pub debug_draw_damage: bool,
#[cfg(feature = "dbus")]
pub dbus: Option<crate::dbus::DBusServers>,
@@ -287,6 +289,8 @@ pub struct OutputState {
pub lock_render_state: LockRenderState,
pub lock_surface: Option<LockSurface>,
pub lock_color_buffer: SolidColorBuffer,
+ /// Damage tracker used for the debug damage visualization.
+ pub debug_damage_tracker: OutputDamageTracker,
}
#[derive(Default)]
@@ -1426,6 +1430,7 @@ impl Niri {
exit_confirm_dialog,
debug_draw_opaque_regions: false,
+ debug_draw_damage: false,
#[cfg(feature = "dbus")]
dbus: None,
@@ -1630,6 +1635,7 @@ impl Niri {
lock_render_state,
lock_surface: None,
lock_color_buffer: SolidColorBuffer::new(size, CLEAR_COLOR_LOCKED),
+ debug_damage_tracker: OutputDamageTracker::from_output(&output),
};
let rv = self.output_state.insert(output.clone(), state);
assert!(rv.is_none(), "output was already tracked");
@@ -2477,6 +2483,7 @@ impl Niri {
if self.debug_draw_opaque_regions {
draw_opaque_regions(&mut elements, output_scale);
}
+
elements
}
@@ -3188,6 +3195,18 @@ impl Niri {
}
}
+ pub fn debug_toggle_damage(&mut self) {
+ self.debug_draw_damage = !self.debug_draw_damage;
+
+ if self.debug_draw_damage {
+ for (output, state) in &mut self.output_state {
+ state.debug_damage_tracker = OutputDamageTracker::from_output(output);
+ }
+ }
+
+ self.queue_redraw_all();
+ }
+
pub fn open_screenshot_ui(&mut self, renderer: &mut GlesRenderer) {
if self.is_locked() || self.screenshot_ui.is_open() {
return;
diff --git a/src/render_helpers/debug.rs b/src/render_helpers/debug.rs
index f67abdb3..2a4c4332 100644
--- a/src/render_helpers/debug.rs
+++ b/src/render_helpers/debug.rs
@@ -1,3 +1,4 @@
+use smithay::backend::renderer::damage::OutputDamageTracker;
use smithay::backend::renderer::element::solid::SolidColorRenderElement;
use smithay::backend::renderer::element::{Element, Id, Kind};
use smithay::backend::renderer::utils::CommitCounter;
@@ -56,3 +57,25 @@ pub fn draw_opaque_regions<R: NiriRenderer>(
}
}
}
+
+pub fn draw_damage<R: NiriRenderer>(
+ damage_tracker: &mut OutputDamageTracker,
+ elements: &mut Vec<OutputRenderElements<R>>,
+) {
+ let _span = tracy_client::span!("draw_damage");
+
+ let Ok((Some(damage), _)) = damage_tracker.damage_output(1, elements) else {
+ return;
+ };
+
+ for rect in damage {
+ let color = SolidColorRenderElement::new(
+ Id::new(),
+ *rect,
+ CommitCounter::default(),
+ [0.3, 0., 0., 0.3],
+ Kind::Unspecified,
+ );
+ elements.insert(0, OutputRenderElements::SolidColor(color));
+ }
+}