u_format: Use memcpy to avoid unaligned accesses
authorMatt Turner <mattst88@gmail.com>
Wed, 7 Jun 2023 00:53:41 +0000 (20:53 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 8 Jun 2023 03:42:39 +0000 (03:42 +0000)
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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23482>

src/util/format/u_format_pack.py

index 2a86105..b68669f 100644 (file)
@@ -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)