refactor(wayland): bit of cleanup
This commit is contained in:
@@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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>) {
|
||||||
|
|||||||
Reference in New Issue
Block a user