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