diff options
Diffstat (limited to 'scripts/vulkaninfo_generator.py')
| -rw-r--r-- | scripts/vulkaninfo_generator.py | 108 |
1 files changed, 63 insertions, 45 deletions
diff --git a/scripts/vulkaninfo_generator.py b/scripts/vulkaninfo_generator.py index 1ddcc428..3f0e2be7 100644 --- a/scripts/vulkaninfo_generator.py +++ b/scripts/vulkaninfo_generator.py @@ -59,20 +59,15 @@ license_header = ''' ''' custom_formatters = r''' -void DumpVkConformanceVersion(Printer &p, std::string name, VkConformanceVersion &c) { - p.PrintKeyString("conformanceVersion", std::to_string(c.major)+ "." + std::to_string(c.minor) + "." + std::to_string(c.subminor) + "." - + std::to_string(c.patch)); -} - template <typename T> -std::string to_hex_str(T i) { +std::string to_hex_str(const T i) { std::stringstream stream; stream << "0x" << std::setfill('0') << std::setw(sizeof(T)) << std::hex << i; return stream.str(); } template <typename T> -std::string to_hex_str(Printer &p, T i) { +std::string to_hex_str(Printer &p, const T i) { if (p.Type() == OutputType::json) return std::to_string(i); else if (p.Type() == OutputType::vkconfig_output) @@ -89,7 +84,7 @@ structures_to_gen = ['VkExtent3D', 'VkExtent2D', 'VkPhysicalDeviceLimits', 'VkPh 'VkSurfaceCapabilitiesKHR', 'VkSurfaceFormatKHR', 'VkLayerProperties', 'VkPhysicalDeviceToolProperties'] enums_to_gen = ['VkResult', 'VkFormat', 'VkPresentModeKHR', 'VkPhysicalDeviceType', 'VkImageTiling'] -flags_to_gen = ['VkSurfaceTransformFlagsKHR', 'VkCompositeAlphaFlagsKHR', 'VkSurfaceCounterFlagsEXT', +flags_to_gen = ['VkSurfaceTransformFlagsKHR', 'VkCompositeAlphaFlagsKHR', 'VkSurfaceCounterFlagsEXT', 'VkQueueFlags', 'VkDeviceGroupPresentModeFlagsKHR', 'VkFormatFeatureFlags', 'VkFormatFeatureFlags2', 'VkMemoryPropertyFlags', 'VkMemoryHeapFlags'] flags_strings_to_gen = ['VkQueueFlags'] @@ -98,12 +93,17 @@ struct_short_versions_to_gen = ['VkExtent3D'] struct_comparisons_to_gen = ['VkSurfaceFormatKHR', 'VkSurfaceFormat2KHR', 'VkSurfaceCapabilitiesKHR', 'VkSurfaceCapabilities2KHR', 'VkSurfaceCapabilities2EXT'] # don't generate these structures -struct_blacklist = ['VkConformanceVersion'] +struct_blacklist = ['VkVideoProfilesKHR', 'VkVideoProfileKHR', 'VkDrmFormatModifierPropertiesListEXT', 'VkDrmFormatModifierPropertiesEXT', 'VkDrmFormatModifierPropertiesList2EXT'] + +# generate these structures such that they only print when not in json mode (as json wants them separate) +portability_structs = ['VkPhysicalDevicePortabilitySubsetFeaturesKHR', 'VkPhysicalDevicePortabilitySubsetPropertiesKHR'] # iostream or custom outputter handles these types predefined_types = ['char', 'VkBool32', 'uint32_t', 'uint8_t', 'int32_t', 'float', 'uint64_t', 'size_t', 'VkDeviceSize', 'int64_t'] +names_to_ignore = ['sType', 'pNext', 'stdProfileIdc'] + EXTENSION_TYPE_INSTANCE = 'instance' EXTENSION_TYPE_DEVICE = 'device' EXTENSION_TYPE_BOTH = 'both' @@ -364,24 +364,24 @@ class VulkanInfoGenerator(OutputGenerator): return for key, value in EXTENSION_CATEGORIES.items(): - if typeinfo.elem.get('structextends') == value.get('extends'): + if str(typeinfo.elem.get('structextends')).find(value.get('extends')) != -1: self.extension_sets[key].add(name) def GatherTypesToGen(structure_list, structures): types = set() + for s in structures: + types.add(s) added_stuff = True # repeat until no new types are added while added_stuff == True: added_stuff = False - for s in (x for x in structure_list if x.name in structures): - size = len(types) - types.add(s.name) - if len(types) != size: - added_stuff = True - for m in s.members: - if m.typeID not in predefined_types and m.name not in ['sType', 'pNext']: - types.add(m.typeID) - types = sorted(types) + for s in structure_list: + if s.name in types: + for m in s.members: + if m.typeID not in predefined_types and m.name not in names_to_ignore: + if m.typeID not in types: + types.add(m.typeID) + added_stuff = True return types @@ -425,10 +425,10 @@ def PrintEnum(enum, gen): out = '' out += AddGuardHeader(GetExtension(enum.name, gen)) out += f"""void Dump{enum.name}(Printer &p, std::string name, {enum.name} value) {{ - if (p.Type() == OutputType::json) {{ - p.PrintKeyValue(name, value); - }} else {{ - p.PrintKeyString(name, {enum.name}String(value));\n }} + if (p.Type() == OutputType::json) + p.PrintKeyString(name, std::string("VK_") + {enum.name}String(value)); + else + p.PrintKeyString(name, {enum.name}String(value)); }} """ out += AddGuardFooter(GetExtension(enum.name, gen)) @@ -451,17 +451,19 @@ def PrintGetFlagStrings(name, bitmask): def PrintFlags(bitmask, name): out = f"void Dump{name}(Printer &p, std::string name, {name} value) {{\n" - out += f""" if (p.Type() == OutputType::json) {{ p.PrintKeyValue(name, value); return; }} - if (static_cast<{bitmask.name}>(value) == 0) {{ + out += f""" if (static_cast<{bitmask.name}>(value) == 0) {{ ArrayWrapper arr(p, name, 0); - if (p.Type() != OutputType::vkconfig_output) + if (p.Type() != OutputType::json && p.Type() != OutputType::vkconfig_output) p.SetAsType().PrintString("None"); return; }} auto strings = {bitmask.name}GetStrings(static_cast<{bitmask.name}>(value)); ArrayWrapper arr(p, name, strings.size()); for(auto& str : strings){{ - p.SetAsType().PrintString(str); + if (p.Type() == OutputType::json) + p.SetAsType().PrintString(std::string("VK_") + str); + else + p.SetAsType().PrintString(str); }} }} """ @@ -471,7 +473,8 @@ def PrintFlags(bitmask, name): def PrintFlagBits(bitmask): return f"""void Dump{bitmask.name}(Printer &p, std::string name, {bitmask.name} value) {{ auto strings = {bitmask.name}GetStrings(value); - p.PrintKeyString(name, strings.at(0)); + if (strings.size() > 0) + p.PrintKeyString(name, strings.at(0)); }} """ @@ -517,7 +520,7 @@ def PrintStructure(struct, types_to_gen, structure_names, aliases): if len(v.name) > max_key_len: max_key_len = len(v.name) - out += f"void Dump{struct.name}(Printer &p, std::string name, {struct.name} &obj) {{\n" + out += f"void Dump{struct.name}(Printer &p, std::string name, const {struct.name} &obj) {{\n" if struct.name == "VkPhysicalDeviceLimits": out += f" if (p.Type() == OutputType::json)\n" out += f' p.ObjectStart("limits");\n' @@ -539,15 +542,23 @@ def PrintStructure(struct, types_to_gen, structure_names, aliases): if v.typeID == "char": out += f' p.PrintKeyString("{v.name}", obj.{v.name});\n' # uuid's - elif (v.arrayLength == str(16) and v.typeID == "uint8_t"): # VK_UUID_SIZE - out += f' p.PrintKeyString("{v.name}", to_string_16(obj.{v.name}));\n' - elif (v.arrayLength == str(8) and v.typeID == "uint8_t"): # VK_LUID_SIZE - out += f" if (obj.deviceLUIDValid)" # special case - out += f' p.PrintKeyString("{v.name}", to_string_8(obj.{v.name}));\n' - elif struct.name == "VkQueueFamilyGlobalPriorityPropertiesEXT" and v.name == "priorities": + elif v.typeID == "uint8_t" and (v.arrayLength == '8' or v.arrayLength == '16'): # VK_UUID_SIZE + if v.arrayLength == '8': + out += ' if (obj.deviceLUIDValid) { // special case\n' + out += f''' if (p.Type() == OutputType::json) {{ + ArrayWrapper arr(p, "{v.name}"); + for (uint32_t i = 0; i < {v.arrayLength}; i++) p.PrintElement(static_cast<uint32_t>(obj.{v.name}[i])); + }} else + p.PrintKeyString("{v.name}", to_string_{v.arrayLength}(obj.{v.name}));\n''' + if v.arrayLength == '8': + out += ' }\n' + elif struct.name == "VkQueueFamilyGlobalPriorityPropertiesKHR" and v.name == "priorities": out += f' ArrayWrapper arr(p,"{v.name}", obj.priorityCount);\n' out += f" for (uint32_t i = 0; i < obj.priorityCount; i++) {{\n" - out += f' Dump{v.typeID}(p, "{v.name}", obj.{v.name}[i]);\n' + out += f' if (p.Type() == OutputType::json)\n' + out += f' p.PrintString(std::string("VK_") + VkQueueGlobalPriorityKHRString(obj.priorities[i]));\n' + out += f' else\n' + out += f' p.PrintString(VkQueueGlobalPriorityKHRString(obj.priorities[i]));\n' out += f" }}\n" elif v.arrayLength.isdigit(): out += f' {{ ArrayWrapper arr(p,"{v.name}", ' + v.arrayLength + ');\n' @@ -567,15 +578,16 @@ def PrintStructure(struct, types_to_gen, structure_names, aliases): out += f" }}\n" elif v.typeID == "VkBool32": out += f' p.PrintKeyBool("{v.name}", static_cast<bool>(obj.{v.name}));\n' - elif v.typeID == "VkConformanceVersion": - out += f' DumpVkConformanceVersion(p, "conformanceVersion", obj.{v.name});\n' + elif v.typeID == 'uint8_t': + out += f' p.PrintKeyValue("{v.name}", static_cast<uint32_t>(obj.{v.name}));\n' elif v.typeID == "VkDeviceSize": out += f' p.PrintKeyValue("{v.name}", to_hex_str(p, obj.{v.name}));\n' elif v.typeID in predefined_types: out += f' p.PrintKeyValue("{v.name}", obj.{v.name});\n' - elif v.name not in ['sType', 'pNext']: + elif v.name not in names_to_ignore: # if it is an enum/flag/bitmask out += f' Dump{v.typeID}(p, "{v.name}", obj.{v.name});\n' + if struct.name in ["VkPhysicalDeviceLimits", "VkPhysicalDeviceSparseProperties"]: out += f" p.ObjectEnd();\n" out += f"}}\n" @@ -622,6 +634,8 @@ def PrintChainStruct(listName, structures, all_structures, chain_details): out += f" void* start_of_chain = nullptr;\n" for s in structs_to_print: + if s.name in struct_blacklist: + continue out += AddGuardHeader(s) if s.sTypeName is not None: out += f" {s.name} {s.name[2:]}{{}};\n" @@ -635,6 +649,8 @@ def PrintChainStruct(listName, structures, all_structures, chain_details): out += AddGuardFooter(s) out += f" void initialize_chain() noexcept {{\n" for s in structs_to_print: + if s.name in struct_blacklist: + continue out += AddGuardHeader(s) out += f" {s.name[2:]}.sType = {s.sTypeName};\n" out += AddGuardFooter(s) @@ -642,6 +658,8 @@ def PrintChainStruct(listName, structures, all_structures, chain_details): out += f" std::vector<VkBaseOutStructure*> chain_members;\n" for s in structs_to_print: + if s.name in struct_blacklist: + continue out += AddGuardHeader(s) out += f" chain_members.push_back(reinterpret_cast<VkBaseOutStructure*>(&{s.name[2:]}));\n" out += AddGuardFooter(s) @@ -683,7 +701,7 @@ def PrintChainIterator(listName, structures, all_structures, checkExtLoc, extTyp version_desc = "inst.instance_version" for s in sorted_structures: - if s.sTypeName is None: + if s.sTypeName is None or s.name in struct_blacklist: continue extEnables = {} @@ -704,6 +722,8 @@ def PrintChainIterator(listName, structures, all_structures, checkExtLoc, extTyp if s.name in structures: out += AddGuardHeader(s) out += f" if (structure->sType == {s.sTypeName}" + if s.name in portability_structs: + out += f" && p.Type() != OutputType::json" has_version = version is not None has_extNameStr = len(extEnables) > 0 or s.name in aliases.keys() @@ -754,7 +774,7 @@ def PrintStructComparison(structure): out += f" return " is_first = True for m in structure.members: - if m.name not in ['sType', 'pNext']: + if m.name not in names_to_ignore: if not is_first: out += f"\n && " else: @@ -868,14 +888,13 @@ class VulkanFlags: class VulkanVariable: - def __init__(self, rootNode, constants, parentName): + def __init__(self, rootNode, constants): self.name = rootNode.find('name').text # Typename, dereferenced and converted to a useable C++ token self.typeID = rootNode.find('type').text self.baseType = self.typeID self.childType = None self.arrayLength = None - self.text = '' for node in rootNode.itertext(): comment = rootNode.find('comment') @@ -937,8 +956,7 @@ class VulkanStructure: for node in rootNode.findall('member'): if(node.get('values') is not None): self.sTypeName = node.get('values') - self.members.append(VulkanVariable( - node, constants, self.name)) + self.members.append(VulkanVariable(node, constants)) for k, elem in extTypes.items(): if k == self.name: |
