Merge pull request #728 from mahkoh/jorth/vulkan-sampled-image
vulkan: don't create sampled-image descriptor for images without samp…
This commit is contained in:
commit
04680081d1
4 changed files with 23 additions and 11 deletions
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue