Module: wine
Branch: master
Commit: 95d83f019d26de94f87a2a06345df8c072f9a3e3
URL: https://gitlab.winehq.org/wine/wine/-/commit/95d83f019d26de94f87a2a06345df8…
Author: Jacek Caban <jacek(a)codeweavers.com>
Date: Mon Nov 7 20:21:58 2022 +0100
winevulkan: Support pointer dynamic array lengths.
---
dlls/winevulkan/make_vulkan | 43 ++++++++++++++++++++++++++++++++-----------
1 file changed, 32 insertions(+), 11 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 493c9ad59ea..0ca2552240f 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -1097,6 +1097,10 @@ class VkVariable(object):
if type_info:
self.set_type_info(type_info)
+ def __eq__(self, other):
+ """ Compare member based on name against a string. """
+ return self.name == other
+
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
@@ -1106,6 +1110,31 @@ class VkVariable(object):
self.handle = type_info["data"] if type_info["category"] == "handle" else None
self.struct = type_info["data"] if type_info["category"] == "struct" else None
+ def get_dyn_array_len(self, prefix):
+ if isinstance(self.dyn_array_len, int):
+ return self.dyn_array_len
+
+ len_str = self.dyn_array_len
+ parent = self.parent
+ len = prefix
+
+ # check if lenght is a member of another struct (for example pAllocateInfo->commandBufferCount)
+ i = len_str.find("->")
+ if i != -1:
+ var = parent[parent.index(len_str[0:i])]
+ len_str = len_str[i+2:]
+ len += var.name + "->"
+ parent = var.struct.members
+
+ len += len_str
+ if not len_str in parent:
+ return len
+
+ var = parent[parent.index(len_str)]
+ if var.is_pointer():
+ len = "*" + len
+ return len
+
def is_const(self):
return self.const
@@ -1223,15 +1252,6 @@ class VkMember(VkVariable):
self.values = values
self.bit_width = bit_width
- def __eq__(self, other):
- """ Compare member based on name against a string.
-
- This method is for convenience by VkStruct, which holds a number of members and needs quick checking
- if certain members exist.
- """
-
- return self.name == other
-
def __repr__(self):
return "{0} {1} {2} {3} {4} {5} {6}".format(self.const, self.struct_fwd_decl, self.type, self.pointer,
self.name, self.array_len, self.dyn_array_len)
@@ -1313,7 +1333,7 @@ class VkMember(VkVariable):
if self.needs_conversion(conv, unwrap, direction, False):
if self.is_dynamic_array():
# Array length is either a variable name (string) or an int.
- count = self.dyn_array_len if isinstance(self.dyn_array_len, int) else "{0}{1}".format(input, self.dyn_array_len)
+ count = self.get_dyn_array_len(input)
host_part = "host" if unwrap else "unwrapped_host"
if direction == Direction.OUTPUT:
return "convert_{2}_array_{6}_to_{5}({3}{1}, {0}{1}, {4});\n".format(output, self.name, self.type, input, count, win_type, host_part)
@@ -1557,7 +1577,8 @@ class VkParam(VkVariable):
ctx_param = "&ctx, " if self.needs_alloc(conv, unwrap) else ""
wrap_part = "" if unwrap or not self.needs_unwrapping() else "unwrapped_"
if self.is_dynamic_array():
- return " {1}_host = convert_{2}_array_{4}_to_{6}host({5}{0}{1}, {0}{3});\n".format(prefix, self.name, self.type, self.dyn_array_len, win_type, ctx_param, wrap_part)
+ return " {1}_host = convert_{2}_array_{4}_to_{6}host({5}{0}{1}, {3});\n".format(
+ prefix, self.name, self.type, self.get_dyn_array_len(prefix), win_type, ctx_param, wrap_part)
else:
return " convert_{0}_{3}_to_{5}host({4}{1}{2}, &{2}_host);\n".format(self.type, prefix, self.name, win_type, ctx_param, wrap_part)
else: