diff --git a/rpcs3/Emu/RSX/Common/GLSLCommon.h b/rpcs3/Emu/RSX/Common/GLSLCommon.h index 5aeb2e0370..dc8a2a331b 100644 --- a/rpcs3/Emu/RSX/Common/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Common/GLSLCommon.h @@ -625,33 +625,44 @@ namespace glsl " return vec4(float(g)/255., float(b)/255., 1., float(r)/255.);\n" "}\n\n" - "float read_value(const in vec4 src, const in uint remap_index)\n" + "vec4 remap_vector(const in vec4 color, const in uint remap)\n" "{\n" - " switch (remap_index)\n" + " vec4 result;\n" + " if ((remap & 0xFF) == 0xE4)\n" " {\n" - " case 0: return src.a;\n" - " case 1: return src.r;\n" - " case 2: return src.g;\n" - " case 3: return src.b;\n" + " result = color;\n" " }\n" + " else\n" + " {\n" + " uvec4 remap_channel = uvec4(remap) >> uvec4(2, 4, 6, 0);\n" + " remap_channel &= 3;\n" + " remap_channel = (remap_channel + 3) % 4; // Map A-R-G-B to R-G-B-A\n\n" + + " // Generate remapped result\n" + " result.a = color[remap_channel.a];\n" + " result.r = color[remap_channel.r];\n" + " result.g = color[remap_channel.g];\n" + " result.b = color[remap_channel.b];\n" + " }\n\n" + + " if ((remap >> 8) == 0xAA)\n" + " return result;\n\n" + + " uvec4 remap_select = uvec4(remap) >> uvec4(10, 12, 14, 8);\n" + " remap_select &= 3;\n" + " bvec4 choice = lessThan(remap_select, uvec4(2));\n" + " return _select(result, vec4(remap_select), choice);\n" "}\n\n" "vec4 texture2DReconstruct(sampler2D tex, usampler2D stencil_tex, const in vec2 coord, const in uint remap)\n" "{\n" " vec4 result = decode_depth24(texture(tex, coord.xy).r, remap >> 16);\n" - " result.z = float(texture(stencil_tex, coord.xy).x) / 255.f;\n" - " uint remap_vector = remap & 0xFF;\n" - " if (remap_vector == 0xE4) return result;\n\n" - " vec4 tmp;\n" - " uint remap_a = remap_vector & 0x3;\n" - " uint remap_r = (remap_vector >> 2) & 0x3;\n" - " uint remap_g = (remap_vector >> 4) & 0x3;\n" - " uint remap_b = (remap_vector >> 6) & 0x3;\n" - " tmp.a = read_value(result, remap_a);\n" - " tmp.r = read_value(result, remap_r);\n" - " tmp.g = read_value(result, remap_g);\n" - " tmp.b = read_value(result, remap_b);\n" - " return tmp;\n" + " result.z = float(texture(stencil_tex, coord.xy).x) / 255.f;\n\n" + + " if (remap == 0xAAE4)\n" + " return result;\n\n" + + " return remap_vector(result, remap);\n" "}\n\n"; }