summaryrefslogtreecommitdiff
path: root/codegen/vulkan/scripts/interfacedocgenerator.py
diff options
context:
space:
mode:
Diffstat (limited to 'codegen/vulkan/scripts/interfacedocgenerator.py')
-rw-r--r--codegen/vulkan/scripts/interfacedocgenerator.py118
1 files changed, 118 insertions, 0 deletions
diff --git a/codegen/vulkan/scripts/interfacedocgenerator.py b/codegen/vulkan/scripts/interfacedocgenerator.py
new file mode 100644
index 00000000..05fafbc0
--- /dev/null
+++ b/codegen/vulkan/scripts/interfacedocgenerator.py
@@ -0,0 +1,118 @@
+#!/usr/bin/python3 -i
+#
+# Copyright 2013-2021 The Khronos Group Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+import re
+from generator import OutputGenerator, write
+
+def interfaceDocSortKey(item):
+ if item == None:
+ return '\0'
+ else:
+ return item.casefold()
+
+class InterfaceDocGenerator(OutputGenerator):
+ """InterfaceDocGenerator - subclass of OutputGenerator.
+ Generates AsciiDoc includes of the interfaces added by a an API version
+ or extension."""
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.features = []
+
+ def beginFile(self, genOpts):
+ OutputGenerator.beginFile(self, genOpts)
+
+ # Create subdirectory, if needed
+ self.makeDir(self.genOpts.directory)
+
+ def beginFeature(self, interface, emit):
+ # Start processing in superclass
+ OutputGenerator.beginFeature(self, interface, emit)
+
+ self.features.append( self.featureName )
+
+ def endFeature(self):
+ # Finish processing in superclass
+ OutputGenerator.endFeature(self)
+
+ def writeNewInterfaces(self, feature, key, title, markup, fp):
+ dict = self.featureDictionary[feature][key]
+
+ parentmarkup = markup
+ if key == 'enumconstant':
+ parentmarkup = 'elink:'
+
+ if dict:
+ write('=== ' + title, file=fp)
+ write('',file=fp)
+
+ # Loop through required blocks, sorted so they start with "core" features
+ for required in sorted(dict, key = interfaceDocSortKey):
+ if required is not None:
+ requiredlink = 'apiext:' + required
+ match = re.search("[A-Z]+_VERSION_([0-9]+)_([0-9]+)",required)
+ if match is not None:
+ major = match.group(1)
+ minor = match.group(2)
+ version = major + '.' + minor
+ requiredlink = '<<versions-' + version + ', Version ' + version + '>>'
+
+ write('ifdef::' + required + '[]', file=fp)
+ write('If ' + requiredlink + ' is supported:', file=fp)
+ write('',file=fp)
+
+ # Commands are relatively straightforward
+ if key == 'command':
+ for api in sorted(dict[required]):
+ write(' * ' + markup + api, file=fp)
+ # Types and constants are potentially parented, so need to handle that
+ else:
+ # Loop through parents, sorted so they start with unparented items
+ for parent in sorted(dict[required], key = interfaceDocSortKey):
+ parentstring = ''
+ if parent:
+ parentstring = parentmarkup + (', ' + markup).join(parent.split(','))
+ write(' * Extending ' + parentstring + ':', file=fp)
+ for api in sorted(dict[required][parent]):
+ write(' ** ' + markup + api, file=fp)
+ else:
+ for api in sorted(dict[required][parent]):
+ write(' * ' + markup + api, file=fp)
+
+ if required is not None:
+ write('endif::' + required + '[]', file=fp)
+ write('',file=fp)
+
+ def makeInterfaceFile(self, feature):
+ """Generate a file containing feature interface documentation in
+ asciidoctor markup form.
+
+ - feature - name of the feature being generated"""
+
+ filename = feature + self.genOpts.conventions.file_suffix
+ fp = open(self.genOpts.directory + '/' + filename, 'w', encoding='utf-8')
+
+ # Write out the lists of new interfaces added by the feature
+ self.writeNewInterfaces(feature, 'define', 'New Macros', 'dlink:', fp)
+ self.writeNewInterfaces(feature, 'basetype', 'New Base Types', 'basetype:',fp)
+ self.writeNewInterfaces(feature, 'handle', 'New Object Types', 'slink:', fp)
+ self.writeNewInterfaces(feature, 'command', 'New Commands', 'flink:', fp)
+ self.writeNewInterfaces(feature, 'struct', 'New Structures', 'slink:', fp)
+ self.writeNewInterfaces(feature, 'union', 'New Unions', 'slink:', fp)
+ self.writeNewInterfaces(feature, 'funcpointer', 'New Function Pointers','tlink:', fp)
+ self.writeNewInterfaces(feature, 'enum', 'New Enums', 'elink:', fp)
+ self.writeNewInterfaces(feature, 'bitmask', 'New Bitmasks', 'tlink:', fp)
+ self.writeNewInterfaces(feature, 'include', 'New Headers', 'code:', fp)
+ self.writeNewInterfaces(feature, 'enumconstant','New Enum Constants', 'ename:', fp)
+
+ fp.close()
+
+ def endFile(self):
+ # Generate metadoc feature files, in refpage and non-refpage form
+ for feature in self.features:
+ self.makeInterfaceFile(feature)
+
+ OutputGenerator.endFile(self)