Module: wine
Branch: master
Commit: 94a4dadd9a05d6da8688e17187583fa6a11a6e04
URL: https://source.winehq.org/git/wine.git/?a=commit;h=94a4dadd9a05d6da8688e171…
Author: Józef Kucia <jkucia(a)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(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)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)
Module: wine
Branch: master
Commit: 6e87235523f48d523285409dcbbd7885df9948d0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6e87235523f48d523285409d…
Author: Józef Kucia <jkucia(a)codeweavers.com>
Date: Fri Oct 5 16:55:17 2018 +0200
winevulkan: Remove parsing of validextensionstructs.
It was replaced by structextends.
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/winevulkan/make_vulkan | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 8e7d88a..ae90905 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -869,7 +869,7 @@ class VkHandle(object):
class VkMember(object):
def __init__(self, const=False, struct_fwd_decl=False,_type=None, pointer=None, name=None, array_len=None,
- dyn_array_len=None, optional=False, extension_structs=None):
+ dyn_array_len=None, optional=False):
self.const = const
self.struct_fwd_decl = struct_fwd_decl
self.name = name
@@ -879,7 +879,6 @@ class VkMember(object):
self.array_len = array_len
self.dyn_array_len = dyn_array_len
self.optional = optional
- self.extension_structs = extension_structs
def __eq__(self, other):
""" Compare member based on name against a string.
@@ -927,12 +926,7 @@ class VkMember(object):
# Name of other member within, which stores the number of
# elements pointed to be by this member.
- dyn_array_len = member.get("len", None)
-
- if "validextensionstructs" in member.attrib:
- extension_structs = member.get("validextensionstructs").split(",")
- else:
- extension_structs = None
+ dyn_array_len = member.get("len")
# Some members are optional, which is important for conversion code e.g. not dereference NULL pointer.
optional = True if member.get("optional") else False
@@ -956,7 +950,7 @@ class VkMember(object):
array_len = name_elem.tail.strip("[]")
return VkMember(const=const, struct_fwd_decl=struct_fwd_decl, _type=member_type, pointer=pointer, name=name_elem.text,
- array_len=array_len, dyn_array_len=dyn_array_len, optional=optional, extension_structs=extension_structs)
+ array_len=array_len, dyn_array_len=dyn_array_len, optional=optional)
def copy(self, input, output, direction):
""" Helper method for use by conversion logic to generate a C-code statement to copy this member. """