upgrade: waynest
This commit is contained in:
@@ -14,7 +14,7 @@ use drm_fourcc::DrmFourcc;
|
||||
use mint::Vector2;
|
||||
use parking_lot::Mutex;
|
||||
use std::sync::{Arc, OnceLock};
|
||||
use waynest::server::protocol::stable::linux_dmabuf_v1::zwp_linux_buffer_params_v1::Flags;
|
||||
use waynest_protocols::server::stable::linux_dmabuf_v1::zwp_linux_buffer_params_v1::Flags;
|
||||
|
||||
/// Parameters for a shared memory buffer
|
||||
pub struct DmabufBacking {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
use super::buffer_backing::DmabufBacking;
|
||||
use crate::wayland::{
|
||||
Client, WaylandError, WaylandResult,
|
||||
core::buffer::{Buffer, BufferBacking},
|
||||
util::ClientExt,
|
||||
};
|
||||
@@ -8,14 +9,9 @@ use drm_fourcc::DrmFourcc;
|
||||
use parking_lot::Mutex;
|
||||
use rustc_hash::FxHashMap;
|
||||
use std::os::fd::{AsRawFd, OwnedFd};
|
||||
use waynest::{
|
||||
server::{
|
||||
Client, Dispatcher, Result,
|
||||
protocol::stable::linux_dmabuf_v1::zwp_linux_buffer_params_v1::{
|
||||
Error, Flags, ZwpLinuxBufferParamsV1,
|
||||
},
|
||||
},
|
||||
wire::ObjectId,
|
||||
use waynest::ObjectId;
|
||||
use waynest_protocols::server::stable::linux_dmabuf_v1::zwp_linux_buffer_params_v1::{
|
||||
Error, Flags, ZwpLinuxBufferParamsV1,
|
||||
};
|
||||
|
||||
/// Parameters for creating a DMA-BUF-based wl_buffer
|
||||
@@ -23,7 +19,8 @@ use waynest::{
|
||||
/// This is a temporary object that collects dmabufs and other parameters
|
||||
/// that together form a single logical buffer. The object may eventually
|
||||
/// create one wl_buffer unless cancelled by destroying it.
|
||||
#[derive(Debug, Dispatcher)]
|
||||
#[derive(Debug, waynest_server::RequestDispatcher)]
|
||||
#[waynest(error = crate::wayland::WaylandError)]
|
||||
pub struct BufferParams {
|
||||
pub id: ObjectId,
|
||||
pub(super) planes: Mutex<FxHashMap<u32, DmatexPlane>>,
|
||||
@@ -41,7 +38,13 @@ impl BufferParams {
|
||||
}
|
||||
|
||||
impl ZwpLinuxBufferParamsV1 for BufferParams {
|
||||
async fn destroy(&self, _client: &mut Client, _sender_id: ObjectId) -> Result<()> {
|
||||
type Connection = Client;
|
||||
|
||||
async fn destroy(
|
||||
&self,
|
||||
_client: &mut Self::Connection,
|
||||
_sender_id: ObjectId,
|
||||
) -> WaylandResult<()> {
|
||||
tracing::info!("Destroying BufferParams {:?}", self.id);
|
||||
Ok(())
|
||||
}
|
||||
@@ -49,7 +52,7 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
||||
#[tracing::instrument(level = "debug", skip_all)]
|
||||
async fn add(
|
||||
&self,
|
||||
_client: &mut Client,
|
||||
_client: &mut Self::Connection,
|
||||
_sender_id: ObjectId,
|
||||
fd: OwnedFd,
|
||||
plane_idx: u32,
|
||||
@@ -57,7 +60,7 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
||||
stride: u32,
|
||||
modifier_hi: u32,
|
||||
modifier_lo: u32,
|
||||
) -> Result<()> {
|
||||
) -> WaylandResult<()> {
|
||||
let fd_num = fd.as_raw_fd();
|
||||
tracing::info!(
|
||||
"Adding plane {} with fd {} to BufferParams {:?}",
|
||||
@@ -75,7 +78,7 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
||||
plane_idx,
|
||||
self.id
|
||||
);
|
||||
return Err(waynest::server::Error::MissingObject(self.id));
|
||||
return Err(crate::wayland::WaylandError::MissingObject(self.id));
|
||||
}
|
||||
|
||||
// Create plane with the provided parameters
|
||||
@@ -94,13 +97,13 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
||||
#[tracing::instrument(level = "debug", skip_all)]
|
||||
async fn create(
|
||||
&self,
|
||||
client: &mut Client,
|
||||
client: &mut Self::Connection,
|
||||
_sender_id: ObjectId,
|
||||
width: i32,
|
||||
height: i32,
|
||||
format: u32,
|
||||
flags: Flags,
|
||||
) -> Result<()> {
|
||||
) -> WaylandResult<()> {
|
||||
tracing::info!("Creating buffer from BufferParams {:?}", self.id);
|
||||
// Create the buffer with DMA-BUF backing using self as the backing
|
||||
let size = [width as u32, height as u32].into();
|
||||
@@ -128,14 +131,14 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
||||
#[tracing::instrument(level = "debug", skip_all)]
|
||||
async fn create_immed(
|
||||
&self,
|
||||
client: &mut Client,
|
||||
sender_id: ObjectId,
|
||||
client: &mut Self::Connection,
|
||||
_sender_id: ObjectId,
|
||||
buffer_id: ObjectId,
|
||||
width: i32,
|
||||
height: i32,
|
||||
format: u32,
|
||||
flags: Flags,
|
||||
) -> Result<()> {
|
||||
) -> WaylandResult<()> {
|
||||
// TODO: terminate client on fail, or send a fail event or something
|
||||
// Create the buffer with DMA-BUF backing using self as the backing
|
||||
match DmabufBacking::from_params(
|
||||
@@ -148,15 +151,12 @@ impl ZwpLinuxBufferParamsV1 for BufferParams {
|
||||
Buffer::new(client, buffer_id, BufferBacking::Dmabuf(backing));
|
||||
}
|
||||
Err(e) => {
|
||||
client
|
||||
.protocol_error(
|
||||
sender_id,
|
||||
buffer_id,
|
||||
Error::Incomplete as u32,
|
||||
format!("Failed to import dmabuf because {e}"),
|
||||
)
|
||||
.await?;
|
||||
tracing::error!("Failed to import dmabuf because {e}");
|
||||
return Err(WaylandError::Fatal {
|
||||
object_id: buffer_id,
|
||||
code: Error::Incomplete as u32,
|
||||
message: "Failed to import dmabuf",
|
||||
});
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
||||
@@ -1,26 +1,22 @@
|
||||
use super::Dmabuf;
|
||||
use crate::wayland::vulkano_data::VULKANO_CONTEXT;
|
||||
use crate::wayland::{Client, WaylandResult, vulkano_data::VULKANO_CONTEXT};
|
||||
use memfd::MemfdOptions;
|
||||
use std::{
|
||||
io::Write,
|
||||
os::fd::{FromRawFd, IntoRawFd, OwnedFd},
|
||||
sync::Arc,
|
||||
};
|
||||
use waynest::{
|
||||
server::{
|
||||
Client, Dispatcher, Result,
|
||||
protocol::stable::linux_dmabuf_v1::zwp_linux_dmabuf_feedback_v1::{
|
||||
TrancheFlags, ZwpLinuxDmabufFeedbackV1,
|
||||
},
|
||||
},
|
||||
wire::ObjectId,
|
||||
use waynest::ObjectId;
|
||||
use waynest_protocols::server::stable::linux_dmabuf_v1::zwp_linux_dmabuf_feedback_v1::{
|
||||
TrancheFlags, ZwpLinuxDmabufFeedbackV1,
|
||||
};
|
||||
|
||||
#[derive(Debug, Dispatcher)]
|
||||
#[derive(Debug, waynest_server::RequestDispatcher)]
|
||||
#[waynest(error = crate::wayland::WaylandError)]
|
||||
pub struct DmabufFeedback(pub Arc<Dmabuf>);
|
||||
impl DmabufFeedback {
|
||||
#[tracing::instrument(level = "debug", skip_all)]
|
||||
pub async fn send_params(&self, client: &mut Client, sender_id: ObjectId) -> Result<()> {
|
||||
pub async fn send_params(&self, client: &mut Client, sender_id: ObjectId) -> WaylandResult<()> {
|
||||
let num_formats = self.0.formats.len();
|
||||
// Send format table first
|
||||
self.send_format_table(client, sender_id).await?;
|
||||
@@ -63,16 +59,18 @@ impl DmabufFeedback {
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip_all)]
|
||||
pub async fn send_format_table(&self, client: &mut Client, sender_id: ObjectId) -> Result<()> {
|
||||
pub async fn send_format_table(
|
||||
&self,
|
||||
client: &mut Client,
|
||||
sender_id: ObjectId,
|
||||
) -> WaylandResult<()> {
|
||||
// Format + modifier pair (16 bytes):
|
||||
// - format: u32
|
||||
// - padding: 4 bytes
|
||||
// - modifier: u64
|
||||
let size = self.0.formats.len() as u32 * 16u32;
|
||||
// Create a temporary file for the format table
|
||||
let mfd = MemfdOptions::default()
|
||||
.create("stardustxr-format-table")
|
||||
.map_err(|e| waynest::server::Error::Custom(e.to_string()))?;
|
||||
let mfd = MemfdOptions::default().create("stardustxr-format-table")?;
|
||||
|
||||
mfd.as_file().set_len(size as u64)?;
|
||||
|
||||
@@ -96,7 +94,13 @@ impl DmabufFeedback {
|
||||
}
|
||||
|
||||
impl ZwpLinuxDmabufFeedbackV1 for DmabufFeedback {
|
||||
async fn destroy(&self, _client: &mut Client, _sender_id: ObjectId) -> Result<()> {
|
||||
type Connection = crate::wayland::Client;
|
||||
|
||||
async fn destroy(
|
||||
&self,
|
||||
_client: &mut Self::Connection,
|
||||
_sender_id: ObjectId,
|
||||
) -> WaylandResult<()> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,11 @@ pub mod buffer_backing;
|
||||
pub mod buffer_params;
|
||||
pub mod feedback;
|
||||
|
||||
use std::sync::LazyLock;
|
||||
|
||||
use super::{util::ClientExt, vulkano_data::VULKANO_CONTEXT};
|
||||
use crate::core::registry::Registry;
|
||||
use super::vulkano_data::VULKANO_CONTEXT;
|
||||
use crate::{
|
||||
core::registry::Registry,
|
||||
wayland::{Client, WaylandError, WaylandResult},
|
||||
};
|
||||
use bevy_dmabuf::{
|
||||
format_mapping::{drm_fourcc_to_vk_format, vk_format_to_srgb},
|
||||
wgpu_init::vulkan_to_wgpu,
|
||||
@@ -14,14 +15,10 @@ use buffer_params::BufferParams;
|
||||
use drm_fourcc::DrmFourcc;
|
||||
use feedback::DmabufFeedback;
|
||||
use rustc_hash::FxHashSet;
|
||||
use std::sync::LazyLock;
|
||||
use vulkano::format::FormatFeatures;
|
||||
use waynest::{
|
||||
server::{
|
||||
Client, Dispatcher, Error, Result,
|
||||
protocol::stable::linux_dmabuf_v1::zwp_linux_dmabuf_v1::ZwpLinuxDmabufV1,
|
||||
},
|
||||
wire::ObjectId,
|
||||
};
|
||||
use waynest::ObjectId;
|
||||
use waynest_protocols::server::stable::linux_dmabuf_v1::zwp_linux_dmabuf_v1::ZwpLinuxDmabufV1;
|
||||
|
||||
pub static DMABUF_FORMATS: LazyLock<Vec<(DrmFourcc, u64)>> = LazyLock::new(|| {
|
||||
let vk = VULKANO_CONTEXT.wait();
|
||||
@@ -76,7 +73,8 @@ pub static DMABUF_FORMATS: LazyLock<Vec<(DrmFourcc, u64)>> = LazyLock::new(|| {
|
||||
/// - Coherency for read access in dmabuf data
|
||||
/// - Proper lifetime management of dmabuf file descriptors
|
||||
/// - Safe handling of buffer attachments
|
||||
#[derive(Debug, Dispatcher)]
|
||||
#[derive(Debug, waynest_server::RequestDispatcher)]
|
||||
#[waynest(error = crate::wayland::WaylandError)]
|
||||
pub struct Dmabuf {
|
||||
// Track supported formats and modifiers
|
||||
// formats: Mutex<FxHashSet<DrmFormat>>,
|
||||
@@ -88,7 +86,7 @@ pub struct Dmabuf {
|
||||
|
||||
impl Dmabuf {
|
||||
/// Create a new DMA-BUF interface instance
|
||||
pub async fn new(client: &mut Client, id: ObjectId, version: u32) -> Result<Self> {
|
||||
pub async fn new(client: &mut Client, id: ObjectId, version: u32) -> WaylandResult<Self> {
|
||||
let dmabuf = Self {
|
||||
active_params: Registry::new(),
|
||||
version,
|
||||
@@ -122,17 +120,23 @@ impl Dmabuf {
|
||||
}
|
||||
|
||||
impl ZwpLinuxDmabufV1 for Dmabuf {
|
||||
async fn destroy(&self, _client: &mut Client, sender_id: ObjectId) -> Result<()> {
|
||||
type Connection = crate::wayland::Client;
|
||||
|
||||
async fn destroy(
|
||||
&self,
|
||||
_client: &mut Self::Connection,
|
||||
sender_id: ObjectId,
|
||||
) -> WaylandResult<()> {
|
||||
self.remove_params(sender_id);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn create_params(
|
||||
&self,
|
||||
client: &mut Client,
|
||||
client: &mut Self::Connection,
|
||||
_sender_id: ObjectId,
|
||||
params_id: ObjectId,
|
||||
) -> Result<()> {
|
||||
) -> WaylandResult<()> {
|
||||
// Create new buffer parameters object
|
||||
let params = client.insert(params_id, BufferParams::new(params_id));
|
||||
self.active_params.add_raw(¶ms);
|
||||
@@ -141,20 +145,16 @@ impl ZwpLinuxDmabufV1 for Dmabuf {
|
||||
|
||||
async fn get_default_feedback(
|
||||
&self,
|
||||
client: &mut Client,
|
||||
client: &mut Self::Connection,
|
||||
sender_id: ObjectId,
|
||||
id: ObjectId,
|
||||
) -> Result<()> {
|
||||
) -> WaylandResult<()> {
|
||||
if self.version < 3 {
|
||||
client
|
||||
.protocol_error(
|
||||
sender_id,
|
||||
id,
|
||||
71,
|
||||
"Can't call get_default_feedback on version < 4 of dmabuf".into(),
|
||||
)
|
||||
.await?;
|
||||
return Err(Error::Custom("Protocol error".into()));
|
||||
return Err(WaylandError::Fatal {
|
||||
object_id: id,
|
||||
code: 71,
|
||||
message: "Can't call get_default_feedback on version < 4 of dmabuf",
|
||||
});
|
||||
}
|
||||
// Create feedback object for default (non-surface-specific) settings
|
||||
let feedback = client.insert(id, DmabufFeedback(client.get::<Dmabuf>(sender_id).unwrap()));
|
||||
@@ -164,11 +164,11 @@ impl ZwpLinuxDmabufV1 for Dmabuf {
|
||||
|
||||
async fn get_surface_feedback(
|
||||
&self,
|
||||
client: &mut Client,
|
||||
client: &mut Self::Connection,
|
||||
sender_id: ObjectId,
|
||||
id: ObjectId,
|
||||
_surface: ObjectId,
|
||||
) -> Result<()> {
|
||||
) -> WaylandResult<()> {
|
||||
// Create feedback object for surface-specific settings
|
||||
// Note: Surface-specific feedback could be optimized based on the surface's
|
||||
// requirements, but for now we use the same feedback as default
|
||||
|
||||
Reference in New Issue
Block a user