aboutsummaryrefslogtreecommitdiff
path: root/autogen/fns.rs
diff options
context:
space:
mode:
Diffstat (limited to 'autogen/fns.rs')
-rw-r--r--autogen/fns.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/autogen/fns.rs b/autogen/fns.rs
new file mode 100644
index 0000000..da25938
--- /dev/null
+++ b/autogen/fns.rs
@@ -0,0 +1,79 @@
+// Copyright (c) 2021 The Vulkano developers
+// Licensed under the Apache License, Version 2.0
+// <LICENSE-APACHE or
+// https://www.apache.org/licenses/LICENSE-2.0> or the MIT
+// license <LICENSE-MIT or https://opensource.org/licenses/MIT>,
+// at your option. All files in the project carrying such
+// notice may not be copied, modified, or distributed except
+// according to those terms.
+
+use heck::{CamelCase, SnakeCase};
+use indexmap::IndexMap;
+use std::io::Write;
+use vk_parse::{Extension, ExtensionChild, InterfaceItem};
+
+pub fn write<W: Write>(writer: &mut W, extensions: &IndexMap<&str, &Extension>) {
+ write_fns(writer, std::iter::empty(), "Entry");
+ write!(writer, "\n\n").unwrap();
+ write_fns(
+ writer,
+ make_vulkano_extension_fns("instance", &extensions),
+ "Instance",
+ );
+ write!(writer, "\n\n").unwrap();
+ write_fns(
+ writer,
+ make_vulkano_extension_fns("device", &extensions),
+ "Device",
+ );
+}
+
+#[derive(Clone, Debug)]
+struct VulkanoFns {
+ member: String,
+ fn_struct: String,
+}
+
+fn make_vulkano_extension_fns(
+ ty: &str,
+ extensions: &IndexMap<&str, &Extension>,
+) -> Vec<VulkanoFns> {
+ extensions
+ .values()
+ .filter(|ext| ext.ext_type.as_ref().unwrap() == ty)
+ // Filter only extensions that have functions
+ .filter(|ext| {
+ ext.children.iter().any(|ch| {
+ if let ExtensionChild::Require { items, .. } = ch {
+ items
+ .iter()
+ .any(|i| matches!(i, InterfaceItem::Command { .. }))
+ } else {
+ false
+ }
+ })
+ })
+ .map(|ext| {
+ let member = ext.name.strip_prefix("VK_").unwrap().to_snake_case();
+ let fn_struct = member.to_camel_case() + "Fn";
+ VulkanoFns { member, fn_struct }
+ })
+ .collect()
+}
+
+fn write_fns<W, I>(writer: &mut W, extension_fns: I, ty: &str)
+where
+ W: Write,
+ I: IntoIterator<Item = VulkanoFns>,
+{
+ write!(writer, "crate::fns::fns!({}Functions, {{", ty).unwrap();
+
+ for version in std::array::IntoIter::new(["1_0", "1_1", "1_2"]) {
+ write!(writer, "\n\tv{} => {}FnV{0},", version, ty).unwrap();
+ }
+
+ for ext in extension_fns {
+ write!(writer, "\n\t{} => {},", ext.member, ext.fn_struct).unwrap();
+ }
+ write!(writer, "\n}});").unwrap();
+}