Skip to content

Commit 1b2bd7d

Browse files
committed
Remove old rendering in favor of push rendering
1 parent f9eb2df commit 1b2bd7d

File tree

25 files changed

+188
-2064
lines changed

25 files changed

+188
-2064
lines changed

niri-visual-tests/src/cases/gradient_area.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,8 @@ impl TestCase for GradientArea {
8989
1.,
9090
1.,
9191
);
92-
rv.extend(
93-
self.border
94-
.render(renderer, g_loc)
95-
.map(|elem| Box::new(elem) as _),
96-
);
92+
self.border
93+
.render(renderer, g_loc, &mut |elem| rv.push(Box::new(elem) as _));
9794

9895
rv.extend(
9996
[BorderRenderElement::new(

niri-visual-tests/src/cases/layout.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,14 @@ impl TestCase for Layout {
268268
_size: Size<i32, Physical>,
269269
) -> Vec<Box<dyn RenderElement<GlesRenderer>>> {
270270
self.layout.update_render_elements(Some(&self.output));
271+
272+
let mut rv = Vec::new();
271273
self.layout
272274
.monitor_for_output(&self.output)
273275
.unwrap()
274-
.render_elements(renderer, RenderTarget::Output, true)
275-
.flat_map(|(_, _, iter)| iter)
276-
.map(|elem| Box::new(elem) as _)
277-
.collect()
276+
.render_workspaces(renderer, RenderTarget::Output, true, &mut |elem| {
277+
rv.push(Box::new(elem) as _)
278+
});
279+
rv
278280
}
279281
}

niri-visual-tests/src/cases/tile.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,15 @@ impl TestCase for Tile {
119119
true,
120120
Rectangle::new(Point::from((-location.x, -location.y)), size.to_logical(1.)),
121121
);
122-
self.tile
123-
.render(renderer, location, true, RenderTarget::Output)
124-
.map(|elem| Box::new(elem) as _)
125-
.collect()
122+
123+
let mut rv = Vec::new();
124+
self.tile.render(
125+
renderer,
126+
location,
127+
true,
128+
RenderTarget::Output,
129+
&mut |elem| rv.push(Box::new(elem) as _),
130+
);
131+
rv
126132
}
127133
}

niri-visual-tests/src/cases/window.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,15 @@ impl TestCase for Window {
5252
.to_f64()
5353
.downscale(2.);
5454

55-
self.window
56-
.render(
57-
renderer,
58-
location,
59-
Scale::from(1.),
60-
1.,
61-
RenderTarget::Output,
62-
)
63-
.into_iter()
64-
.map(|elem| Box::new(elem) as _)
65-
.collect()
55+
let mut rv = Vec::new();
56+
self.window.render_normal(
57+
renderer,
58+
location,
59+
Scale::from(1.),
60+
1.,
61+
RenderTarget::Output,
62+
&mut |elem| rv.push(Box::new(elem) as _),
63+
);
64+
rv
6665
}
6766
}

