Skip to content

Commit 5a9083e

Browse files
committed
rsx: Fix saw-tooth artifacts when using GPU deswizzle for small texel widths
1 parent 6a398f9 commit 5a9083e

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

rpcs3/Emu/RSX/Program/GLSLSnippets/GPUDeswizzle.glsl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,16 @@ uint get_z_index(const in uint x_, const in uint y_, const in uint z_)
105105

106106
void 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

124125
void 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

Comments
 (0)