From 3635ae0104118cca8290b4b32c006d06dbd149ed Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sun, 18 Feb 2024 15:23:10 +0100 Subject: [PATCH] render: store underlying DmaBufs in textures --- src/gfx_api.rs | 1 + src/gfx_apis/gl/egl/display.rs | 4 +-- src/gfx_apis/gl/egl/image.rs | 6 ++--- src/gfx_apis/gl/gl/render_buffer.rs | 4 +-- src/gfx_apis/gl/gl/texture.rs | 6 ++--- src/gfx_apis/gl/renderer/framebuffer.rs | 2 +- src/gfx_apis/gl/renderer/image.rs | 4 +-- src/gfx_apis/gl/renderer/texture.rs | 5 ++++ src/gfx_apis/vulkan/image.rs | 35 +++++++++++++------------ src/gfx_apis/vulkan/renderer.rs | 6 ++--- 10 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/gfx_api.rs b/src/gfx_api.rs index 38fa1674..1df27473 100644 --- a/src/gfx_api.rs +++ b/src/gfx_api.rs @@ -267,6 +267,7 @@ pub trait GfxTexture: Debug { format: &'static Format, shm: &[Cell], ) -> Result<(), GfxError>; + fn dmabuf(&self) -> Option<&DmaBuf>; } pub trait GfxContext: Debug { diff --git a/src/gfx_apis/gl/egl/display.rs b/src/gfx_apis/gl/egl/display.rs index 0091893f..795bbacb 100644 --- a/src/gfx_apis/gl/egl/display.rs +++ b/src/gfx_apis/gl/egl/display.rs @@ -259,10 +259,8 @@ impl EglDisplay { Ok(Rc::new(EglImage { dpy: self.clone(), img, - width: buf.width, - height: buf.height, external_only: format.external_only, - format: buf.format, + dmabuf: buf.clone(), })) } } diff --git a/src/gfx_apis/gl/egl/image.rs b/src/gfx_apis/gl/egl/image.rs index ab2412b5..31cad564 100644 --- a/src/gfx_apis/gl/egl/image.rs +++ b/src/gfx_apis/gl/egl/image.rs @@ -1,11 +1,11 @@ use { crate::{ - format::Format, gfx_apis::gl::egl::{ display::EglDisplay, sys::{EGLImageKHR, EGL_FALSE}, PROCS, }, + video::dmabuf::DmaBuf, }, std::rc::Rc, }; @@ -13,10 +13,8 @@ use { pub struct EglImage { pub dpy: Rc, pub img: EGLImageKHR, - pub width: i32, - pub height: i32, pub external_only: bool, - pub format: &'static Format, + pub dmabuf: DmaBuf, } impl Drop for EglImage { diff --git a/src/gfx_apis/gl/gl/render_buffer.rs b/src/gfx_apis/gl/gl/render_buffer.rs index 7e582b9e..32dad288 100644 --- a/src/gfx_apis/gl/gl/render_buffer.rs +++ b/src/gfx_apis/gl/gl/render_buffer.rs @@ -60,8 +60,8 @@ impl GlRenderBuffer { _tex: None, ctx: self.ctx.clone(), fbo, - width: self.img.width, - height: self.img.height, + width: self.img.dmabuf.width, + height: self.img.dmabuf.height, }; if status != GL_FRAMEBUFFER_COMPLETE { return Err(RenderError::CreateFramebuffer); diff --git a/src/gfx_apis/gl/gl/texture.rs b/src/gfx_apis/gl/gl/texture.rs index cded2e9f..9397578d 100644 --- a/src/gfx_apis/gl/gl/texture.rs +++ b/src/gfx_apis/gl/gl/texture.rs @@ -56,10 +56,10 @@ impl GlTexture { ctx: ctx.clone(), img: Some(img.clone()), tex, - width: img.width, - height: img.height, + width: img.dmabuf.width, + height: img.dmabuf.height, external_only: img.external_only, - format: img.format, + format: img.dmabuf.format, }) } diff --git a/src/gfx_apis/gl/renderer/framebuffer.rs b/src/gfx_apis/gl/renderer/framebuffer.rs index 99dc5e5b..e1cd262c 100644 --- a/src/gfx_apis/gl/renderer/framebuffer.rs +++ b/src/gfx_apis/gl/renderer/framebuffer.rs @@ -120,6 +120,6 @@ impl GfxFramebuffer for Framebuffer { } fn format(&self) -> &'static Format { - self.gl.rb.img.format + self.gl.rb.img.dmabuf.format } } diff --git a/src/gfx_apis/gl/renderer/image.rs b/src/gfx_apis/gl/renderer/image.rs index a586f271..23f3d848 100644 --- a/src/gfx_apis/gl/renderer/image.rs +++ b/src/gfx_apis/gl/renderer/image.rs @@ -17,11 +17,11 @@ pub struct Image { impl Image { pub fn width(&self) -> i32 { - self.gl.width + self.gl.dmabuf.width } pub fn height(&self) -> i32 { - self.gl.height + self.gl.dmabuf.height } fn to_texture(self: &Rc) -> Result, RenderError> { diff --git a/src/gfx_apis/gl/renderer/texture.rs b/src/gfx_apis/gl/renderer/texture.rs index e6ac3480..8e1130f4 100644 --- a/src/gfx_apis/gl/renderer/texture.rs +++ b/src/gfx_apis/gl/renderer/texture.rs @@ -3,6 +3,7 @@ use { format::Format, gfx_api::{GfxError, GfxTexture}, gfx_apis::gl::{gl::texture::GlTexture, renderer::context::GlRenderContext, RenderError}, + video::dmabuf::DmaBuf, }, std::{ any::Any, @@ -58,4 +59,8 @@ impl GfxTexture for Texture { ) -> Result<(), GfxError> { Err(RenderError::UnsupportedOperation.into()) } + + fn dmabuf(&self) -> Option<&DmaBuf> { + self.gl.img.as_ref().map(|i| &i.dmabuf) + } } diff --git a/src/gfx_apis/vulkan/image.rs b/src/gfx_apis/vulkan/image.rs index 2176ddc6..52e1a7d2 100644 --- a/src/gfx_apis/vulkan/image.rs +++ b/src/gfx_apis/vulkan/image.rs @@ -8,10 +8,7 @@ use { }, theme::Color, utils::clonecell::CloneCell, - video::{ - dmabuf::{DmaBuf, DmaBufPlane, PlaneVec}, - Modifier, - }, + video::dmabuf::{DmaBuf, PlaneVec}, }, ash::vk::{ BindImageMemoryInfo, BindImagePlaneMemoryInfo, ComponentMapping, ComponentSwizzle, @@ -36,12 +33,10 @@ use { pub struct VulkanDmaBufImageTemplate { pub(super) renderer: Rc, - pub(super) format: &'static Format, pub(super) width: u32, pub(super) height: u32, - pub(super) modifier: Modifier, pub(super) disjoint: bool, - pub(super) planes: PlaneVec, + pub(super) dmabuf: DmaBuf, pub(super) render_max_extents: Option, pub(super) texture_max_extents: Option, } @@ -260,12 +255,10 @@ impl VulkanRenderer { } Ok(Rc::new(VulkanDmaBufImageTemplate { renderer: self.clone(), - format: dmabuf.format, width, height, - modifier: dmabuf.modifier, disjoint, - planes: dmabuf.planes.clone(), + dmabuf: dmabuf.clone(), render_max_extents: modifier.render_max_extents, texture_max_extents: modifier.texture_max_extents, })) @@ -332,6 +325,7 @@ impl VulkanDmaBufImageTemplate { } let image = { let plane_layouts: PlaneVec<_> = self + .dmabuf .planes .iter() .map(|p| SubresourceLayout { @@ -343,7 +337,7 @@ impl VulkanDmaBufImageTemplate { }) .collect(); let mut mod_info = ImageDrmFormatModifierExplicitCreateInfoEXT::builder() - .drm_format_modifier(self.modifier) + .drm_format_modifier(self.dmabuf.modifier) .plane_layouts(&plane_layouts) .build(); let mut memory_image_create_info = ExternalMemoryImageCreateInfo::builder() @@ -361,7 +355,7 @@ impl VulkanDmaBufImageTemplate { }; let create_info = ImageCreateInfo::builder() .image_type(ImageType::TYPE_2D) - .format(self.format.vk_format) + .format(self.dmabuf.format.vk_format) .mip_levels(1) .array_layers(1) .tiling(ImageTiling::DRM_FORMAT_MODIFIER_EXT) @@ -383,14 +377,14 @@ impl VulkanDmaBufImageTemplate { }; let destroy_image = OnDrop(|| unsafe { device.device.destroy_image(image, None) }); let num_device_memories = match self.disjoint { - true => self.planes.len(), + true => self.dmabuf.planes.len(), false => 1, }; let mut device_memories = PlaneVec::new(); let mut free_device_memories = PlaneVec::new(); let mut bind_image_plane_memory_infos = PlaneVec::new(); for plane_idx in 0..num_device_memories { - let dma_buf_plane = &self.planes[plane_idx]; + let dma_buf_plane = &self.dmabuf.planes[plane_idx]; let memory_fd_properties = unsafe { device.external_memory_fd.get_memory_fd_properties( ExternalMemoryHandleTypeFlags::DMA_BUF_EXT, @@ -467,8 +461,8 @@ impl VulkanDmaBufImageTemplate { } let res = unsafe { device.device.bind_image_memory2(&bind_image_memory_infos) }; res.map_err(VulkanError::BindImageMemory)?; - let texture_view = device.create_image_view(image, self.format, false)?; - let render_view = device.create_image_view(image, self.format, true)?; + let texture_view = device.create_image_view(image, self.dmabuf.format, false)?; + let render_view = device.create_image_view(image, self.dmabuf.format, true)?; free_device_memories.drain(..).for_each(mem::forget); mem::forget(destroy_image); Ok(Rc::new(VulkanImage { @@ -484,7 +478,7 @@ impl VulkanDmaBufImageTemplate { template: self.clone(), mems: device_memories, }), - format: self.format, + format: self.dmabuf.format, is_undefined: Cell::new(true), })) } @@ -579,4 +573,11 @@ impl GfxTexture for VulkanImage { .read_pixels(&self, x, y, width, height, stride, format, shm) .map_err(|e| e.into()) } + + fn dmabuf(&self) -> Option<&DmaBuf> { + match &self.ty { + VulkanImageMemory::DmaBuf(b) => Some(&b.template.dmabuf), + VulkanImageMemory::Internal(_) => None, + } + } } diff --git a/src/gfx_apis/vulkan/renderer.rs b/src/gfx_apis/vulkan/renderer.rs index 62eb2723..bd5d418e 100644 --- a/src/gfx_apis/vulkan/renderer.rs +++ b/src/gfx_apis/vulkan/renderer.rs @@ -532,7 +532,7 @@ impl VulkanRenderer { flag: u32| -> Result<(), VulkanError> { if let VulkanImageMemory::DmaBuf(buf) = &img.ty { - for plane in &buf.template.planes { + for plane in &buf.template.dmabuf.planes { let fd = dma_buf_export_sync_file(&plane.fd, flag) .map_err(VulkanError::IoctlExportSyncFile)?; let semaphore = self.allocate_semaphore()?; @@ -573,7 +573,7 @@ impl VulkanRenderer { }; let import = |img: &VulkanImage, flag: u32| { if let VulkanImageMemory::DmaBuf(buf) = &img.ty { - for plane in &buf.template.planes { + for plane in &buf.template.dmabuf.planes { let res = dma_buf_import_sync_file(&plane.fd, flag, &syncfile) .map_err(VulkanError::IoctlImportSyncFile); if let Err(e) = res { @@ -764,7 +764,7 @@ impl VulkanRenderer { let mut semaphores = vec![]; let mut semaphore_infos = vec![]; if let VulkanImageMemory::DmaBuf(buf) = &tex.ty { - for plane in &buf.template.planes { + for plane in &buf.template.dmabuf.planes { let fd = dma_buf_export_sync_file(&plane.fd, DMA_BUF_SYNC_READ) .map_err(VulkanError::IoctlExportSyncFile)?; let semaphore = self.allocate_semaphore()?;