aboutsummaryrefslogtreecommitdiff
path: root/scripts/vulkaninfo_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/vulkaninfo_generator.py')
-rw-r--r--scripts/vulkaninfo_generator.py84
1 files changed, 78 insertions, 6 deletions
diff --git a/scripts/vulkaninfo_generator.py b/scripts/vulkaninfo_generator.py
index 2062115d..71a2aed2 100644
--- a/scripts/vulkaninfo_generator.py
+++ b/scripts/vulkaninfo_generator.py
@@ -225,6 +225,7 @@ class VulkanInfoGenerator(OutputGenerator):
self.enums = []
self.flags = []
self.bitmasks = []
+ self.format_ranges = []
self.all_structures = []
self.aliases = OrderedDict()
@@ -260,6 +261,8 @@ class VulkanInfoGenerator(OutputGenerator):
self.vulkan_versions.append(VulkanVersion(ver))
def endFile(self):
+ self.findFormatRanges()
+
# gather the types that are needed to generate
types_to_gen = set()
for s in enums_to_gen:
@@ -340,6 +343,13 @@ class VulkanInfoGenerator(OutputGenerator):
for s in (x for x in self.all_structures if x.name in struct_short_versions_to_gen):
out += PrintStructShort(s)
+ out += 'auto format_ranges = std::array{\n'
+ for f in self.format_ranges:
+ out += f' FormatRange{{{f.minimum_instance_version}, {f.extension_name if f.extension_name is not None else "nullptr"}, '
+ out += f'static_cast<VkFormat>({f.first_format}), static_cast<VkFormat>({f.last_format})}},\n'
+ out += '};\n'
+
+
gen.write(out, file=self.outFile)
gen.OutputGenerator.endFile(self)
@@ -395,6 +405,62 @@ class VulkanInfoGenerator(OutputGenerator):
if value.get('exclude') is None or name not in value.get('exclude'):
self.extension_sets[key].add(name)
+ # finds all the ranges of formats from core (1.0), core versions (1.1+), and extensions
+ def findFormatRanges(self):
+ for enums in self.registry.reg.findall('enums'):
+ if enums.get('name') == 'VkFormat':
+ min_val = 2**32
+ max_val = 0
+ for enum in enums.findall('enum'):
+ if enum.get('value') is None:
+ continue
+ value = int(enum.get('value'))
+ min_val = min(min_val, value)
+ max_val = max(max_val, value)
+ if min_val < 2**32 and max_val > 0:
+ self.format_ranges.append(VulkanFormatRange(0,None, min_val, max_val))
+
+ for feature in self.registry.reg.findall('feature'):
+ for require in feature.findall('require'):
+ comment = require.get('comment')
+ original_ext = None
+ if comment is not None and comment.find('Promoted from') >= 0:
+ # may need tweaking in the future - some ext names aren't just the upper case version
+ original_ext = comment.split(' ')[2].upper() + '_EXTENSION_NAME'
+ min_val = 2**32
+ max_val = 0
+ for enum in require.findall('enum'):
+ if enum.get('extends') == 'VkFormat':
+ value = CalcEnumValue(int(enum.get('extnumber')), int(enum.get('offset')))
+ min_val = min(min_val, value)
+ max_val = max(max_val, value)
+ if min_val < 2**32 and max_val > 0:
+ self.format_ranges.append(VulkanFormatRange(feature.get('number').split('.')[1],None, min_val, max_val))
+ # If the formats came from an extension, add a format range for that extension so it'll be printed if the ext is supported but not the core version
+ if original_ext is not None:
+ self.format_ranges.append(VulkanFormatRange(0,original_ext, min_val, max_val))
+
+ for extension in self.registry.reg.find('extensions').findall('extension'):
+ if extension.get('supported') in ['disabled', 'vulkansc']:
+ continue
+
+ min_val = 2**32
+ max_val = 0
+ enum_name_string = ''
+ for require in extension.findall('require'):
+ for enum in require.findall('enum'):
+ if enum.get('value') is not None and enum.get('value').find(extension.get('name')):
+ enum_name_string = enum.get('name')
+ if enum.get('extends') == 'VkFormat':
+ if enum.get('offset') is None:
+ continue
+ value = CalcEnumValue(int(extension.get('number')), int(enum.get('offset')))
+ min_val = min(min_val, value)
+ max_val = max(max_val, value)
+ if min_val < 2**32 and max_val > 0:
+ self.format_ranges.append(VulkanFormatRange(0, enum_name_string, min_val, max_val))
+
+
def GatherTypesToGen(structure_list, structures, exclude = []):
if exclude == None:
@@ -438,6 +504,10 @@ def AddGuardFooter(obj):
else:
return ""
+def CalcEnumValue(num, offset):
+ base = 1000000000
+ block_size = 1000
+ return base + (num - 1) * block_size + offset
def PrintEnumToString(enum, gen):
out = ''
@@ -871,12 +941,7 @@ class VulkanEnum:
continue
if childExtends is not None and childExtNum is not None and childOffset is not None:
- enumNegative = False
- extNum = int(childExtNum)
- extOffset = int(childOffset)
- extBase = 1000000000
- extBlockSize = 1000
- childValue = extBase + (extNum - 1) * extBlockSize + extOffset
+ childValue = CalcEnumValue(int(childExtNum), int(childOffset))
if ('dir' in child.keys()):
childValue = -childValue
duplicate = False
@@ -1079,3 +1144,10 @@ class VulkanVersion:
for enum in req.findall('enum'):
self.names.add(enum.get('name'))
self.names = sorted(self.names)
+
+class VulkanFormatRange:
+ def __init__(self, min_inst_version, ext_name, first, last):
+ self.minimum_instance_version = min_inst_version
+ self.extension_name = ext_name
+ self.first_format = first
+ self.last_format = last