diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index d7077bcb..83831bb6 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -441,12 +441,8 @@ impl Device { .insert_source(timer, |(dev_id, crtc), _, state| { let backend = state.backend.kms(); if let Some(device) = backend.devices.get_mut(&dev_id) { - let mut renderer = backend - .api - .renderer(&backend.primary, &device.render_node) - .unwrap(); if let Some(surface) = device.surfaces.get_mut(&crtc) { - if let Err(err) = surface.render_output(&mut renderer, &mut state.common) { + if let Err(err) = surface.render_output(&mut backend.api, &backend.primary, &device.render_node, &mut state.common) { slog_scope::error!("Error rendering: {}", err); // TODO re-schedule? } @@ -478,9 +474,15 @@ impl Device { impl Surface { pub fn render_output( &mut self, - renderer: &mut render::GlMultiRenderer<'_>, + api: &mut GpuManager, + render_node: &DrmNode, + target_node: &DrmNode, state: &mut Common, ) -> Result<()> { + let mut renderer = api + .renderer(render_node, target_node) + .unwrap(); + let (buffer, age) = self .surface .next_buffer() @@ -491,7 +493,8 @@ impl Surface { .with_context(|| "Failed to bind buffer")?; match render::render_output( - renderer, + Some(&render_node), + &mut renderer, age, state, &self.output, diff --git a/src/backend/render/mod.rs b/src/backend/render/mod.rs index 3354d8bd..86aa66f9 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -9,10 +9,13 @@ use crate::{ use slog::Logger; use smithay::{ - backend::renderer::{ - gles2::{Gles2Renderbuffer, Gles2Renderer, Gles2Texture}, - multigpu::{egl::EglGlesBackend, Error as MultiError, MultiFrame, MultiRenderer}, - ImportAll, Renderer, + backend::{ + drm::DrmNode, + renderer::{ + gles2::{Gles2Renderbuffer, Gles2Renderer, Gles2Texture}, + multigpu::{egl::EglGlesBackend, Error as MultiError, MultiFrame, MultiRenderer}, + ImportAll, Renderer, + }, }, desktop::space::{RenderElement, RenderError, SpaceOutputTuple, SurfaceTree}, utils::{Logical, Point, Rectangle}, @@ -94,6 +97,7 @@ impl AsGles2Renderer for GlMultiRenderer<'_> { } pub fn render_output( + _gpu: Option<&DrmNode>, renderer: &mut R, age: u8, state: &mut Common, @@ -122,7 +126,7 @@ where .unwrap_or(Rectangle::from_loc_and_size((0, 0), (0, 0))); let scale = space.output_scale(output).unwrap(); - let fps_overlay = fps_ui(state, fps, output_geo, scale); + let fps_overlay = fps_ui(_gpu, state, fps, output_geo, scale); custom_elements.push(fps_overlay.into()); let mut area = state.spaces.global_space(); diff --git a/src/backend/winit.rs b/src/backend/winit.rs index 7580821a..ade507db 100644 --- a/src/backend/winit.rs +++ b/src/backend/winit.rs @@ -45,6 +45,7 @@ impl WinitState { let age = backend.buffer_age().unwrap_or(0); match render::render_output( + None, backend.renderer(), age as u8, state, diff --git a/src/backend/x11.rs b/src/backend/x11.rs index db880e59..040a6d4f 100644 --- a/src/backend/x11.rs +++ b/src/backend/x11.rs @@ -163,6 +163,7 @@ impl Surface { .with_context(|| "Failed to bind buffer")?; match render::render_output( + None, renderer, age as u8, state, diff --git a/src/debug.rs b/src/debug.rs index f7ec4ccd..ac878f9e 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -1,10 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::state::{Common, Fps}; -use smithay::utils::{Logical, Rectangle}; +use smithay::{ + backend::drm::DrmNode, + utils::{Logical, Rectangle}, +}; pub use smithay_egui::EguiFrame; pub fn fps_ui( + gpu: Option<&DrmNode>, state: &Common, fps: &mut Fps, area: Rectangle, @@ -55,6 +59,9 @@ pub fn fps_ui( ui.set_max_width(label_res.rect.min.x + label_res.rect.width()); ui.separator(); + if let Some(gpu) = gpu { + ui.label(egui::RichText::new(format!("renderD{}", gpu.minor())).code()); + } ui.label(egui::RichText::new(format!("FPS: {:>7.3}", avg_fps)).heading()); ui.label("Frame Times:"); ui.label(egui::RichText::new(format!("avg: {:>7.6}", avg)).code());