1
0
Fork 0
forked from wry/wry

vulkan: de-duplicate used textures

This commit is contained in:
Julian Orth 2025-02-21 11:49:39 +01:00
parent cf6016f61f
commit 8a3a377f61
3 changed files with 9 additions and 3 deletions

View file

@ -66,6 +66,7 @@ pub struct VulkanImage {
pub(super) shader_read_only_optimal_descriptor: Box<[u8]>, pub(super) shader_read_only_optimal_descriptor: Box<[u8]>,
pub(super) descriptor_buffer_version: Cell<u64>, pub(super) descriptor_buffer_version: Cell<u64>,
pub(super) descriptor_buffer_offset: Cell<DeviceSize>, pub(super) descriptor_buffer_offset: Cell<DeviceSize>,
pub(super) execution_version: Cell<u64>,
} }
#[derive(Copy, Clone, Eq, PartialEq, Debug)] #[derive(Copy, Clone, Eq, PartialEq, Debug)]
@ -452,6 +453,7 @@ impl VulkanDmaBufImageTemplate {
.sampler_read_only_descriptor(texture_view), .sampler_read_only_descriptor(texture_view),
descriptor_buffer_version: Cell::new(0), descriptor_buffer_version: Cell::new(0),
descriptor_buffer_offset: Cell::new(0), descriptor_buffer_offset: Cell::new(0),
execution_version: Cell::new(0),
})) }))
} }

View file

@ -87,7 +87,6 @@ pub struct VulkanRenderer {
pub(super) shm_allocator: Rc<VulkanThreadedAllocator>, pub(super) shm_allocator: Rc<VulkanThreadedAllocator>,
pub(super) sampler: Rc<VulkanSampler>, pub(super) sampler: Rc<VulkanSampler>,
pub(super) tex_sampler_descriptor_buffer_cache: Rc<VulkanDescriptorBufferCache>, pub(super) tex_sampler_descriptor_buffer_cache: Rc<VulkanDescriptorBufferCache>,
pub(super) descriptor_buffer_version: NumCell<u64>,
pub(super) tex_descriptor_buffer_writer: RefCell<VulkanDescriptorBufferWriter>, pub(super) tex_descriptor_buffer_writer: RefCell<VulkanDescriptorBufferWriter>,
} }
@ -254,7 +253,6 @@ impl VulkanDevice {
shm_allocator, shm_allocator,
sampler, sampler,
tex_sampler_descriptor_buffer_cache: tex_descriptor_buffer_cache, tex_sampler_descriptor_buffer_cache: tex_descriptor_buffer_cache,
descriptor_buffer_version: Default::default(),
tex_descriptor_buffer_writer, tex_descriptor_buffer_writer,
}); });
render.get_or_create_pipelines(XRGB8888.vk_format)?; render.get_or_create_pipelines(XRGB8888.vk_format)?;
@ -327,7 +325,7 @@ impl VulkanRenderer {
return Ok(()); return Ok(());
}; };
zone!("create_descriptor_buffer"); 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 memory = &mut *self.memory.borrow_mut();
let writer = &mut *self.tex_descriptor_buffer_writer.borrow_mut(); let writer = &mut *self.tex_descriptor_buffer_writer.borrow_mut();
writer.clear(); writer.clear();
@ -368,12 +366,16 @@ impl VulkanRenderer {
let mut memory = self.memory.borrow_mut(); let mut memory = self.memory.borrow_mut();
memory.dmabuf_sample.clear(); memory.dmabuf_sample.clear();
memory.queue_transfer.clear(); memory.queue_transfer.clear();
let execution = self.allocate_point();
for cmd in opts { for cmd in opts {
if let GfxApiOpt::CopyTexture(c) = cmd { if let GfxApiOpt::CopyTexture(c) = cmd {
let tex = c.tex.clone().into_vk(&self.device.device); let tex = c.tex.clone().into_vk(&self.device.device);
if tex.contents_are_undefined.get() { if tex.contents_are_undefined.get() {
continue; continue;
} }
if tex.execution_version.replace(execution) == execution {
continue;
}
match tex.queue_state.get().acquire(QueueFamily::Gfx) { match tex.queue_state.get().acquire(QueueFamily::Gfx) {
QueueTransfer::Unnecessary => {} QueueTransfer::Unnecessary => {}
QueueTransfer::Possible => memory.queue_transfer.push(tex.clone()), QueueTransfer::Possible => memory.queue_transfer.push(tex.clone()),
@ -1055,6 +1057,7 @@ impl VulkanRenderer {
memory.queue_transfer.clear(); memory.queue_transfer.clear();
memory.wait_semaphores.clear(); memory.wait_semaphores.clear();
memory.release_fence.take(); memory.release_fence.take();
memory.descriptor_buffer.take();
memory.release_sync_file.take() memory.release_sync_file.take()
}; };
res.map(|_| sync_file) res.map(|_| sync_file)

View file

@ -462,6 +462,7 @@ impl VulkanRenderer {
shader_read_only_optimal_descriptor: self.sampler_read_only_descriptor(view), shader_read_only_optimal_descriptor: self.sampler_read_only_descriptor(view),
descriptor_buffer_version: Cell::new(0), descriptor_buffer_version: Cell::new(0),
descriptor_buffer_offset: Cell::new(0), descriptor_buffer_offset: Cell::new(0),
execution_version: Cell::new(0),
}); });
let shm = match &img.ty { let shm = match &img.ty {
VulkanImageMemory::DmaBuf(_) => unreachable!(), VulkanImageMemory::DmaBuf(_) => unreachable!(),