From f66bcfda08bc0bd634a30fe7e28f2b9fe29df55e Mon Sep 17 00:00:00 2001 From: Charles Giessen Date: Tue, 4 Jan 2022 14:42:31 -0600 Subject: vulkaninfo: Support structs from multiple extensions VkPhysicalDeviceIDProperties can come from 1.1 but also from support for multiple extensions. This makes the autogen properly check that one of the required extensions is supported. --- scripts/vulkaninfo_generator.py | 47 +++++++++++++++++++++---------------- vulkaninfo/generated/vulkaninfo.hpp | 2 +- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/scripts/vulkaninfo_generator.py b/scripts/vulkaninfo_generator.py index 3e569809..572f63c2 100644 --- a/scripts/vulkaninfo_generator.py +++ b/scripts/vulkaninfo_generator.py @@ -214,7 +214,9 @@ class VulkanInfoGenerator(OutputGenerator): for node in self.registry.reg.find('extensions').findall('extension'): ext = VulkanExtension(node) for item in ext.vktypes: - self.extTypes[item] = ext + if item not in self.extTypes: + self.extTypes[item] = [] + self.extTypes[item].append(ext) for item in ext.vkfuncs: self.extFuncs[item] = ext @@ -383,7 +385,7 @@ def GetExtension(name, generator): if name in generator.extFuncs: return generator.extFuncs[name] elif name in generator.extTypes: - return generator.extTypes[name] + return generator.extTypes[name][0] else: return None @@ -676,15 +678,12 @@ def PrintChainIterator(listName, structures, all_structures, checkExtLoc, extTyp if s.sTypeName is None: continue - extNameStr = None - extType = None - for k, e in extTypes.items(): + extEnables = {} + for k, elem in extTypes.items(): if k == s.name or (s.name in aliases.keys() and k in aliases[s.name]): - if e.extNameStr is not None: - extNameStr = e.extNameStr - if e.type is not None: - extType = e.type - break + for e in elem: + extEnables[e.extNameStr] = e.type + version = None oldVersionName = None for v in vulkan_versions: @@ -698,18 +697,25 @@ def PrintChainIterator(listName, structures, all_structures, checkExtLoc, extTyp out += AddGuardHeader(s) out += f" if (structure->sType == {s.sTypeName}" has_version = version is not None - has_extNameStr = extNameStr is not None or s.name in aliases.keys() + has_extNameStr = len(extEnables) > 0 or s.name in aliases.keys() if has_version or has_extNameStr: out += f" && \n (" + has_printed_condition = False if has_extNameStr: - if extType == "device": - out += f"gpu.CheckPhysicalDeviceExtensionIncluded({extNameStr})" - elif extType == "instance": - out += f"inst.CheckExtensionEnabled({extNameStr})" - if has_version and extType is not None: - out += f" ||\n " + for key, value in extEnables.items(): + if has_printed_condition: + out += f' || ' + has_printed_condition = True + if value == "device": + out += f"gpu.CheckPhysicalDeviceExtensionIncluded({key})" + elif value == "instance": + out += f"inst.CheckExtensionEnabled({key})" + else: + assert(False and "Should never get here") if has_version: + if has_printed_condition: + out += f' ||\n ' out += f"{version_desc}.minor >= {str(version)}" out += f")" out += f") {{\n" @@ -926,10 +932,11 @@ class VulkanStructure: self.members.append(VulkanVariable( node, constants, self.name)) - for k, e in extTypes.items(): + for k, elem in extTypes.items(): if k == self.name: - if e.guard is not None: - self.guard = e.guard + for e in elem: + if e.guard is not None: + self.guard = e.guard class VulkanExtension: diff --git a/vulkaninfo/generated/vulkaninfo.hpp b/vulkaninfo/generated/vulkaninfo.hpp index e3676fd0..0bd71061 100644 --- a/vulkaninfo/generated/vulkaninfo.hpp +++ b/vulkaninfo/generated/vulkaninfo.hpp @@ -3201,7 +3201,7 @@ void chain_iterator_phys_device_props2(Printer &p, AppInstance &inst, AppGpu &gp p.AddNewline(); } if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES && - (inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME) || + (inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME) || inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME) || inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME) || gpu.api_version.minor >= 1)) { VkPhysicalDeviceIDProperties* props = (VkPhysicalDeviceIDProperties*)structure; DumpVkPhysicalDeviceIDProperties(p, gpu.api_version.minor >= 1 ?"VkPhysicalDeviceIDProperties":"VkPhysicalDeviceIDPropertiesKHR", *props); -- cgit v1.2.3