From 6529dc75160cd4149cb53a9b4f10205e61f6aa7d Mon Sep 17 00:00:00 2001 From: Joshua Simmons Date: Thu, 17 Nov 2022 19:26:54 +0100 Subject: [PATCH] Support general layout in image bindings --- narcissus-gpu/src/lib.rs | 3 ++- narcissus-gpu/src/vulkan.rs | 21 ++++++++------------- narcissus/src/main.rs | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/narcissus-gpu/src/lib.rs b/narcissus-gpu/src/lib.rs index 07d0b95..da4174a 100644 --- a/narcissus-gpu/src/lib.rs +++ b/narcissus-gpu/src/lib.rs @@ -421,7 +421,7 @@ pub struct Bind<'a> { pub enum TypedBind<'a> { Sampler(&'a [Sampler]), - Image(&'a [Image]), + Image(&'a [(ImageLayout, Image)]), UniformBuffer(&'a [Buffer]), StorageBuffer(&'a [Buffer]), } @@ -543,6 +543,7 @@ impl Access { } } +#[derive(Clone, Copy, PartialEq, Eq)] pub enum ImageLayout { Optimal, General, diff --git a/narcissus-gpu/src/vulkan.rs b/narcissus-gpu/src/vulkan.rs index 46a5a61..bdd72ba 100644 --- a/narcissus-gpu/src/vulkan.rs +++ b/narcissus-gpu/src/vulkan.rs @@ -2419,15 +2419,7 @@ impl<'driver> Device for VulkanDevice<'driver> { .get(image_barrier.image.0) .expect("invalid image handle") .image(); - - // TODO: This needs to be pulled from somewhere useful. - let subresource_range = vk::ImageSubresourceRange { - aspect_mask: vk::ImageAspectFlags::COLOR, - base_mip_level: 0, - level_count: 1, - base_array_layer: 0, - layer_count: 1, - }; + let subresource_range = vulkan_subresource_range(&image_barrier.subresource_range); vulkan_image_memory_barrier(image_barrier, image, subresource_range) })); @@ -2566,10 +2558,13 @@ impl<'driver> Device for VulkanDevice<'driver> { } } TypedBind::Image(images) => { - let image_infos_iter = images.iter().map(|image| { + let image_infos_iter = images.iter().map(|(image_layout, image)| { let image_view = self.image_pool.lock().get(image.0).unwrap().image_view(); vk::DescriptorImageInfo { - image_layout: vk::ImageLayout::ShaderReadOnlyOptimal, // TODO: Determine appropriate layout here. + image_layout: match image_layout { + ImageLayout::Optimal => vk::ImageLayout::ReadOnlyOptimal, + ImageLayout::General => vk::ImageLayout::General, + }, image_view, sampler: vk::Sampler::null(), } @@ -2732,9 +2727,9 @@ impl<'driver> Device for VulkanDevice<'driver> { subresource_range: vk::ImageSubresourceRange { aspect_mask: vk::ImageAspectFlags::COLOR, base_mip_level: 0, - level_count: 1, + level_count: !0, base_array_layer: 0, - layer_count: 1, + layer_count: !0, }, ..default() }]; diff --git a/narcissus/src/main.rs b/narcissus/src/main.rs index fbd4ef3..1d3ab69 100644 --- a/narcissus/src/main.rs +++ b/narcissus/src/main.rs @@ -545,7 +545,7 @@ pub fn main() { Bind { binding: 3, array_element: 0, - typed: TypedBind::Image(&[blåhaj_image]), + typed: TypedBind::Image(&[(ImageLayout::Optimal, blåhaj_image)]), }, ], ); -- 2.49.0