=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: winevulkan: Check if conversion is required for pNext chains.

Alexandre Julliard julliard at winehq.org
Fri Oct 5 16:40:40 CDT 2018


Module: wine
Branch: master
Commit: 94a4dadd9a05d6da8688e17187583fa6a11a6e04
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=94a4dadd9a05d6da8688e17187583fa6a11a6e04

Author: Józef Kucia <jkucia at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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)




More information about the wine-cvs mailing list