1
0
Fork 0
forked from wry/wry

vulkan: don't create sampled-image descriptor for images without sample usage

This commit is contained in:
Julian Orth 2026-01-24 23:01:05 +01:00
parent 2fb26331c2
commit b22ec9a1fa
4 changed files with 23 additions and 11 deletions

View file

@ -42,6 +42,7 @@ impl VulkanRenderer {
if width > limits.max_width || height > limits.max_height { if width > limits.max_width || height > limits.max_height {
return Err(VulkanError::ImageTooLarge); return Err(VulkanError::ImageTooLarge);
} }
let usage = BLEND_USAGE;
let create_info = ImageCreateInfo::default() let create_info = ImageCreateInfo::default()
.image_type(ImageType::TYPE_2D) .image_type(ImageType::TYPE_2D)
.format(BLEND_FORMAT.vk_format) .format(BLEND_FORMAT.vk_format)
@ -56,7 +57,7 @@ impl VulkanRenderer {
height, height,
depth: 1, depth: 1,
}) })
.usage(BLEND_USAGE); .usage(usage);
let image = unsafe { self.device.device.create_image(&create_info, None) }; let image = unsafe { self.device.device.create_image(&create_info, None) };
let image = image.map_err(VulkanError::CreateImage)?; let image = image.map_err(VulkanError::CreateImage)?;
let destroy_image = OnDrop(|| unsafe { self.device.device.destroy_image(image, None) }); let destroy_image = OnDrop(|| unsafe { self.device.device.destroy_image(image, None) });
@ -105,7 +106,7 @@ impl VulkanRenderer {
}), }),
ty: VulkanImageMemory::Blend(allocation), ty: VulkanImageMemory::Blend(allocation),
bridge: None, bridge: None,
sampled_image_descriptor: self.sampled_image_descriptor(view), sampled_image_descriptor: self.sampled_image_descriptor(usage, view),
execution_version: Default::default(), execution_version: Default::default(),
}); });
cached.insert_entry(Rc::downgrade(&img)); cached.insert_entry(Rc::downgrade(&img));

View file

@ -64,7 +64,7 @@ pub struct VulkanImage {
pub(super) queue_state: Cell<QueueState>, pub(super) queue_state: Cell<QueueState>,
pub(super) ty: VulkanImageMemory, pub(super) ty: VulkanImageMemory,
pub(super) bridge: Option<VulkanFramebufferBridge>, pub(super) bridge: Option<VulkanFramebufferBridge>,
pub(super) sampled_image_descriptor: Box<[u8]>, pub(super) sampled_image_descriptor: Option<Box<[u8]>>,
pub(super) execution_version: Cell<u64>, pub(super) execution_version: Cell<u64>,
} }
@ -252,9 +252,16 @@ impl VulkanDevice {
} }
impl VulkanRenderer { impl VulkanRenderer {
pub(super) fn sampled_image_descriptor(&self, view: ImageView) -> Box<[u8]> { pub(super) fn sampled_image_descriptor(
&self,
usage: ImageUsageFlags,
view: ImageView,
) -> Option<Box<[u8]>> {
if !usage.contains(ImageUsageFlags::SAMPLED) {
return None;
}
let Some(db) = &self.device.descriptor_buffer else { let Some(db) = &self.device.descriptor_buffer else {
return Box::new([]); return None;
}; };
let mut buf = vec![0; self.device.sampled_image_descriptor_size].into_boxed_slice(); let mut buf = vec![0; self.device.sampled_image_descriptor_size].into_boxed_slice();
let image_info = DescriptorImageInfo::default() let image_info = DescriptorImageInfo::default()
@ -268,7 +275,7 @@ impl VulkanRenderer {
unsafe { unsafe {
db.get_descriptor(&info, &mut buf); db.get_descriptor(&info, &mut buf);
} }
buf Some(buf)
} }
} }
@ -291,6 +298,7 @@ impl VulkanDmaBufImageTemplate {
if self.width > limits.max_width || self.height > limits.max_height { if self.width > limits.max_width || self.height > limits.max_height {
return Err(VulkanError::ImageTooLarge); return Err(VulkanError::ImageTooLarge);
} }
let usage;
let image = { let image = {
let plane_layouts: PlaneVec<_> = self let plane_layouts: PlaneVec<_> = self
.dmabuf .dmabuf
@ -313,7 +321,7 @@ impl VulkanDmaBufImageTemplate {
true => ImageCreateFlags::DISJOINT, true => ImageCreateFlags::DISJOINT,
false => ImageCreateFlags::empty(), false => ImageCreateFlags::empty(),
}; };
let usage = match for_rendering { usage = match for_rendering {
true => match self.render_needs_bridge { true => match self.render_needs_bridge {
true => ImageUsageFlags::TRANSFER_DST, true => ImageUsageFlags::TRANSFER_DST,
false => ImageUsageFlags::TRANSFER_SRC | ImageUsageFlags::COLOR_ATTACHMENT, false => ImageUsageFlags::TRANSFER_SRC | ImageUsageFlags::COLOR_ATTACHMENT,
@ -464,7 +472,7 @@ impl VulkanDmaBufImageTemplate {
family: QueueFamily::Gfx, family: QueueFamily::Gfx,
}), }),
bridge, bridge,
sampled_image_descriptor: self.renderer.sampled_image_descriptor(texture_view), sampled_image_descriptor: self.renderer.sampled_image_descriptor(usage, texture_view),
execution_version: Cell::new(0), execution_version: Cell::new(0),
})) }))
} }

View file

@ -624,7 +624,10 @@ impl VulkanRenderer {
let layout = self.out_descriptor_set_layout.as_ref().unwrap(); let layout = self.out_descriptor_set_layout.as_ref().unwrap();
memory.blend_buffer_descriptor_buffer_offset = resource_writer.next_offset(); memory.blend_buffer_descriptor_buffer_offset = resource_writer.next_offset();
let mut writer = resource_writer.add_set(layout); let mut writer = resource_writer.add_set(layout);
writer.write(layout.offsets[0], &bb.sampled_image_descriptor); writer.write(
layout.offsets[0],
bb.sampled_image_descriptor.as_ref().unwrap(),
);
if let Some(addr) = memory.blend_buffer_color_management_data_address { if let Some(addr) = memory.blend_buffer_color_management_data_address {
writer.write( writer.write(
layout.offsets[1], layout.offsets[1],
@ -653,7 +656,7 @@ impl VulkanRenderer {
let mut writer = resource_writer.add_set(tex_descriptor_set_layout); let mut writer = resource_writer.add_set(tex_descriptor_set_layout);
writer.write( writer.write(
tex_descriptor_set_layout.offsets[0], tex_descriptor_set_layout.offsets[0],
&tex.sampled_image_descriptor, tex.sampled_image_descriptor.as_ref().unwrap(),
); );
if let Some(addr) = c.color_management_data_address { if let Some(addr) = c.color_management_data_address {
writer.write( writer.write(

View file

@ -476,7 +476,7 @@ impl VulkanRenderer {
}), }),
ty: VulkanImageMemory::Internal(shm), ty: VulkanImageMemory::Internal(shm),
bridge: None, bridge: None,
sampled_image_descriptor: self.sampled_image_descriptor(view), sampled_image_descriptor: self.sampled_image_descriptor(usage, view),
execution_version: Cell::new(0), execution_version: Cell::new(0),
}); });
let shm = match &img.ty { let shm = match &img.ty {