Skip to content

Commit c6e9672

Browse files
authored
rsx/fp: Fix SAT and ABS modifier precedence
- Real RSX applies the SAT modifier before ABS
1 parent d9799c7 commit c6e9672

2 files changed

Lines changed: 10 additions & 1 deletion

File tree

rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,8 +792,10 @@ template<typename T> std::string FragmentProgramDecompiler::GetSRC(T src)
792792
}
793793

794794
// Warning: Modifier order matters. e.g neg should be applied after precision clamping (tested with Naruto UNS)
795+
const bool precision_before_abs = precision_modifier == RSX_FP_PRECISION_SATURATE;
796+
if (precision_before_abs) ret = ClampValue(ret, precision_modifier);
795797
if (src.abs) ret = "abs(" + ret + ")";
796-
if (precision_modifier) ret = ClampValue(ret, precision_modifier);
798+
if (precision_modifier && !precision_before_abs) ret = ClampValue(ret, precision_modifier);
797799
if (src.neg) ret = "-" + ret;
798800

799801
return ret;

rpcs3/Emu/RSX/Program/GLSLInterpreter/FragmentInterpreter.glsl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ layout(location=0) in vec4 in_regs[16];
8383
#define RSX_FP_REGISTER_TYPE_CONSTANT 2
8484
#define RSX_FP_REGISTER_TYPE_UNKNOWN 3
8585

86+
#define RSX_FP_PRECISION_SATURATE 4
87+
8688
#define CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT 0xe
8789
#define CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS 0x40
8890

@@ -242,6 +244,11 @@ vec4 read_src(const in int index)
242244
ur1 = GET_INST_BITS(index + 1, 9, 8);
243245
vr0 = shuffle(vr0, ur1);
244246

247+
if (GET_INST_BITS(2, 19 + index * 3, 3) == RSX_FP_PRECISION_SATURATE)
248+
{
249+
vr0 = clamp(select(vr0, vr_zero, isnan(vr0)), 0., 1.);
250+
}
251+
245252
// abs
246253
if (index == 0)
247254
{

0 commit comments

Comments
 (0)