1
0
Fork 0
forked from wry/wry

video: unify output rendering

This commit is contained in:
Julian Orth 2024-02-16 18:27:51 +01:00
parent 82b3650e67
commit 0ba8648844
3 changed files with 34 additions and 25 deletions

View file

@ -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 _);

View file

@ -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 {

View file

@ -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<dyn GfxFramebuffer>,
tex: &Rc<dyn GfxTexture>,
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);
}
}