Module: wine Branch: master Commit: 94a4dadd9a05d6da8688e17187583fa6a11a6e04 URL: https://source.winehq.org/git/wine.git/?a=commit;h=94a4dadd9a05d6da8688e1718...
Author: Józef Kucia jkucia@codeweavers.com Date: Fri Oct 5 16:55:18 2018 +0200
winevulkan: Check if conversion is required for pNext chains.
Unhandled conversions are only logged for now.
Signed-off-by: Józef Kucia jkucia@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winevulkan/make_vulkan | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index ae90905..ce14c78 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -1028,9 +1028,12 @@ class VkMember(object): # Collect any conversion for any member structs. struct = self.type_info["data"] for m in struct: + m.needs_struct_extensions_conversion() if m.needs_conversion(): conversions.extend(m.get_conversions())
+ struct.needs_struct_extensions_conversion() + struct = self.type_info["data"] direction = Direction.OUTPUT if struct.returnedonly else Direction.INPUT if self.is_dynamic_array(): @@ -1119,6 +1122,13 @@ class VkMember(object): # though none of this type have been encountered yet. return False
+ def needs_struct_extensions_conversion(self): + if not self.is_struct(): + return False + + struct = self.type_info["data"] + return struct.needs_struct_extensions_conversion() + def set_type_info(self, type_info): """ Helper function to set type information from the type registry. This is needed, because not all type data is available at time of @@ -1356,6 +1366,10 @@ class VkParam(object): if not self.is_struct(): return None
+ self.struct.needs_struct_extensions_conversion() + for m in self.struct: + m.needs_struct_extensions_conversion() + if not self.needs_conversion(): return None
@@ -1485,14 +1499,16 @@ class VkParam(object): class VkStruct(Sequence): """ Class which represents the type union and struct. """
- def __init__(self, name, members, returnedonly, alias=None, union=False): + def __init__(self, name, members, returnedonly, structextends, alias=None, union=False): self.name = name self.members = members self.returnedonly = returnedonly + self.structextends = structextends self.required = False self.alias = alias self.union = union self.type_info = None # To be set later. + self.struct_extensions = []
def __getitem__(self, i): return self.members[i] @@ -1503,7 +1519,7 @@ class VkStruct(Sequence): @staticmethod def from_alias(struct, alias): name = struct.attrib.get("name") - return VkStruct(name, alias.members, alias.returnedonly, alias=alias) + return VkStruct(name, alias.members, alias.returnedonly, alias.structextends, alias=alias)
@staticmethod def from_xml(struct): @@ -1511,18 +1527,21 @@ class VkStruct(Sequence): # know which one we are dealing with later on for code generation. union = True if struct.attrib["category"] == "union" else False
- name = struct.attrib.get("name", None) + name = struct.attrib.get("name")
# 'Output' structures for which data is filled in by the API are # marked as 'returnedonly'. returnedonly = True if struct.attrib.get("returnedonly") else False
+ structextends = struct.attrib.get("structextends") + structextends = structextends.split(",") if structextends else [] + members = [] for member in struct.findall("member"): vk_member = VkMember.from_xml(member) members.append(vk_member)
- return VkStruct(name, members, returnedonly, union=union) + return VkStruct(name, members, returnedonly, structextends, union=union)
@staticmethod def decouple_structs(structs): @@ -1648,6 +1667,16 @@ class VkStruct(Sequence):
return False
+ def needs_struct_extensions_conversion(self): + """ Checks if structure extensions in pNext chain need conversion. """ + + for e in self.struct_extensions: + if e.required and e.needs_conversion(): + LOGGER.error("Unhandled pNext chain conversion for {0}".format(e.name)) + return True + + return False + def set_type_info(self, types): """ Helper function to set type information from the type registry. This is needed, because not all type data is available at time of @@ -2756,6 +2785,10 @@ class VkRegistry(object): for struct in structs: struct.set_type_info(self.types)
+ for structextend in struct.structextends: + s = self.types[structextend]["data"] + s.struct_extensions.append(struct) + # Guarantee everything is sorted, so code generation doesn't have # to deal with this. self.base_types = sorted(base_types, key=lambda base_type: base_type.name)