@@ -105,15 +105,16 @@ uint get_z_index(const in uint x_, const in uint y_, const in uint z_)
105105
106106void decode_16b(const in uint texel_id, in uint x, const in uint y, const in uint z)
107107{
108- const uint masks[] = { 0x0000FFFF, 0xFFFF0000 };
109108 uint accumulator = 0 ;
110109
111110 const uint subword_count = min (invocation.size.x, 2 );
112111 for (uint subword = 0 ; subword < subword_count; ++ subword, ++ x)
113112 {
114113 uint src_texel_id = get_z_index(x, y, z);
115114 uint src_id = (src_texel_id + invocation.data_offset);
116- accumulator |= data_in[src_id / 2 ] & masks[subword];
115+ int src_bit_offset = int (src_id % 2 ) << 4 ;
116+ uint src_value = bitfieldExtract(data_in[src_id / 2 ], src_bit_offset, 16 );
117+ accumulator = bitfieldInsert(accumulator, src_value, int (subword << 4 ), 16 );
117118 }
118119
119120 data_out[texel_id / 2 ] = % f(accumulator);
@@ -123,15 +124,16 @@ void decode_16b(const in uint texel_id, in uint x, const in uint y, const in uin
123124
124125void decode_8b(const in uint texel_id, in uint x, const in uint y, const in uint z)
125126{
126- const uint masks[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };
127127 uint accumulator = 0 ;
128128
129129 const uint subword_count = min (invocation.size.x, 4 );
130130 for (uint subword = 0 ; subword < subword_count; ++ subword, ++ x)
131131 {
132132 uint src_texel_id = get_z_index(x, y, z);
133133 uint src_id = (src_texel_id + invocation.data_offset);
134- accumulator |= data_in[src_id / 4 ] & masks[subword];
134+ int src_bit_offset = int (src_id % 4 ) << 3 ;
135+ uint src_value = bitfieldExtract(data_in[src_id / 4 ], src_bit_offset, 8 );
136+ accumulator = bitfieldInsert(accumulator, src_value, int (subword << 3 ), 8 );
135137 }
136138
137139 data_out[texel_id / 4 ] = accumulator;
0 commit comments