]> git.nega.tv - josh/narcissus/commitdiff
Support general layout in image bindings
authorJoshua Simmons <josh@nega.tv>
Thu, 17 Nov 2022 18:26:54 +0000 (19:26 +0100)
committerJoshua Simmons <josh@nega.tv>
Thu, 17 Nov 2022 18:26:54 +0000 (19:26 +0100)
narcissus-gpu/src/lib.rs
narcissus-gpu/src/vulkan.rs
narcissus/src/main.rs

index 07d0b958e6a9a61b09d98459152afc40f8a6b9fd..da4174a945e084072d3a07bd8aff333e5512e5ab 100644 (file)
@@ -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,
index 46a5a6135bfe6bccbedb01bd25a614f6af5af061..bdd72bae78f615ca6f99ec8678ef1801dc124109 100644 (file)
@@ -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()
                         }];
index fbd4ef3a0cff043320db035219ae99e9d210ddf9..1d3ab695771350dff41a54a6574778773c28127d 100644 (file)
@@ -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)]),
                 },
             ],
         );