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]