From 26c77869da24acb0c57acd576aaf7f23f714cd05 Mon Sep 17 00:00:00 2001
From: Marijn Suijten <marijn@traverseresearch.nl>
Date: Mon, 1 May 2023 23:05:11 +0200
Subject: [PATCH 1/2] Expose `FramebufferCreateInfo::attachment_count` builder
 for `IMAGELESS`

Don't omit the `attachment_count()` builder method, because it is valid
to set the number of attachments without providing attachments in the
`IMAGELESS` case.

Also change the generator array lookup to use the name of the count
field that is allowed to have a builder method, rather than the name of
the field that would use this as `len` field and hence cause it to be
skipped.
---
 ash/src/vk/definitions.rs |  5 +++++
 generator/src/lib.rs      | 15 ++++++++++-----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/ash/src/vk/definitions.rs b/ash/src/vk/definitions.rs
index 69ea14291..b3845bbcc 100644
--- a/ash/src/vk/definitions.rs
+++ b/ash/src/vk/definitions.rs
@@ -7276,6 +7276,11 @@ impl<'a> FramebufferCreateInfo<'a> {
         self
     }
     #[inline]
+    pub fn attachment_count(mut self, attachment_count: u32) -> Self {
+        self.attachment_count = attachment_count;
+        self
+    }
+    #[inline]
     pub fn attachments(mut self, attachments: &'a [ImageView]) -> Self {
         self.attachment_count = attachments.len() as _;
         self.p_attachments = attachments.as_ptr();
diff --git a/generator/src/lib.rs b/generator/src/lib.rs
index 6e0521037..0040f640c 100644
--- a/generator/src/lib.rs
+++ b/generator/src/lib.rs
@@ -1786,10 +1786,15 @@ pub fn derive_setters(
     // Must either have both, or none:
     assert_eq!(next_field.is_some(), structure_type_field.is_some());
 
-    let nofilter_count_members = [
-        ("VkPipelineViewportStateCreateInfo", "pViewports"),
-        ("VkPipelineViewportStateCreateInfo", "pScissors"),
-        ("VkDescriptorSetLayoutBinding", "pImmutableSamplers"),
+    let allowed_count_members = [
+        // pViewports is allowed to be empty if the viewport state is empty
+        ("VkPipelineViewportStateCreateInfo", "viewportCount"),
+        // Must match viewportCount
+        ("VkPipelineViewportStateCreateInfo", "scissorCount"),
+        // descriptorCount is settable regardless of having pImmutableSamplers
+        ("VkDescriptorSetLayoutBinding", "descriptorCount"),
+        // No ImageView attachments when VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT is set
+        ("VkFramebufferCreateInfo", "attachmentCount"),
     ];
     let filter_members: Vec<String> = members
         .iter()
@@ -1799,7 +1804,7 @@ pub fn derive_setters(
             // Associated _count members
             if field.array.is_some() {
                 if let Some(ref array_size) = field.size {
-                    if !nofilter_count_members.contains(&(&struct_.name, field_name)) {
+                    if !allowed_count_members.contains(&(&struct_.name, array_size)) {
                         return Some((*array_size).clone());
                     }
                 }

From 28fbd7c392b71a822bd2fc14f5e3a052907e02b2 Mon Sep 17 00:00:00 2001
From: Marijn Suijten <marijn@traverseresearch.nl>
Date: Mon, 1 May 2023 23:16:22 +0200
Subject: [PATCH 2/2] Clean up clones

---
 generator/src/lib.rs | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/generator/src/lib.rs b/generator/src/lib.rs
index 0040f640c..18231a555 100644
--- a/generator/src/lib.rs
+++ b/generator/src/lib.rs
@@ -1796,28 +1796,21 @@ pub fn derive_setters(
         // No ImageView attachments when VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT is set
         ("VkFramebufferCreateInfo", "attachmentCount"),
     ];
-    let filter_members: Vec<String> = members
+    let filter_members = members
         .iter()
         .filter_map(|(field, _)| {
-            let field_name = field.name.as_ref().unwrap();
-
             // Associated _count members
             if field.array.is_some() {
-                if let Some(ref array_size) = field.size {
+                if let Some(array_size) = &field.size {
                     if !allowed_count_members.contains(&(&struct_.name, array_size)) {
-                        return Some((*array_size).clone());
+                        return Some(array_size);
                     }
                 }
             }
 
-            // VkShaderModuleCreateInfo requires a custom setter
-            if field_name == "codeSize" {
-                return Some(field_name.clone());
-            }
-
             None
         })
-        .collect();
+        .collect::<Vec<_>>();
 
     let setters = members.iter().filter_map(|(field, deprecated)| {
         let deprecated = deprecated.as_ref().map(|d| quote!(#d #[allow(deprecated)]));
@@ -1836,12 +1829,15 @@ pub fn derive_setters(
         let mut param_ident_short = format_ident!("{}", param_ident_short);
 
         if let Some(name) = field.name.as_ref() {
-            // Filter
-            if filter_members.iter().any(|n| *n == *name) {
+            if filter_members.contains(&name) {
                 return None;
             }
 
             // Unique cases
+            if struct_.name == "VkShaderModuleCreateInfo" && name == "codeSize" {
+                return None;
+            }
+
             if struct_.name == "VkShaderModuleCreateInfo" && name == "pCode" {
                 return Some(quote!{
                     #[inline]