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