diff --git a/generator/src/main/kotlin/com/kylemayes/generator/generate/file/Builders.kt b/generator/src/main/kotlin/com/kylemayes/generator/generate/file/Builders.kt index 208a52e..e1ebd45 100644 --- a/generator/src/main/kotlin/com/kylemayes/generator/generate/file/Builders.kt +++ b/generator/src/main/kotlin/com/kylemayes/generator/generate/file/Builders.kt @@ -2,10 +2,12 @@ package com.kylemayes.generator.generate.file +import com.kylemayes.generator.generate.support.generateCustomBuilderMethods import com.kylemayes.generator.generate.support.generatePtr import com.kylemayes.generator.generate.support.generateRef import com.kylemayes.generator.generate.support.getStructExtensions import com.kylemayes.generator.generate.support.getStructLifetime +import com.kylemayes.generator.generate.support.skipBuilderMethods import com.kylemayes.generator.registry.ArrayType import com.kylemayes.generator.registry.Identifier import com.kylemayes.generator.registry.Member @@ -193,10 +195,11 @@ private fun Registry.generateMethods(struct: Structure): String { // Filter out the fields that do not require builder methods since they will // be set by other builder methods (i.e., array length fields for - // non-optional array fields). + // non-optional array fields) or have custom handling. + val skip = skipBuilderMethods[struct.name.original] ?: setOf() val requireBuilders = members.values.filter { - arraysByLength[it.name].let { a -> a?.optional ?: true } + !skip.contains(it.name.original) && arraysByLength[it.name].let { a -> a?.optional ?: true } } // Generate the builder methods. @@ -235,6 +238,8 @@ private fun Registry.generateMethods(struct: Structure): String { } } + methods.addAll(generateCustomBuilderMethods(struct)) + return methods.joinToString("") } diff --git a/generator/src/main/kotlin/com/kylemayes/generator/generate/support/Builder.kt b/generator/src/main/kotlin/com/kylemayes/generator/generate/support/Builder.kt new file mode 100644 index 0000000..9ee3c0e --- /dev/null +++ b/generator/src/main/kotlin/com/kylemayes/generator/generate/support/Builder.kt @@ -0,0 +1,47 @@ +package com.kylemayes.generator.generate.support + +import com.kylemayes.generator.registry.Registry +import com.kylemayes.generator.registry.Structure +import com.kylemayes.generator.registry.intern + +/** Builder methods to skip (due to handling of special cases below). */ +val skipBuilderMethods = + mapOf( + "VkLayerSettingEXT" to setOf("type", "pValues"), + ) + +/** Generates builder methods for special cases. */ +fun Registry.generateCustomBuilderMethods(struct: Structure): List = + when (struct.name.original) { + "VkLayerSettingEXT" -> generateLayerSettingBuilderMethods(struct) + else -> listOf() + } + +/** Generate one method per type since the type and values fields are linked. */ +private fun Registry.generateLayerSettingBuilderMethods(struct: Structure): List { + val generateType = { type: String -> + when (type) { + "BOOL32" -> "Bool32" + "INT32" -> "i32" + "INT64" -> "i64" + "UINT32" -> "u32" + "UINT64" -> "u64" + "FLOAT32" -> "f32" + "FLOAT64" -> "f64" + "STRING" -> "*const u8" + else -> "()" + } + } + + return this.enums["VkLayerSettingTypeEXT".intern()]!!.variants.map { + """ +#[inline] +pub fn values_${it.name.value.lowercase()}(mut self, values: &[${generateType(it.name.value)}]) -> Self { + self.value.type_ = LayerSettingTypeEXT::${it.name.value}; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); + self +} + """ + } +} diff --git a/vulkanalia/src/vk/builders.rs b/vulkanalia/src/vk/builders.rs index b0367d5..12954d3 100644 --- a/vulkanalia/src/vk/builders.rs +++ b/vulkanalia/src/vk/builders.rs @@ -30003,13 +30003,64 @@ impl<'b> LayerSettingEXTBuilder<'b> { } #[inline] - pub fn type_(mut self, type_: LayerSettingTypeEXT) -> Self { - self.value.type_ = type_; + pub fn values_bool32(mut self, values: &[Bool32]) -> Self { + self.value.type_ = LayerSettingTypeEXT::BOOL32; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); self } #[inline] - pub fn values(mut self, values: &'b [u8]) -> Self { + pub fn values_int32(mut self, values: &[i32]) -> Self { + self.value.type_ = LayerSettingTypeEXT::INT32; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); + self + } + + #[inline] + pub fn values_int64(mut self, values: &[i64]) -> Self { + self.value.type_ = LayerSettingTypeEXT::INT64; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); + self + } + + #[inline] + pub fn values_uint32(mut self, values: &[u32]) -> Self { + self.value.type_ = LayerSettingTypeEXT::UINT32; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); + self + } + + #[inline] + pub fn values_uint64(mut self, values: &[u64]) -> Self { + self.value.type_ = LayerSettingTypeEXT::UINT64; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); + self + } + + #[inline] + pub fn values_float32(mut self, values: &[f32]) -> Self { + self.value.type_ = LayerSettingTypeEXT::FLOAT32; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); + self + } + + #[inline] + pub fn values_float64(mut self, values: &[f64]) -> Self { + self.value.type_ = LayerSettingTypeEXT::FLOAT64; + self.value.value_count = values.len() as u32; + self.value.values = values.as_ptr().cast(); + self + } + + #[inline] + pub fn values_string(mut self, values: &[*const u8]) -> Self { + self.value.type_ = LayerSettingTypeEXT::STRING; self.value.value_count = values.len() as u32; self.value.values = values.as_ptr().cast(); self