aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/headless.rs32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/backend/headless.rs b/src/backend/headless.rs
index e961daa2..51381168 100644
--- a/src/backend/headless.rs
+++ b/src/backend/headless.rs
@@ -1,13 +1,16 @@
//! Headless backend for tests.
//!
//! This can eventually grow into a more complete backend if needed, but for now it's missing some
-//! crucial parts like rendering.
+//! crucial parts like dmabufs.
use std::mem;
use std::sync::{Arc, Mutex};
+use anyhow::Context as _;
use niri_config::OutputName;
use smithay::backend::allocator::dmabuf::Dmabuf;
+use smithay::backend::egl::native::EGLSurfacelessDisplay;
+use smithay::backend::egl::{EGLContext, EGLDisplay};
use smithay::backend::renderer::element::RenderElementStates;
use smithay::backend::renderer::gles::GlesRenderer;
use smithay::output::{Mode, Output, PhysicalProperties, Subpixel};
@@ -17,21 +20,44 @@ use smithay::wayland::presentation::Refresh;
use super::{IpcOutputMap, OutputId, RenderResult};
use crate::niri::{Niri, RedrawState};
+use crate::render_helpers::{resources, shaders};
use crate::utils::{get_monotonic_time, logical_output};
pub struct Headless {
+ renderer: Option<GlesRenderer>,
ipc_outputs: Arc<Mutex<IpcOutputMap>>,
}
impl Headless {
pub fn new() -> Self {
Self {
+ renderer: None,
ipc_outputs: Default::default(),
}
}
pub fn init(&mut self, _niri: &mut Niri) {}
+ pub fn add_renderer(&mut self) -> anyhow::Result<()> {
+ if self.renderer.is_some() {
+ error!("add_renderer: renderer must not already exist");
+ return Ok(());
+ }
+
+ let mut renderer = unsafe {
+ let display =
+ EGLDisplay::new(EGLSurfacelessDisplay).context("error creating EGL display")?;
+ let context = EGLContext::new(&display).context("error creating EGL context")?;
+ GlesRenderer::new(context).context("error creating renderer")?
+ };
+
+ resources::init(&mut renderer);
+ shaders::init(&mut renderer);
+
+ self.renderer = Some(renderer);
+ Ok(())
+ }
+
pub fn add_output(&mut self, niri: &mut Niri, n: u8, size: (u16, u16)) {
let connector = format!("headless-{n}");
let make = "niri".to_string();
@@ -94,9 +120,9 @@ impl Headless {
pub fn with_primary_renderer<T>(
&mut self,
- _f: impl FnOnce(&mut GlesRenderer) -> T,
+ f: impl FnOnce(&mut GlesRenderer) -> T,
) -> Option<T> {
- None
+ self.renderer.as_mut().map(f)
}
pub fn render(&mut self, niri: &mut Niri, output: &Output) -> RenderResult {