refactor(wayland): bit of cleanup

This commit is contained in:
Nova
2025-07-25 10:47:16 -07:00
parent 030fd6ed53
commit ec3ced272a
3 changed files with 118 additions and 110 deletions

View File

@@ -7,7 +7,7 @@ use bevy::{
}; };
use bevy_dmabuf::import::ImportedDmatexs; use bevy_dmabuf::import::ImportedDmatexs;
use mint::Vector2; use mint::Vector2;
use std::sync::{Arc, Weak}; use std::sync::Arc;
pub use waynest::server::protocol::core::wayland::wl_buffer::*; pub use waynest::server::protocol::core::wayland::wl_buffer::*;
use waynest::{ use waynest::{
server::{Client, Dispatcher, Result}, server::{Client, Dispatcher, Result},
@@ -29,9 +29,9 @@ impl BufferUsage {
} }
impl Drop for BufferUsage { impl Drop for BufferUsage {
fn drop(&mut self) { fn drop(&mut self) {
self.message_sink let _ = self
.send(Message::ReleaseBuffer(self.buffer.clone())) .message_sink
.unwrap(); .send(Message::ReleaseBuffer(self.buffer.clone()));
} }
} }

View File

@@ -1,8 +1,12 @@
use super::shm_pool::ShmPool; use super::shm_pool::ShmPool;
use crate::wayland::{RENDER_DEVICE, vulkano_data::VULKANO_CONTEXT}; use crate::wayland::{
RENDER_DEVICE,
vulkano_data::{VULKANO_CONTEXT, VulkanoContext},
};
use bevy::{ use bevy::{
asset::{Assets, Handle}, asset::{Assets, Handle},
image::Image as BevyImage, image::Image as BevyImage,
render::renderer::RenderDevice,
}; };
use bevy_dmabuf::{ use bevy_dmabuf::{
dmatex::{Dmatex, DmatexPlane, Resolution}, dmatex::{Dmatex, DmatexPlane, Resolution},
@@ -17,6 +21,7 @@ use std::{
}; };
use tracing::debug_span; use tracing::debug_span;
use vulkano::{ use vulkano::{
ValidationError,
buffer::{BufferCreateFlags, BufferCreateInfo, BufferUsage}, buffer::{BufferCreateFlags, BufferCreateInfo, BufferUsage},
command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo}, command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo},
image::{ image::{
@@ -31,43 +36,23 @@ use vulkano::{
}; };
use waynest::server::protocol::core::wayland::wl_shm::Format; use waynest::server::protocol::core::wayland::wl_shm::Format;
/// Parameters for a shared memory buffer fn create_vk_dmatex(
pub struct ShmBufferBacking { vulkano_context: &VulkanoContext,
pool: Arc<ShmPool>, bevy_render_dev: &RenderDevice,
offset: usize,
stride: usize,
size: Vector2<usize>, size: Vector2<usize>,
format: Format, ) -> Result<(Arc<Image>, Dmatex), Box<ValidationError>> {
image: Arc<Image>,
image_handle: OnceLock<Handle<BevyImage>>,
pending_imported_dmatex: Mutex<Option<ImportedTexture>>,
}
impl ShmBufferBacking {
pub fn new(
pool: Arc<ShmPool>,
offset: usize,
stride: usize,
size: Vector2<usize>,
format: Format,
) -> Self {
// TODO: this might cause a freeze?
let vk = VULKANO_CONTEXT.wait();
let bevy_render_dev = RENDER_DEVICE.wait();
let vk_format = vulkano::format::Format::R8G8B8A8_UNORM; let vk_format = vulkano::format::Format::R8G8B8A8_UNORM;
let modifiers = vk let modifiers = vulkano_context
.phys_dev .phys_dev
.format_properties(vk_format) .format_properties(vk_format)?
.unwrap()
.drm_format_modifier_properties .drm_format_modifier_properties
.into_iter() .into_iter()
.map(|v| v.drm_format_modifier) .map(|v| v.drm_format_modifier)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let raw_image = RawImage::new( let raw_image = RawImage::new(
vk.dev.clone(), vulkano_context.dev.clone(),
ImageCreateInfo { ImageCreateInfo {
flags: ImageCreateFlags::empty(), flags: ImageCreateFlags::empty(),
image_type: vulkano::image::ImageType::Dim2d, image_type: vulkano::image::ImageType::Dim2d,
@@ -75,9 +60,7 @@ impl ShmBufferBacking {
view_formats: Vec::new(), view_formats: Vec::new(),
extent: [size.x as u32, size.y as u32, 1], extent: [size.x as u32, size.y as u32, 1],
tiling: ImageTiling::DrmFormatModifier, tiling: ImageTiling::DrmFormatModifier,
usage: ImageUsage::COLOR_ATTACHMENT usage: ImageUsage::COLOR_ATTACHMENT | ImageUsage::SAMPLED | ImageUsage::TRANSFER_DST,
| ImageUsage::SAMPLED
| ImageUsage::TRANSFER_DST,
initial_layout: ImageLayout::Undefined, initial_layout: ImageLayout::Undefined,
drm_format_modifiers: modifiers, drm_format_modifiers: modifiers,
external_memory_handle_types: ExternalMemoryHandleTypes::DMA_BUF, external_memory_handle_types: ExternalMemoryHandleTypes::DMA_BUF,
@@ -87,7 +70,7 @@ impl ShmBufferBacking {
.unwrap(); .unwrap();
let (modifier, num_planes) = raw_image.drm_format_modifier().unwrap(); let (modifier, num_planes) = raw_image.drm_format_modifier().unwrap();
let mem_reqs = raw_image.memory_requirements()[0]; let mem_reqs = raw_image.memory_requirements()[0];
let index = vk let index = vulkano_context
.phys_dev .phys_dev
.memory_properties() .memory_properties()
.memory_types .memory_types
@@ -98,7 +81,7 @@ impl ShmBufferBacking {
.expect("no valid memory type"); .expect("no valid memory type");
let mem = ResourceMemory::new_dedicated( let mem = ResourceMemory::new_dedicated(
DeviceMemory::allocate( DeviceMemory::allocate(
vk.dev.clone(), vulkano_context.dev.clone(),
MemoryAllocateInfo { MemoryAllocateInfo {
allocation_size: mem_reqs.layout.size(), allocation_size: mem_reqs.layout.size(),
memory_type_index: index, memory_type_index: index,
@@ -156,6 +139,33 @@ impl ShmBufferBacking {
flip_y: false, flip_y: false,
srgb: true, srgb: true,
}; };
Ok((image, dmatex))
}
/// Parameters for a shared memory buffer
pub struct ShmBufferBacking {
pool: Arc<ShmPool>,
offset: usize,
stride: usize,
size: Vector2<usize>,
format: Format,
image: Arc<Image>,
image_handle: OnceLock<Handle<BevyImage>>,
pending_imported_dmatex: Mutex<Option<ImportedTexture>>,
}
impl ShmBufferBacking {
pub fn new(
pool: Arc<ShmPool>,
offset: usize,
stride: usize,
size: Vector2<usize>,
format: Format,
) -> Self {
// TODO: this might cause a freeze?
let vulkano_context = VULKANO_CONTEXT.wait();
let bevy_render_dev = RENDER_DEVICE.wait();
let (image, dmatex) = create_vk_dmatex(vulkano_context, bevy_render_dev, size);
let imported_texture = import_texture(bevy_render_dev, dmatex, DropCallback(None)).unwrap(); let imported_texture = import_texture(bevy_render_dev, dmatex, DropCallback(None)).unwrap();

View File

@@ -319,9 +319,7 @@ fn push_used_buffers(mut buffers: ResMut<UsedBuffers>) {
} }
fn release_unneeded_buffers(mut buffers: ResMut<UsedBuffers>) { fn release_unneeded_buffers(mut buffers: ResMut<UsedBuffers>) {
dbg!(buffers.len());
buffers.retain(|_, v| Arc::downgrade(v).strong_count() > 1); buffers.retain(|_, v| Arc::downgrade(v).strong_count() > 1);
dbg!(buffers.len());
} }
fn init_render_device(dev: Res<RenderDevice>) { fn init_render_device(dev: Res<RenderDevice>) {