vulkan/enum_to_str: Add generator for VkObjectType to Vulkan Handle
Signed-off-by: Yevhenii Kolesnikov <yevhenii.kolesnikov@globallogic.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10318>
This commit is contained in:
parent
3b361b234a
commit
98d22acca2
|
@ -104,6 +104,19 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\
|
|||
unreachable("Undefined struct type.");
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
vk_ObjectType_to_ObjectName(VkObjectType type)
|
||||
{
|
||||
switch((int)type) {
|
||||
% for object_type in sorted(object_types[0].enum_to_name.keys()):
|
||||
case ${object_type}:
|
||||
return "${object_types[0].enum_to_name[object_type]}";
|
||||
% endfor
|
||||
default:
|
||||
unreachable("Undefined enum value.");
|
||||
}
|
||||
}
|
||||
"""))
|
||||
|
||||
H_TEMPLATE = Template(textwrap.dedent(u"""\
|
||||
|
@ -139,6 +152,8 @@ H_TEMPLATE = Template(textwrap.dedent(u"""\
|
|||
|
||||
size_t vk_structure_type_size(const struct VkBaseInStructure *item);
|
||||
|
||||
const char * vk_ObjectType_to_ObjectName(VkObjectType type);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
@ -264,8 +279,15 @@ def struct_get_stype(xml_node):
|
|||
return member.get('values')
|
||||
return None
|
||||
|
||||
class VkObjectType(object):
|
||||
"""Simple struct-like class representing a single Vulkan object type"""
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.enum_to_name = dict()
|
||||
|
||||
def parse_xml(enum_factory, ext_factory, struct_factory, filename):
|
||||
|
||||
def parse_xml(enum_factory, ext_factory, struct_factory, obj_type_factory,
|
||||
filename):
|
||||
"""Parse the XML file. Accumulate results into the factories.
|
||||
|
||||
This parser is a memory efficient iterative XML parser that returns a list
|
||||
|
@ -319,6 +341,14 @@ def parse_xml(enum_factory, ext_factory, struct_factory, filename):
|
|||
if enum is not None:
|
||||
enum.set_guard(define)
|
||||
|
||||
obj_types = obj_type_factory("VkObjectType")
|
||||
for object_type in xml.findall('./types/type[@category="handle"]'):
|
||||
for object_name in object_type.findall('./name'):
|
||||
# Convert to int to avoid undefined enums
|
||||
enum = object_type.attrib['objtypeenum']
|
||||
enum_val = enum_factory.get("VkObjectType").name_to_value[enum]
|
||||
obj_types.enum_to_name[enum_val] = object_name.text
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
|
@ -335,11 +365,14 @@ def main():
|
|||
enum_factory = NamedFactory(VkEnum)
|
||||
ext_factory = NamedFactory(VkExtension)
|
||||
struct_factory = NamedFactory(VkChainStruct)
|
||||
obj_type_factory = NamedFactory(VkObjectType)
|
||||
for filename in args.xml_files:
|
||||
parse_xml(enum_factory, ext_factory, struct_factory, filename)
|
||||
parse_xml(enum_factory, ext_factory, struct_factory, obj_type_factory,
|
||||
filename)
|
||||
enums = sorted(enum_factory.registry.values(), key=lambda e: e.name)
|
||||
extensions = sorted(ext_factory.registry.values(), key=lambda e: e.name)
|
||||
structs = sorted(struct_factory.registry.values(), key=lambda e: e.name)
|
||||
object_types = sorted(obj_type_factory.registry.values(), key=lambda e: e.name)
|
||||
|
||||
for template, file_ in [(C_TEMPLATE, os.path.join(args.outdir, 'vk_enum_to_str.c')),
|
||||
(H_TEMPLATE, os.path.join(args.outdir, 'vk_enum_to_str.h'))]:
|
||||
|
@ -349,6 +382,7 @@ def main():
|
|||
enums=enums,
|
||||
extensions=extensions,
|
||||
structs=structs,
|
||||
object_types=object_types,
|
||||
copyright=COPYRIGHT))
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue