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>
This commit is contained in:
parent
6e87235523
commit
94a4dadd9a
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue