From 2009e304f7c0bdf5bf01b8dd60dddc2f8bb25f18 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg=20Kristensen?= Date: Wed, 10 Feb 2016 21:42:56 -0800 Subject: [PATCH] anv/pack: Handle case where a struct field covers multiple dwords We also didn't add start to field.end to get the absolute field end position. --- src/vulkan/gen_pack_header.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vulkan/gen_pack_header.py b/src/vulkan/gen_pack_header.py index 8ed74581063..fa2eed7a9ab 100755 --- a/src/vulkan/gen_pack_header.py +++ b/src/vulkan/gen_pack_header.py @@ -317,13 +317,16 @@ class Group: # assert dwords[index].address == None dwords[index].address = field - # Does this field extend into the next dword? - if index < field.end // 32 and dwords[index].size == 32: - if index + 1 in dwords: - assert dwords[index + 1].size == 32 + # Coalesce all the dwords covered by this field. The two cases we + # handle are where multiple fields are in a 64 bit word (typically + # and address and a few bits) or where a single struct field + # completely covers multiple dwords. + while index < (start + field.end) // 32: + if index + 1 in dwords and not dwords[index] == dwords[index + 1]: dwords[index].fields.extend(dwords[index + 1].fields) dwords[index].size = 64 dwords[index + 1] = dwords[index] + index = index + 1 def emit_pack_function(self, start): dwords = {} -- 2.30.2