niri-visual-tests/src/test_window.rs

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use niri::layout::{
99
use niri::render_helpers::offscreen::OffscreenData;
1010
use niri::render_helpers::renderer::NiriRenderer;
1111
use niri::render_helpers::solid_color::{SolidColorBuffer, SolidColorRenderElement};
12-
use niri::render_helpers::{RenderTarget, SplitElements};
12+
use niri::render_helpers::RenderTarget;
1313
use niri::utils::transaction::Transaction;
1414
use niri::window::ResolvedWindowRules;
1515
use smithay::backend::renderer::element::Kind;
@@ -149,36 +149,30 @@ impl LayoutElement for TestWindow {
149149
false
150150
}
151151

152-
fn render<R: NiriRenderer>(
152+
fn render_normal<R: NiriRenderer>(
153153
&self,
154154
_renderer: &mut R,
155155
location: Point<f64, Logical>,
156156
_scale: Scale<f64>,
157157
alpha: f32,
158158
_target: RenderTarget,
159-
) -> SplitElements<LayoutElementRenderElement<R>> {
159+
push: &mut dyn FnMut(LayoutElementRenderElement<R>),
160+
) {
160161
let inner = self.inner.borrow();
161162

162-
SplitElements {
163-
normal: vec![
164-
SolidColorRenderElement::from_buffer(
165-
&inner.buffer,
166-
location,
167-
alpha,
168-
Kind::Unspecified,
169-
)
170-
.into(),
171-
SolidColorRenderElement::from_buffer(
172-
&inner.csd_shadow_buffer,
173-
location
174-
- Point::from((inner.csd_shadow_width, inner.csd_shadow_width)).to_f64(),
175-
alpha,
176-
Kind::Unspecified,
177-
)
163+
push(
164+
SolidColorRenderElement::from_buffer(&inner.buffer, location, alpha, Kind::Unspecified)
178165
.into(),
179-
],
180-
popups: vec![],
181-
}
166+
);
167+
push(
168+
SolidColorRenderElement::from_buffer(
169+
&inner.csd_shadow_buffer,
170+
location - Point::from((inner.csd_shadow_width, inner.csd_shadow_width)).to_f64(),
171+
alpha,
172+
Kind::Unspecified,
173+
)
174+
.into(),
175+
);
182176
}
183177

184178
fn request_size(

src/input/mod.rs

Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::any::Any;
22
use std::cmp::min;
33
use std::collections::hash_map::Entry;
44
use std::collections::HashSet;
5-
use std::time::{Duration, Instant};
5+
use std::time::Duration;
66

77
use calloop::timer::{TimeoutAction, Timer};
88
use input::event::gesture::GestureEventCoordinates as _;
@@ -1636,56 +1636,6 @@ impl State {
16361636
self.niri.layout.center_visible_columns();
16371637
// FIXME: granular
16381638
self.niri.queue_redraw_all();
1639-
1640-
let output = self.niri.layout.active_output().unwrap();
1641-
let output = output.clone();
1642-
self.niri.update_render_elements(Some(&output));
1643-
1644-
self.backend.with_primary_renderer(|renderer| {
1645-
// let mon = self.niri.layout.monitor_for_output(output).unwrap();
1646-
1647-
let N = 5000;
1648-
let mut total = 0;
1649-
let mut total_len = 0;
1650-
let start = Instant::now();
1651-
for _ in 0..N {
1652-
let _span = tracy_client::span!("prev render");
1653-
let elements = self.niri.render_prev(
1654-
renderer,
1655-
&output,
1656-
true,
1657-
crate::render_helpers::RenderTarget::Output,
1658-
);
1659-
total += elements.capacity();
1660-
total_len += elements.len();
1661-
}
1662-
let elapsed = start.elapsed();
1663-
warn!(
1664-
"prev capacity: {total}, len: {total_len}, mean time: {:.3} ms",
1665-
elapsed.as_secs_f64() / N as f64 * 1000.
1666-
);
1667-
1668-
total = 0;
1669-
total_len = 0;
1670-
let start = Instant::now();
1671-
for _ in 0..N {
1672-
let _span = tracy_client::span!("new render");
1673-
let elements = self.niri.render(
1674-
renderer,
1675-
&output,
1676-
true,
1677-
crate::render_helpers::RenderTarget::Output,
1678-
);
1679-
total += elements.capacity();
1680-
total_len += elements.len();
1681-
}
1682-
let elapsed = start.elapsed();
1683-
1684-
warn!(
1685-
" new capacity: {total}, len: {total_len}, mean time: {:.3} ms",
1686-
elapsed.as_secs_f64() / N as f64 * 1000.
1687-
);
1688-
});
16891639
}
16901640
Action::MaximizeColumn => {
16911641
self.niri.layout.toggle_full_width();

src/layer/mapped.rs

Lines changed: 5 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use niri_config::utils::MergeWith as _;
22
use niri_config::{Config, LayerRule};
3-
use smithay::backend::renderer::element::surface::{
4-
render_elements_from_surface_tree, WaylandSurfaceRenderElement,
5-
};
3+
use smithay::backend::renderer::element::surface::WaylandSurfaceRenderElement;
64
use smithay::backend::renderer::element::Kind;
75
use smithay::desktop::{LayerSurface, PopupManager};
86
use smithay::utils::{Logical, Point, Scale, Size};
@@ -16,7 +14,7 @@ use crate::render_helpers::renderer::NiriRenderer;
1614
use crate::render_helpers::shadow::ShadowRenderElement;
1715
use crate::render_helpers::solid_color::{SolidColorBuffer, SolidColorRenderElement};
1816
use crate::render_helpers::surface::push_elements_from_surface_tree;
19-
use crate::render_helpers::{RenderTarget, SplitElements};
17+
use crate::render_helpers::RenderTarget;
2018
use crate::utils::{baba_is_float_offset, round_logical_in_physical};
2119

2220
#[derive(Debug)]
@@ -157,67 +155,7 @@ impl MappedLayer {
157155
Point::from((0., y))
158156
}
159157

160-
pub fn render<R: NiriRenderer>(
161-
&self,
162-
renderer: &mut R,
163-
location: Point<f64, Logical>,
164-
target: RenderTarget,
165-
) -> SplitElements<LayerSurfaceRenderElement<R>> {
166-
let mut rv = SplitElements::default();
167-
168-
let scale = Scale::from(self.scale);
169-
let alpha = self.rules.opacity.unwrap_or(1.).clamp(0., 1.);
170-
let location = location + self.bob_offset();
171-
172-
if target.should_block_out(self.rules.block_out_from) {
173-
// Round to physical pixels.
174-
let location = location.to_physical_precise_round(scale).to_logical(scale);
175-
176-
// FIXME: take geometry-corner-radius into account.
177-
let elem = SolidColorRenderElement::from_buffer(
178-
&self.block_out_buffer,
179-
location,
180-
alpha,
181-
Kind::Unspecified,
182-
);
183-
rv.normal.push(elem.into());
184-
} else {
185-
// Layer surfaces don't have extra geometry like windows.
186-
let buf_pos = location;
187-
188-
let surface = self.surface.wl_surface();
189-
for (popup, popup_offset) in PopupManager::popups_for_surface(surface) {
190-
// Layer surfaces don't have extra geometry like windows.
191-
let offset = popup_offset - popup.geometry().loc;
192-
193-
rv.popups.extend(render_elements_from_surface_tree(
194-
renderer,
195-
popup.wl_surface(),
196-
(buf_pos + offset.to_f64()).to_physical_precise_round(scale),
197-
scale,
198-
alpha,
199-
Kind::ScanoutCandidate,
200-
));
201-
}
202-
203-
rv.normal = render_elements_from_surface_tree(
204-
renderer,
205-
surface,
206-
buf_pos.to_physical_precise_round(scale),
207-
scale,
208-
alpha,
209-
Kind::ScanoutCandidate,
210-
);
211-
}
212-
213-
let location = location.to_physical_precise_round(scale).to_logical(scale);
214-
rv.normal
215-
.extend(self.shadow.render(renderer, location).map(Into::into));
216-
217-
rv
218-
}
219-
220-
pub fn render_push_normal<R: NiriRenderer>(
158+
pub fn render_normal<R: NiriRenderer>(
221159
&self,
222160
renderer: &mut R,
223161
location: Point<f64, Logical>,
@@ -258,10 +196,10 @@ impl MappedLayer {
258196

259197
let location = location.to_physical_precise_round(scale).to_logical(scale);
260198
self.shadow
261-
.render_push(renderer, location, &mut |elem| push(elem.into()));
199+
.render(renderer, location, &mut |elem| push(elem.into()));
262200
}
263201

264-
pub fn render_push_popups<R: NiriRenderer>(
202+
pub fn render_popups<R: NiriRenderer>(
265203
&self,
266204
renderer: &mut R,
267205
location: Point<f64, Logical>,

src/layout/floating.rs

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,40 +1053,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
10531053
true
10541054
}
10551055

1056-
pub fn render_elements<R: NiriRenderer>(
1057-
&self,
1058-
renderer: &mut R,
1059-
view_rect: Rectangle<f64, Logical>,
1060-
target: RenderTarget,
1061-
focus_ring: bool,
1062-
) -> Vec<FloatingSpaceRenderElement<R>> {
1063-
let mut rv = Vec::new();
1064-
1065-
let scale = Scale::from(self.scale);
1066-
1067-
// Draw the closing windows on top of the other windows.
1068-
//
1069-
// FIXME: I guess this should rather preserve the stacking order when the window is closed.
1070-
for closing in self.closing_windows.iter().rev() {
1071-
let elem = closing.render(renderer.as_gles_renderer(), view_rect, scale, target);
1072-
rv.push(elem.into());
1073-
}
1074-
1075-
let active = self.active_window_id.clone();
1076-
for (tile, tile_pos) in self.tiles_with_render_positions() {
1077-
// For the active tile, draw the focus ring.
1078-
let focus_ring = focus_ring && Some(tile.window().id()) == active.as_ref();
1079-
1080-
rv.extend(
1081-
tile.render(renderer, tile_pos, focus_ring, target)
1082-
.map(Into::into),
1083-
);
1084-
}
1085-
1086-
rv
1087-
}
1088-
1089-
pub fn render_push<R: NiriRenderer>(
1056+
pub fn render<R: NiriRenderer>(
10901057
&self,
10911058
renderer: &mut R,
10921059
view_rect: Rectangle<f64, Logical>,
@@ -1109,7 +1076,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
11091076
// For the active tile, draw the focus ring.
11101077
let focus_ring = focus_ring && Some(tile.window().id()) == active.as_ref();
11111078

1112-
tile.render_push(renderer, tile_pos, focus_ring, target, &mut |elem| {
1079+
tile.render(renderer, tile_pos, focus_ring, target, &mut |elem| {
11131080
push(elem.into())
11141081
});
11151082
}

0 commit comments

Comments
 (0)