diff options
author | Kenneth Graunke <[email protected]> | 2019-06-06 17:36:09 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-06-07 11:09:44 -0700 |
commit | d5d2fb5c4c100300f17976dbc4cf4c7045a2b688 (patch) | |
tree | eb24e1d01818de31717e99a301b688b4709764ed /src/intel/isl | |
parent | e1c14b2820ae8e5b5da9f251413605042bbadf79 (diff) |
isl: Mark enum isl_channel_select packed so it becomes 1 byte.
I recently discovered that the following code lead to valgrind errors:
struct isl_swizzle swizzle = ISL_SWIZZLE_IDENTITY;
VALGRIND_CHECK_MEM_IS_DEFINED(&swizzle, sizeof(swizzle));
which is surprising, because struct isl_swizzle is simply:
struct isl_swizzle {
enum isl_channel_select r:4;
enum isl_channel_select g:4;
enum isl_channel_select b:4;
enum isl_channel_select a:4;
};
and the above code initializes all of them with a C99 initializer.
Iván Briano reminded me that C99 initializers don't necessarily zero
padding. A quick inspection revealed that sizeof(struct isl_swizzle)
was 4 (rather than the expected 2). Ian Romanick suggested changing
it to uint16_t, since this is essentially dicing up an unsigned, and
that worked.
This patch marks enum isl_channel_select packed, changing its size
from 4 bytes to 1 byte. This then makes struct isl_swizzle 2 bytes,
with no bogus padding fields. This eliminates valgrind undefined
memory warnings.
These isl_swizzle values become part of our BLORP blit program keys,
which are then hashed. This undefined padding was being included in
the hashing, possibly leading to issues. I originally saw this error
when running KHR-GL45.texture_size_promotion.functional in iris under
valgrind.
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/intel/isl')
-rw-r--r-- | src/intel/isl/isl.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index 6790ba002ad..0218f05d175 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -861,7 +861,7 @@ typedef uint8_t isl_channel_mask_t; /** * @brief A channel select (also known as texture swizzle) value */ -enum isl_channel_select { +enum PACKED isl_channel_select { ISL_CHANNEL_SELECT_ZERO = 0, ISL_CHANNEL_SELECT_ONE = 1, ISL_CHANNEL_SELECT_RED = 4, |