From 0ba8648844b975177de2d416aa4c114fa913cb43 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 16 Feb 2024 18:27:51 +0100 Subject: [PATCH] video: unify output rendering --- src/backends/metal/video.rs | 16 +++++----------- src/backends/x.rs | 17 ++++------------- src/state.rs | 26 +++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index 5b977135..03f15e06 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -380,22 +380,16 @@ impl MetalConnector { if let Some(node) = self.state.root.outputs.get(&self.connector_id) { let mut rr = self.render_result.borrow_mut(); let render_fb = buffer.render_fb(); - render_fb.render_node( - &*node, - &self.state, - Some(node.global.pos.get()), - Some(&mut rr), - node.preferred_scale.get(), + self.state.present_output( + &node, + &render_fb, + &buffer.render_tex, + &mut rr, !self.cursor_enabled.get(), ); if let Some(tex) = &buffer.dev_tex { buffer.dev_fb.copy_texture(tex, 0, 0); } - for fr in rr.frame_requests.drain(..) { - fr.send_done(); - let _ = fr.client.remove_obj(&*fr); - } - node.perform_screencopies(&*render_fb, &buffer.render_tex); } changes.change_object(plane.id, |c| { c.change(plane.fb_id, buffer.drm.id().0 as _); diff --git a/src/backends/x.rs b/src/backends/x.rs index 7a5812df..5af0103d 100644 --- a/src/backends/x.rs +++ b/src/backends/x.rs @@ -57,7 +57,6 @@ use { collections::VecDeque, error::Error, future::pending, - ops::DerefMut, rc::Rc, }, thiserror::Error, @@ -733,21 +732,13 @@ impl XBackend { image.last_serial.set(serial); if let Some(node) = self.state.root.outputs.get(&output.id) { - let mut rr = self.render_result.borrow_mut(); - let fb = image.fb.get(); - fb.render_node( + self.state.present_output( &*node, - &self.state, - Some(node.global.pos.get()), - Some(rr.deref_mut()), - node.preferred_scale.get(), + &image.fb.get(), + &image.tex.get(), + &mut self.render_result.borrow_mut(), true, ); - for fr in rr.frame_requests.drain(..) { - fr.send_done(); - let _ = fr.client.remove_obj(&*fr); - } - node.perform_screencopies(&*fb, &image.tex.get()); } let pp = PresentPixmap { diff --git a/src/state.rs b/src/state.rs index e2c466c0..8ee7eda0 100644 --- a/src/state.rs +++ b/src/state.rs @@ -14,7 +14,7 @@ use { dbus::Dbus, drm_feedback::DrmFeedback, forker::ForkerProxy, - gfx_api::{GfxContext, GfxError}, + gfx_api::{GfxContext, GfxError, GfxFramebuffer, GfxTexture}, gfx_apis::create_gfx_context, globals::{Globals, GlobalsError, WaylandGlobal}, ifs::{ @@ -36,6 +36,7 @@ use { leaks::Tracker, logger::Logger, rect::Rect, + renderer::RenderResult, scale::Scale, theme::Theme, tree::{ @@ -730,4 +731,27 @@ impl State { f(tester); } } + + pub fn present_output( + &self, + output: &OutputNode, + fb: &Rc, + tex: &Rc, + rr: &mut RenderResult, + render_hw_cursor: bool, + ) { + fb.render_node( + &*output, + self, + Some(output.global.pos.get()), + Some(rr), + output.preferred_scale.get(), + render_hw_cursor, + ); + for fr in rr.frame_requests.drain(..) { + fr.send_done(); + let _ = fr.client.remove_obj(&*fr); + } + output.perform_screencopies(&**fb, tex); + } }