From 8a3a377f61285cac97632f77927e2b41c4068b0b Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 21 Feb 2025 11:49:39 +0100 Subject: [PATCH] vulkan: de-duplicate used textures --- src/gfx_apis/vulkan/image.rs | 2 ++ src/gfx_apis/vulkan/renderer.rs | 9 ++++++--- src/gfx_apis/vulkan/shm_image.rs | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/gfx_apis/vulkan/image.rs b/src/gfx_apis/vulkan/image.rs index 197577f2..c0746361 100644 --- a/src/gfx_apis/vulkan/image.rs +++ b/src/gfx_apis/vulkan/image.rs @@ -66,6 +66,7 @@ pub struct VulkanImage { pub(super) shader_read_only_optimal_descriptor: Box<[u8]>, pub(super) descriptor_buffer_version: Cell, pub(super) descriptor_buffer_offset: Cell, + pub(super) execution_version: Cell, } #[derive(Copy, Clone, Eq, PartialEq, Debug)] @@ -452,6 +453,7 @@ impl VulkanDmaBufImageTemplate { .sampler_read_only_descriptor(texture_view), descriptor_buffer_version: Cell::new(0), descriptor_buffer_offset: Cell::new(0), + execution_version: Cell::new(0), })) } diff --git a/src/gfx_apis/vulkan/renderer.rs b/src/gfx_apis/vulkan/renderer.rs index f36c64f5..80fc21af 100644 --- a/src/gfx_apis/vulkan/renderer.rs +++ b/src/gfx_apis/vulkan/renderer.rs @@ -87,7 +87,6 @@ pub struct VulkanRenderer { pub(super) shm_allocator: Rc, pub(super) sampler: Rc, pub(super) tex_sampler_descriptor_buffer_cache: Rc, - pub(super) descriptor_buffer_version: NumCell, pub(super) tex_descriptor_buffer_writer: RefCell, } @@ -254,7 +253,6 @@ impl VulkanDevice { shm_allocator, sampler, tex_sampler_descriptor_buffer_cache: tex_descriptor_buffer_cache, - descriptor_buffer_version: Default::default(), tex_descriptor_buffer_writer, }); render.get_or_create_pipelines(XRGB8888.vk_format)?; @@ -327,7 +325,7 @@ impl VulkanRenderer { return Ok(()); }; zone!("create_descriptor_buffer"); - let version = self.descriptor_buffer_version.add_fetch(1); + let version = self.allocate_point(); let memory = &mut *self.memory.borrow_mut(); let writer = &mut *self.tex_descriptor_buffer_writer.borrow_mut(); writer.clear(); @@ -368,12 +366,16 @@ impl VulkanRenderer { let mut memory = self.memory.borrow_mut(); memory.dmabuf_sample.clear(); memory.queue_transfer.clear(); + let execution = self.allocate_point(); for cmd in opts { if let GfxApiOpt::CopyTexture(c) = cmd { let tex = c.tex.clone().into_vk(&self.device.device); if tex.contents_are_undefined.get() { continue; } + if tex.execution_version.replace(execution) == execution { + continue; + } match tex.queue_state.get().acquire(QueueFamily::Gfx) { QueueTransfer::Unnecessary => {} QueueTransfer::Possible => memory.queue_transfer.push(tex.clone()), @@ -1055,6 +1057,7 @@ impl VulkanRenderer { memory.queue_transfer.clear(); memory.wait_semaphores.clear(); memory.release_fence.take(); + memory.descriptor_buffer.take(); memory.release_sync_file.take() }; res.map(|_| sync_file) diff --git a/src/gfx_apis/vulkan/shm_image.rs b/src/gfx_apis/vulkan/shm_image.rs index a03cef16..b405a9a0 100644 --- a/src/gfx_apis/vulkan/shm_image.rs +++ b/src/gfx_apis/vulkan/shm_image.rs @@ -462,6 +462,7 @@ impl VulkanRenderer { shader_read_only_optimal_descriptor: self.sampler_read_only_descriptor(view), descriptor_buffer_version: Cell::new(0), descriptor_buffer_offset: Cell::new(0), + execution_version: Cell::new(0), }); let shm = match &img.ty { VulkanImageMemory::DmaBuf(_) => unreachable!(),