Disable Smithay use_system_lib to use Rust backend to wayland-rs

It seems this was needed for `renderer.bind_wl_display`. But only in the
X11 and winit backends. Unless there's some less obvious reason to use
the `use_system_lib` feature, it seems undesirable and avoidable.

This uses `WlDrmState` to provide `wl_drm` on those backends instead.
This commit is contained in:
Ian Douglas Scott 2024-05-14 12:42:44 -07:00 committed by Victoria Brekenfeld
parent 47f8c1da38
commit dfb3bea595
4 changed files with 49 additions and 55 deletions

6
Cargo.lock generated
View file

@ -1968,8 +1968,6 @@ dependencies = [
"drm-fourcc", "drm-fourcc",
"gbm-sys", "gbm-sys",
"libc", "libc",
"wayland-backend",
"wayland-server",
] ]
[[package]] [[package]]
@ -4595,13 +4593,11 @@ dependencies = [
"thiserror", "thiserror",
"tracing", "tracing",
"udev", "udev",
"wayland-backend",
"wayland-egl", "wayland-egl",
"wayland-protocols", "wayland-protocols",
"wayland-protocols-misc", "wayland-protocols-misc",
"wayland-protocols-wlr", "wayland-protocols-wlr",
"wayland-server", "wayland-server",
"wayland-sys",
"winit", "winit",
"x11rb", "x11rb",
"xkbcommon", "xkbcommon",
@ -5678,9 +5674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af"
dependencies = [ dependencies = [
"dlib", "dlib",
"libc",
"log", "log",
"memoffset 0.9.0",
"once_cell", "once_cell",
"pkg-config", "pkg-config",
] ]

View file

@ -76,7 +76,6 @@ features = [
"backend_vulkan", "backend_vulkan",
"backend_x11", "backend_x11",
"desktop", "desktop",
"use_system_lib",
"renderer_glow", "renderer_glow",
"renderer_multi", "renderer_multi",
"renderer_pixman", "renderer_pixman",

View file

@ -10,12 +10,13 @@ use crate::{
use anyhow::{anyhow, Context, Result}; use anyhow::{anyhow, Context, Result};
use smithay::{ use smithay::{
backend::{ backend::{
drm::NodeType,
egl::EGLDevice, egl::EGLDevice,
renderer::{ renderer::{
damage::{OutputDamageTracker, RenderOutputResult}, damage::{OutputDamageTracker, RenderOutputResult},
gles::GlesRenderbuffer, gles::GlesRenderbuffer,
glow::GlowRenderer, glow::GlowRenderer,
ImportDma, ImportEgl, ImportDma,
}, },
winit::{self, WinitEvent, WinitGraphicsBackend, WinitVirtualDevice}, winit::{self, WinitEvent, WinitGraphicsBackend, WinitVirtualDevice},
}, },
@ -251,51 +252,46 @@ fn init_egl_client_side(
state: &mut State, state: &mut State,
renderer: &mut WinitGraphicsBackend<GlowRenderer>, renderer: &mut WinitGraphicsBackend<GlowRenderer>,
) -> Result<()> { ) -> Result<()> {
let bind_result = renderer.renderer().bind_wl_display(dh);
let render_node = EGLDevice::device_for_display(renderer.renderer().egl_context().display()) let render_node = EGLDevice::device_for_display(renderer.renderer().egl_context().display())
.and_then(|device| device.try_get_render_node()); .and_then(|device| device.try_get_render_node());
let dmabuf_formats = renderer.renderer().dmabuf_formats().collect::<Vec<_>>(); let dmabuf_formats = renderer.renderer().dmabuf_formats().collect::<Vec<_>>();
let dmabuf_default_feedback = match render_node {
Ok(Some(node)) => {
let dmabuf_default_feedback =
DmabufFeedbackBuilder::new(node.dev_id(), dmabuf_formats.clone())
.build()
.unwrap();
Some(dmabuf_default_feedback)
}
Ok(None) => {
warn!("Failed to query render node, dmabuf protocol will only advertise v3");
None
}
Err(err) => {
warn!(
?err,
"Failed to egl device for display, dmabuf protocol will only advertise v3"
);
None
}
};
match dmabuf_default_feedback { match render_node {
Some(feedback) => { Ok(Some(node)) => {
state let feedback = DmabufFeedbackBuilder::new(node.dev_id(), dmabuf_formats.clone())
.build()
.unwrap();
let dmabuf_global = state
.common .common
.dmabuf_state .dmabuf_state
.create_global_with_default_feedback::<State>(dh, &feedback); .create_global_with_default_feedback::<State>(dh, &feedback);
let render_node = render_node.unwrap().unwrap();
let _drm_global_id = state.common.wl_drm_state.create_global::<State>(
dh,
render_node
.dev_path_with_type(NodeType::Render)
.or_else(|| render_node.dev_path())
.ok_or(anyhow!(
"Could not determine path for gpu node: {}",
render_node
))?,
dmabuf_formats,
&dmabuf_global,
);
info!("EGL hardware-acceleration enabled."); info!("EGL hardware-acceleration enabled.");
} }
None if bind_result.is_ok() => { Ok(None) => {
state warn!("Failed to query render node. Unable to initialize bind display to EGL.")
.common
.dmabuf_state
.create_global::<State>(dh, dmabuf_formats);
info!("EGL hardware-acceleration enabled.");
} }
None => { Err(err) => {
let err = bind_result.unwrap_err(); warn!(
warn!(?err, "Unable to initialize bind display to EGL.") ?err,
"Failed to egl device for display. Unable to initialize bind display to EGL."
)
} }
} }

View file

@ -7,7 +7,7 @@ use crate::{
state::{BackendData, Common}, state::{BackendData, Common},
utils::prelude::*, utils::prelude::*,
}; };
use anyhow::{Context, Result}; use anyhow::{anyhow, Context, Result};
use smithay::{ use smithay::{
backend::{ backend::{
allocator::{ allocator::{
@ -15,14 +15,14 @@ use smithay::{
gbm::{GbmAllocator, GbmBufferFlags}, gbm::{GbmAllocator, GbmBufferFlags},
vulkan::{ImageUsageFlags, VulkanAllocator}, vulkan::{ImageUsageFlags, VulkanAllocator},
}, },
drm::{DrmDeviceFd, DrmNode}, drm::{DrmDeviceFd, DrmNode, NodeType},
egl::{EGLContext, EGLDevice, EGLDisplay}, egl::{EGLContext, EGLDevice, EGLDisplay},
input::{Event, InputEvent}, input::{Event, InputEvent},
renderer::{ renderer::{
damage::{OutputDamageTracker, RenderOutputResult}, damage::{OutputDamageTracker, RenderOutputResult},
gles::GlesRenderbuffer, gles::GlesRenderbuffer,
glow::GlowRenderer, glow::GlowRenderer,
Bind, ImportDma, ImportEgl, Bind, ImportDma,
}, },
vulkan::{version::Version, Instance, PhysicalDevice}, vulkan::{version::Version, Instance, PhysicalDevice},
x11::{Window, WindowBuilder, X11Backend, X11Event, X11Handle, X11Input, X11Surface}, x11::{Window, WindowBuilder, X11Backend, X11Event, X11Handle, X11Input, X11Surface},
@ -343,7 +343,7 @@ pub fn init_backend(
unsafe { GlowRenderer::new(context) }.with_context(|| "Failed to initialize renderer")?; unsafe { GlowRenderer::new(context) }.with_context(|| "Failed to initialize renderer")?;
init_shaders(&mut renderer).context("Failed to initialize renderer")?; init_shaders(&mut renderer).context("Failed to initialize renderer")?;
init_egl_client_side(dh, state, &drm_node, &mut renderer)?; init_egl_client_side(dh, state, drm_node, &mut renderer)?;
state.backend = BackendData::X11(X11State { state.backend = BackendData::X11(X11State {
handle, handle,
@ -472,27 +472,32 @@ pub fn init_backend(
fn init_egl_client_side<R>( fn init_egl_client_side<R>(
dh: &DisplayHandle, dh: &DisplayHandle,
state: &mut State, state: &mut State,
render_node: &DrmNode, render_node: DrmNode,
renderer: &mut R, renderer: &mut R,
) -> Result<()> ) -> Result<()>
where where
R: ImportEgl + ImportDma, R: ImportDma,
{ {
if let Err(err) = renderer.bind_wl_display(dh) {
warn!(
?err,
"Unable to initialize bind display to EGL. Some older clients may not work correctly."
)
}
let default_feedback = let default_feedback =
DmabufFeedbackBuilder::new(render_node.dev_id(), renderer.dmabuf_formats()) DmabufFeedbackBuilder::new(render_node.dev_id(), renderer.dmabuf_formats())
.build() .build()
.unwrap(); .unwrap();
state let dmabuf_global = state
.common .common
.dmabuf_state .dmabuf_state
.create_global_with_default_feedback::<State>(dh, &default_feedback); .create_global_with_default_feedback::<State>(dh, &default_feedback);
let _drm_global_id = state.common.wl_drm_state.create_global::<State>(
dh,
render_node
.dev_path_with_type(NodeType::Render)
.or_else(|| render_node.dev_path())
.ok_or(anyhow!(
"Could not determine path for gpu node: {}",
render_node
))?,
renderer.dmabuf_formats().collect(),
&dmabuf_global,
);
info!("EGL hardware-acceleration enabled."); info!("EGL hardware-acceleration enabled.");