pan/genxml: Switch [un]pack codegen to macros

Because of OpenCL C, we need a way to retain address space information
contains with the pointers.

As a result this switch all [un]pack functions to macros, resulting in
pointers retaining their respective address space information.

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32962>
This commit is contained in:
Mary Guillemard
2025-01-09 09:21:02 +01:00
committed by Marge Bot
parent e15940008f
commit 3f3bb741fb
2 changed files with 29 additions and 30 deletions
+21 -23
View File
@@ -316,16 +316,16 @@ class Group(object):
if field.modifier[0] == "shr":
shift = field.modifier[1]
mask = hex((1 << shift) - 1)
print(" assert((__unpacked->{} & {}) == 0);".format(field.name, mask))
print(" assert(((__unpacked)->{} & {}) == 0); \\".format(field.name, mask))
elif field.modifier[0] == "minus":
print(" assert(__unpacked->{} >= {});".format(field.name, field.modifier[1]))
print(" assert((__unpacked)->{} >= {}); \\".format(field.name, field.modifier[1]))
elif field.modifier[0] == "log2":
print(" assert(IS_POT_NONZERO(__unpacked->{}));".format(field.name))
print(" assert(IS_POT_NONZERO((__unpacked)->{})); \\".format(field.name))
for index in range(self.length // 4):
# Handle MBZ words
if not index in words:
print(" __packed->opaque[%2d] = 0;" % index)
print(" __tmp_packed.opaque[%2d] = 0; \\" % index)
continue
word = words[index]
@@ -333,7 +333,7 @@ class Group(object):
word_start = index * 32
v = None
prefix = " __packed->opaque[%2d] =" % index
prefix = " __tmp_packed.opaque[%2d] =" % index
for contributor in word.contributors:
field = contributor.field
@@ -344,7 +344,7 @@ class Group(object):
start -= contrib_word_start
end -= contrib_word_start
value = "__unpacked->{}".format(contributor.path)
value = "(__unpacked)->{}".format(contributor.path)
if field.modifier is not None:
if field.modifier[0] == "shr":
value = "{} >> {}".format(value, field.modifier[1])
@@ -390,9 +390,9 @@ class Group(object):
s = "%s >> %d" % (s, shift)
if contributor == word.contributors[-1]:
print("%s %s;" % (prefix, s))
print("%s %s; \\" % (prefix, s))
else:
print("%s %s |" % (prefix, s))
print("%s %s | \\" % (prefix, s))
prefix = " "
continue
@@ -423,7 +423,7 @@ class Group(object):
ALL_ONES = 0xffffffff
if mask != ALL_ONES:
TMPL = ' if (__packed->opaque[{}] & {}) fprintf(stderr, "XXX: Invalid field of {} unpacked at word {}\\n");'
TMPL = ' if (__tmp_packed.opaque[{}] & {}) fprintf(stderr, "XXX: Invalid field of {} unpacked at word {}\\n"); \\'
print(TMPL.format(index, hex(mask ^ ALL_ONES), self.label, index))
fieldrefs = []
@@ -433,7 +433,7 @@ class Group(object):
convert = None
args = []
args.append('&__packed->opaque[0]')
args.append('&__tmp_packed.opaque[0]')
args.append(str(fieldref.start))
args.append(str(fieldref.end))
@@ -468,10 +468,10 @@ class Group(object):
decoded = '{}{}({}){}'.format(prefix, convert, ', '.join(args), suffix)
print(' __unpacked->{} = {};'.format(fieldref.path, decoded))
print(' (__unpacked)->{} = {}; \\'.format(fieldref.path, decoded))
if field.modifier and field.modifier[0] == "align":
mask = hex(field.modifier[1] - 1)
print(' assert(!(__unpacked->{} & {}));'.format(fieldref.path, mask))
print(' assert(!((__unpacked)->{} & {})); \\'.format(fieldref.path, mask))
def emit_print_function(self):
for field in self.fields:
@@ -651,21 +651,19 @@ class Parser(object):
print('#define {}_PACKED_T struct {}_packed'.format(name.upper(), name.lower()))
def emit_pack_function(self, name, group):
print("static ALWAYS_INLINE void\n%s_pack(%s_PACKED_T * restrict __packed,\n%sconst struct %s * restrict __unpacked)\n{" %
(name, name.upper(), ' ' * (len(name) + 6), name))
print("#define {}_pack(__packed, __unpacked) \\".format(name))
print("do { \\")
print(" {}_PACKED_T __tmp_packed; \\".format(name.upper()))
group.emit_pack_function()
print("}\n\n")
print(' *(__packed) = __tmp_packed; \\')
print("} while (0);\n")
def emit_unpack_function(self, name, group):
print("static inline void")
print("%s_unpack(const %s_PACKED_T * restrict __packed,\n%sstruct %s * restrict __unpacked)\n{" %
(name.upper(), name.upper(), ' ' * (len(name) + 8), name))
print("#define {}_unpack(__packed, __unpacked) \\".format(name))
print("do { \\")
print(" {}_PACKED_T __tmp_packed = *(__packed); \\".format(name))
group.emit_unpack_function()
print("}\n")
print("} while (0);\n")
def emit_print_function(self, name, group):
print("static inline void")
+8 -7
View File
@@ -84,15 +84,15 @@ __gen_unpack_padded(const uint32_t *restrict cl, uint32_t start, uint32_t end)
#define PREFIX4(A, B, C, D) MALI_##A##_##B##_##C##_##D
#define pan_pack(dst, T, name) \
for (struct PREFIX1(T) name = {PREFIX2(T, header)}, \
*_loop_terminate = &name; \
for (UNUSED struct PREFIX1(T) name = {PREFIX2(T, header)}, \
*_loop_terminate = &name; \
__builtin_expect(_loop_terminate != NULL, 1); ({ \
PREFIX2(T, pack)((dst), &name); \
_loop_terminate = NULL; \
}))
#define pan_pack_nodefaults(dst, T, name) \
for (struct PREFIX1(T) name = {0}, *_loop_terminate = &name; \
for (UNUSED struct PREFIX1(T) name = {0}, *_loop_terminate = &name; \
__builtin_expect(_loop_terminate != NULL, 1); ({ \
PREFIX2(T, pack)((dst), &name); \
_loop_terminate = NULL; \
@@ -105,7 +105,7 @@ __gen_unpack_padded(const uint32_t *restrict cl, uint32_t start, uint32_t end)
pan_pack_nodefaults((PREFIX2(T, PACKED_T) *)dst, T, name)
#define pan_unpack(src, T, name) \
struct PREFIX1(T) name; \
UNUSED struct PREFIX1(T) name; \
PREFIX2(T, unpack)((src), &name)
#define pan_cast_and_unpack(src, T, name) \
@@ -123,15 +123,16 @@ __gen_unpack_padded(const uint32_t *restrict cl, uint32_t start, uint32_t end)
pan_section_offset(A, S)))
#define pan_section_pack(dst, A, S, name) \
for (PREFIX4(A, SECTION, S, TYPE) name = {PREFIX4(A, SECTION, S, header)}, \
*_loop_terminate = (void *)(dst); \
for (UNUSED PREFIX4(A, SECTION, S, TYPE) \
name = {PREFIX4(A, SECTION, S, header)}, \
*_loop_terminate = (void *)(dst); \
__builtin_expect(_loop_terminate != NULL, 1); ({ \
PREFIX4(A, SECTION, S, pack)(pan_section_ptr(dst, A, S), &name); \
_loop_terminate = NULL; \
}))
#define pan_section_unpack(src, A, S, name) \
PREFIX4(A, SECTION, S, TYPE) name; \
UNUSED PREFIX4(A, SECTION, S, TYPE) name; \
PREFIX4(A, SECTION, S, unpack)(pan_section_ptr(src, A, S), &name)
#define pan_section_print(fp, A, S, var, indent) \