From bfe1942e8aa96086bd737e7eb686c4f9c27824d9 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 20 Dec 2022 06:00:56 +1000 Subject: [PATCH] vulkan/cmd_queue: update generator to handle guarded types. The latest includes/registry have some pNext structs that need guarding spearately to their initial structs, so we have to track the define guards better and use them in the generated code For example: VkVideoEncodeRateControlInfoKHR extends VkVideoCodingControlInfoKHR However the first struct is protected by BETA, but the second isn't the generator was always generating unguarded code for all structs Reviewed-by: Jason Ekstrand Acked-by: Yonggang Luo Part-of: --- src/vulkan/util/vk_cmd_queue_gen.py | 37 +++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/vulkan/util/vk_cmd_queue_gen.py b/src/vulkan/util/vk_cmd_queue_gen.py index ed0b21a24c9..11cbdb2203e 100644 --- a/src/vulkan/util/vk_cmd_queue_gen.py +++ b/src/vulkan/util/vk_cmd_queue_gen.py @@ -448,11 +448,18 @@ def get_pnext_member_copy(struct, src_type, member, types, level): pnext_decl = "const VkBaseInStructure *pnext = %s;" % field_name case_stmts = "" for type in types[src_type].extended_by: + guard_pre_stmt = "" + guard_post_stmt = "" + if type.guard is not None: + guard_pre_stmt = "#ifdef %s" % type.guard + guard_post_stmt = "#endif" case_stmts += """ +%s case %s: %s break; - """ % (type.enum, get_struct_copy(field_name, "pnext", type.name, "sizeof(%s)" % type.name, types, level)) +%s + """ % (guard_pre_stmt, type.enum, get_struct_copy(field_name, "pnext", type.name, "sizeof(%s)" % type.name, types, level), guard_post_stmt) return """ %s if (pnext) { @@ -498,9 +505,29 @@ def get_struct_free(command, param, types): member_frees += "vk_free(queue->alloc, (%s)%s);\n" % (const_cast, member_name) return "%s %s\n" % (member_frees, struct_free) -EntrypointType = namedtuple('EntrypointType', 'name enum members extended_by') +EntrypointType = namedtuple('EntrypointType', 'name enum members extended_by guard') -def get_types(doc): +def get_types_defines(doc): + """Maps types to extension defines.""" + types_to_defines = {} + + platform_define = {} + for platform in doc.findall('./platforms/platform'): + name = platform.attrib['name'] + define = platform.attrib['protect'] + platform_define[name] = define + + for extension in doc.findall('./extensions/extension[@platform]'): + platform = extension.attrib['platform'] + define = platform_define[platform] + + for types in extension.findall('./require/type'): + fullname = types.attrib['name'] + types_to_defines[fullname] = define + + return types_to_defines + +def get_types(doc, types_to_defines): """Extract the types from the registry.""" types = {} @@ -525,7 +552,7 @@ def get_types(doc): if mem_name == 'sType': type_enum = p.attrib.get('values') - types[_type.attrib['name']] = EntrypointType(name=_type.attrib['name'], enum=type_enum, members=members, extended_by=[]) + types[_type.attrib['name']] = EntrypointType(name=_type.attrib['name'], enum=type_enum, members=members, extended_by=[], guard=types_to_defines.get(_type.attrib['name'])) for _type in doc.findall('./types/type'): if _type.attrib.get('category') != 'struct': @@ -542,7 +569,7 @@ def get_types_from_xml(xml_files): for filename in xml_files: doc = et.parse(filename) - types.update(get_types(doc)) + types.update(get_types(doc, get_types_defines(doc))) return types