Make debug_draw_opaque_regions work in screencasts again

This commit is contained in:
Ivan Molodetskikh
2026-01-26 06:17:40 +03:00
parent 5ddcf195dd
commit a34ed51586
2 changed files with 42 additions and 48 deletions
+10 -7
View File
@@ -148,7 +148,7 @@ use crate::protocols::mutter_x11_interop::MutterX11InteropManagerState;
use crate::protocols::output_management::OutputManagementManagerState;
use crate::protocols::screencopy::{Screencopy, ScreencopyBuffer, ScreencopyManagerState};
use crate::protocols::virtual_pointer::VirtualPointerManagerState;
use crate::render_helpers::debug::draw_opaque_regions;
use crate::render_helpers::debug::push_opaque_regions;
use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement;
use crate::render_helpers::renderer::NiriRenderer;
use crate::render_helpers::solid_color::{SolidColorBuffer, SolidColorRenderElement};
@@ -4036,12 +4036,6 @@ impl Niri {
self.render_inner(renderer, output, include_pointer, target, &mut |elem| {
elements.push(elem)
});
if self.debug_draw_opaque_regions {
let output_scale = Scale::from(output.current_scale().fractional_scale());
draw_opaque_regions(&mut elements, output_scale);
}
elements
}
@@ -4066,6 +4060,15 @@ impl Niri {
let output_scale = Scale::from(output.current_scale().fractional_scale());
let push = if self.debug_draw_opaque_regions {
&mut move |elem| {
push_opaque_regions(&elem, output_scale, push);
push(elem);
}
} else {
push
};
// The pointer goes on the top.
if include_pointer && self.pointer_visibility.is_visible() {
self.render_pointer(renderer, output, &mut |elem| push(elem.into()));
+32 -41
View File
@@ -8,54 +8,45 @@ use super::renderer::NiriRenderer;
use super::solid_color::SolidColorRenderElement;
use crate::niri::OutputRenderElements;
pub fn draw_opaque_regions<R: NiriRenderer>(
elements: &mut Vec<OutputRenderElements<R>>,
pub fn push_opaque_regions<R: NiriRenderer>(
elem: &OutputRenderElements<R>,
scale: Scale<f64>,
push: &mut dyn FnMut(OutputRenderElements<R>),
) {
let _span = tracy_client::span!("draw_opaque_regions");
// HACK
if format!("{elem:?}").contains("ExtraDamage") {
return;
}
let mut i = 0;
while i < elements.len() {
let elem = &elements[i];
i += 1;
let geo = elem.geometry(scale);
let mut opaque = elem.opaque_regions(scale).to_vec();
// HACK
if format!("{elem:?}").contains("ExtraDamage") {
continue;
}
for rect in &mut opaque {
rect.loc += geo.loc;
}
let geo = elem.geometry(scale);
let mut opaque = elem.opaque_regions(scale).to_vec();
let semitransparent = geo.subtract_rects(opaque.iter().copied());
for rect in &mut opaque {
rect.loc += geo.loc;
}
for rect in opaque {
let color = SolidColorRenderElement::new(
Id::new(),
rect.to_f64().to_logical(scale),
CommitCounter::default(),
Color32F::from([0., 0., 0.2, 0.2]),
Kind::Unspecified,
);
push(color.into());
}
let semitransparent = geo.subtract_rects(opaque.iter().copied());
for rect in opaque {
let color = SolidColorRenderElement::new(
Id::new(),
rect.to_f64().to_logical(scale),
CommitCounter::default(),
Color32F::from([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.to_f64().to_logical(scale),
CommitCounter::default(),
Color32F::from([0.3, 0., 0., 0.3]),
Kind::Unspecified,
);
elements.insert(i - 1, OutputRenderElements::SolidColor(color));
i += 1;
}
for rect in semitransparent {
let color = SolidColorRenderElement::new(
Id::new(),
rect.to_f64().to_logical(scale),
CommitCounter::default(),
Color32F::from([0.3, 0., 0., 0.3]),
Kind::Unspecified,
);
push(color.into());
}
}