mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-16 16:21:02 +00:00
rsx: Fix some fp bugs
rsx/fp: Properly fix RCP - Input is always scalar, output is a vector rsx/fp: Ignore forced unit for SIP and TEX instructions
This commit is contained in:
parent
c788331e45
commit
d43e06c0ea
@ -449,7 +449,7 @@ bool FragmentProgramDecompiler::handle_sct(u32 opcode)
|
|||||||
case RSX_FP_OPCODE_MOV: SetDst("$0"); return true;
|
case RSX_FP_OPCODE_MOV: SetDst("$0"); return true;
|
||||||
case RSX_FP_OPCODE_MUL: SetDst("($0 * $1)"); return true;
|
case RSX_FP_OPCODE_MUL: SetDst("($0 * $1)"); return true;
|
||||||
// Note: It's higly likely that RCP is not IEEE compliant but a game that uses rcp(0) has to be found
|
// Note: It's higly likely that RCP is not IEEE compliant but a game that uses rcp(0) has to be found
|
||||||
case RSX_FP_OPCODE_RCP: SetDst("(1. / " + NotZero("$0") + ")"); return true;
|
case RSX_FP_OPCODE_RCP: SetDst("(1. / " + NotZero("$0.x") + ").xxxx"); return true;
|
||||||
// Note: RSQ is not IEEE compliant. rsq(0) is some big number (Silent Hill 3 HD)
|
// Note: RSQ is not IEEE compliant. rsq(0) is some big number (Silent Hill 3 HD)
|
||||||
// It is not know what happens if 0 is negative.
|
// It is not know what happens if 0 is negative.
|
||||||
case RSX_FP_OPCODE_RSQ: SetDst("(1. / sqrt(" + NotZeroPositive("$0.x") + ").xxxx)"); return true;
|
case RSX_FP_OPCODE_RSQ: SetDst("(1. / sqrt(" + NotZeroPositive("$0.x") + ").xxxx)"); return true;
|
||||||
@ -734,11 +734,14 @@ std::string FragmentProgramDecompiler::Decompile()
|
|||||||
default:
|
default:
|
||||||
int prev_force_unit = forced_unit;
|
int prev_force_unit = forced_unit;
|
||||||
|
|
||||||
|
//Some instructions do not respect forced unit
|
||||||
|
//Tested with Tales of Vesperia
|
||||||
|
if (SIP()) break;
|
||||||
|
if (handle_tex_srb(opcode)) break;
|
||||||
|
|
||||||
if (forced_unit == FORCE_NONE)
|
if (forced_unit == FORCE_NONE)
|
||||||
{
|
{
|
||||||
if (SIP()) break;
|
|
||||||
if (handle_sct(opcode)) break;
|
if (handle_sct(opcode)) break;
|
||||||
if (handle_tex_srb(opcode)) break;
|
|
||||||
if (handle_scb(opcode)) break;
|
if (handle_scb(opcode)) break;
|
||||||
}
|
}
|
||||||
else if (forced_unit == FORCE_SCT)
|
else if (forced_unit == FORCE_SCT)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user