From 19092576ce3678d090b4a62742b8fc0bc1293ab5 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Tue, 6 Jun 2023 20:53:41 -0400 Subject: [PATCH] u_format: Use memcpy to avoid unaligned accesses These functions are used by gl[Get]TexImage, which imposes no alignment restructions on the void *pixels parameter. This fixes an unaligned access in GTK's "gtk:gdk / memorytexture" unit test on SPARC, which causes the test to fail. Fixes: 45ae4434b5b ("util: Use bitshift arithmetic to unpack pixels.") Part-of: --- src/util/format/u_format_pack.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/util/format/u_format_pack.py b/src/util/format/u_format_pack.py index 2a86105..b68669f 100644 --- a/src/util/format/u_format_pack.py +++ b/src/util/format/u_format_pack.py @@ -441,7 +441,8 @@ def generate_unpack_kernel(format, dst_channel, dst_native_type): def unpack_from_bitmask(channels, swizzles): depth = format.block_size() - print(' uint%u_t value = *(const uint%u_t *)src;' % (depth, depth)) + print(' uint%u_t value;' % (depth)) + print(' memcpy(&value, src, sizeof value);') # Compute the intermediate unshifted values for i in range(format.nr_channels()): @@ -567,7 +568,7 @@ def generate_pack_kernel(format, src_channel, src_native_type): if value is not None: print(' value |= %s;' % (value)) - print(' *(uint%u_t *)dst = value;' % depth) + print(' memcpy(dst, &value, sizeof value);') def pack_into_struct(channels, swizzles): inv_swizzle = inv_swizzles(swizzles) -- 2.7.4