diff --git a/src/gfx_apis/vulkan/blend_buffer.rs b/src/gfx_apis/vulkan/blend_buffer.rs index 15a57ec3..9bc25f98 100644 --- a/src/gfx_apis/vulkan/blend_buffer.rs +++ b/src/gfx_apis/vulkan/blend_buffer.rs @@ -42,6 +42,7 @@ impl VulkanRenderer { if width > limits.max_width || height > limits.max_height { return Err(VulkanError::ImageTooLarge); } + let usage = BLEND_USAGE; let create_info = ImageCreateInfo::default() .image_type(ImageType::TYPE_2D) .format(BLEND_FORMAT.vk_format) @@ -56,7 +57,7 @@ impl VulkanRenderer { height, depth: 1, }) - .usage(BLEND_USAGE); + .usage(usage); let image = unsafe { self.device.device.create_image(&create_info, None) }; let image = image.map_err(VulkanError::CreateImage)?; let destroy_image = OnDrop(|| unsafe { self.device.device.destroy_image(image, None) }); @@ -105,7 +106,7 @@ impl VulkanRenderer { }), ty: VulkanImageMemory::Blend(allocation), bridge: None, - sampled_image_descriptor: self.sampled_image_descriptor(view), + sampled_image_descriptor: self.sampled_image_descriptor(usage, view), execution_version: Default::default(), }); cached.insert_entry(Rc::downgrade(&img)); diff --git a/src/gfx_apis/vulkan/image.rs b/src/gfx_apis/vulkan/image.rs index 72e576ce..21dd6290 100644 --- a/src/gfx_apis/vulkan/image.rs +++ b/src/gfx_apis/vulkan/image.rs @@ -64,7 +64,7 @@ pub struct VulkanImage { pub(super) queue_state: Cell, pub(super) ty: VulkanImageMemory, pub(super) bridge: Option, - pub(super) sampled_image_descriptor: Box<[u8]>, + pub(super) sampled_image_descriptor: Option>, pub(super) execution_version: Cell, } @@ -252,9 +252,16 @@ impl VulkanDevice { } 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> { + if !usage.contains(ImageUsageFlags::SAMPLED) { + return None; + } 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 image_info = DescriptorImageInfo::default() @@ -268,7 +275,7 @@ impl VulkanRenderer { unsafe { 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 { return Err(VulkanError::ImageTooLarge); } + let usage; let image = { let plane_layouts: PlaneVec<_> = self .dmabuf @@ -313,7 +321,7 @@ impl VulkanDmaBufImageTemplate { true => ImageCreateFlags::DISJOINT, false => ImageCreateFlags::empty(), }; - let usage = match for_rendering { + usage = match for_rendering { true => match self.render_needs_bridge { true => ImageUsageFlags::TRANSFER_DST, false => ImageUsageFlags::TRANSFER_SRC | ImageUsageFlags::COLOR_ATTACHMENT, @@ -464,7 +472,7 @@ impl VulkanDmaBufImageTemplate { family: QueueFamily::Gfx, }), 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), })) } diff --git a/src/gfx_apis/vulkan/renderer.rs b/src/gfx_apis/vulkan/renderer.rs index 55ea4867..cdb88bcc 100644 --- a/src/gfx_apis/vulkan/renderer.rs +++ b/src/gfx_apis/vulkan/renderer.rs @@ -624,7 +624,10 @@ impl VulkanRenderer { let layout = self.out_descriptor_set_layout.as_ref().unwrap(); memory.blend_buffer_descriptor_buffer_offset = resource_writer.next_offset(); 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 { writer.write( layout.offsets[1], @@ -653,7 +656,7 @@ impl VulkanRenderer { let mut writer = resource_writer.add_set(tex_descriptor_set_layout); writer.write( 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 { writer.write( diff --git a/src/gfx_apis/vulkan/shm_image.rs b/src/gfx_apis/vulkan/shm_image.rs index 2f50a721..ef7e472c 100644 --- a/src/gfx_apis/vulkan/shm_image.rs +++ b/src/gfx_apis/vulkan/shm_image.rs @@ -476,7 +476,7 @@ impl VulkanRenderer { }), ty: VulkanImageMemory::Internal(shm), bridge: None, - sampled_image_descriptor: self.sampled_image_descriptor(view), + sampled_image_descriptor: self.sampled_image_descriptor(usage, view), execution_version: Cell::new(0), }); let shm = match &img.ty {