Mesa (main): vulkan/cmd_queue: Properly support non-array pointer members

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Mar 11 19:20:20 UTC 2022


Module: Mesa
Branch: main
Commit: f76621f7192467e77a3e536964de76c44056b54d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f76621f7192467e77a3e536964de76c44056b54d

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Thu Mar 10 10:24:06 2022 -0600

vulkan/cmd_queue: Properly support non-array pointer members

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5440
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Acked-by: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15325>

---

 src/vulkan/util/vk_cmd_queue_gen.py | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/vulkan/util/vk_cmd_queue_gen.py b/src/vulkan/util/vk_cmd_queue_gen.py
index d72f8c72252..7e18cda9580 100644
--- a/src/vulkan/util/vk_cmd_queue_gen.py
+++ b/src/vulkan/util/vk_cmd_queue_gen.py
@@ -356,11 +356,14 @@ def get_array_copy(command, param):
 
 def get_array_member_copy(struct, src_name, member):
     field_name = "%s->%s" % (struct, member.name)
-    len_field_name = "%s->%s" % (struct, member.len)
-    allocation = "%s = vk_zalloc(queue->alloc, sizeof(*%s) * %s, 8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);" % (field_name, field_name, len_field_name)
+    if member.len == "struct-ptr":
+        field_size = "sizeof(*%s)" % (field_name)
+    else:
+        field_size = "sizeof(*%s) * %s->%s" % (field_name, struct, member.len)
+    allocation = "%s = vk_zalloc(queue->alloc, %s, 8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);" % (field_name, field_size)
     const_cast = remove_suffix(member.decl.replace("const", ""), member.name)
-    copy = "memcpy((%s)%s, %s->%s, sizeof(*%s) * %s);" % (const_cast, field_name, src_name, member.name, field_name, len_field_name)
-    return "%s\n   %s\n" % (allocation, copy)
+    copy = "memcpy((%s)%s, %s->%s, %s);" % (const_cast, field_name, src_name, member.name, field_size)
+    return "if (%s->%s) {\n   %s\n   %s\n}\n" % (src_name, member.name, allocation, copy)
 
 def get_pnext_member_copy(struct, src_type, member, types, level):
     if not types[src_type].extended_by:
@@ -431,13 +434,20 @@ def get_types(doc):
         members = []
         type_enum = None
         for p in _type.findall('./member'):
-            member = EntrypointParam(type=p.find('./type').text,
-                                     name=p.find('./name').text,
-                                     decl=''.join(p.itertext()),
-                                     len=p.attrib.get('len', None))
+            mem_type = p.find('./type').text
+            mem_name = p.find('./name').text
+            mem_decl = ''.join(p.itertext())
+            mem_len = p.attrib.get('len', None)
+            if mem_len is None and '*' in mem_decl and mem_name != 'pNext':
+                mem_len = "struct-ptr"
+
+            member = EntrypointParam(type=mem_type,
+                                     name=mem_name,
+                                     decl=mem_decl,
+                                     len=mem_len)
             members.append(member)
 
-            if p.find('./name').text == 'sType':
+            if mem_name == 'sType':
                 type_enum = p.attrib.get('values')
         types[_type.attrib['name']] = EntrypointType(name=_type.attrib['name'], enum=type_enum, members=members, extended_by=[])
 



More information about the mesa-commit mailing list