diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 0c65d26982..f72d5f9350 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -336,47 +336,82 @@ void GLFragmentDecompilerThread::Task() case RSX_FP_OPCODE_SGT: SetDst("vec4(greaterThan($0, $1))"); break; case RSX_FP_OPCODE_SNE: SetDst("vec4(notEqual($0, $1))"); break; case RSX_FP_OPCODE_SEQ: SetDst("vec4(equal($0, $1))"); break; - case RSX_FP_OPCODE_FRC: SetDst("fract($0)"); break; case RSX_FP_OPCODE_FLR: SetDst("floor($0)"); break; case RSX_FP_OPCODE_KIL: SetDst("discard", false); break; - //case RSX_FP_OPCODE_PK4: break; - //case RSX_FP_OPCODE_UP4: break; + case RSX_FP_OPCODE_PK4: + LOG_ERROR(RSX, "Unimplemented fp_opcode PK4"); + break; + case RSX_FP_OPCODE_UP4: + LOG_ERROR(RSX, "Unimplemented fp_opcode UP4"); + break; case RSX_FP_OPCODE_DDX: SetDst("dFdx($0)"); break; case RSX_FP_OPCODE_DDY: SetDst("dFdy($0)"); break; case RSX_FP_OPCODE_TEX: SetDst("texture($t, $0.xy)"); break; - //case RSX_FP_OPCODE_TXP: break; - //case RSX_FP_OPCODE_TXD: break; + case RSX_FP_OPCODE_TXP: + LOG_ERROR(RSX, "Unimplemented fp_opcode TXP"); + break; + case RSX_FP_OPCODE_TXD: + LOG_ERROR(RSX, "Unimplemented fp_opcode TXD"); + break; case RSX_FP_OPCODE_RCP: SetDst("(1 / $0)"); break; case RSX_FP_OPCODE_RSQ: SetDst("inversesqrt(abs($0))"); break; case RSX_FP_OPCODE_EX2: SetDst("exp2($0)"); break; case RSX_FP_OPCODE_LG2: SetDst("log2($0)"); break; case RSX_FP_OPCODE_LIT: SetDst("vec4(1.0, $0.x, ($0.x > 0 ? exp2($0.w * log2($0.y)) : 0.0), 1.0)"); break; - case RSX_FP_OPCODE_LRP: SetDst("($0 * ($1 - $2) + $2)"); break; - + case RSX_FP_OPCODE_LRP: SetDst("($0 * ($1 - $2) + $2)"); break; case RSX_FP_OPCODE_STR: SetDst("vec4(equal($0, vec4(1.0)))"); break; case RSX_FP_OPCODE_SFL: SetDst("vec4(equal($0, vec4(0.0)))"); break; case RSX_FP_OPCODE_COS: SetDst("cos($0)"); break; case RSX_FP_OPCODE_SIN: SetDst("sin($0)"); break; - //case RSX_FP_OPCODE_PK2: break; - //case RSX_FP_OPCODE_UP2: break; + case RSX_FP_OPCODE_PK2: + LOG_ERROR(RSX, "Unimplemented fp_opcode PK2"); + break; + case RSX_FP_OPCODE_UP2: + LOG_ERROR(RSX, "Unimplemented fp_opcode UP2"); + break; case RSX_FP_OPCODE_POW: SetDst("pow($0, $1)"); break; - //case RSX_FP_OPCODE_PKB: break; - //case RSX_FP_OPCODE_UPB: break; - //case RSX_FP_OPCODE_PK16: break; - //case RSX_FP_OPCODE_UP16: break; - //case RSX_FP_OPCODE_BEM: break; - //case RSX_FP_OPCODE_PKG: break; - //case RSX_FP_OPCODE_UPG: break; + case RSX_FP_OPCODE_PKB: + LOG_ERROR(RSX, "Unimplemented fp_opcode PKB"); + break; + case RSX_FP_OPCODE_UPB: + LOG_ERROR(RSX, "Unimplemented fp_opcode UPB"); + break; + case RSX_FP_OPCODE_PK16: + LOG_ERROR(RSX, "Unimplemented fp_opcode PK16"); + break; + case RSX_FP_OPCODE_UP16: + LOG_ERROR(RSX, "Unimplemented fp_opcode UP16"); + break; + case RSX_FP_OPCODE_BEM: + LOG_ERROR(RSX, "Unimplemented fp_opcode BEM"); + break; + case RSX_FP_OPCODE_PKG: + LOG_ERROR(RSX, "Unimplemented fp_opcode PKG"); + break; + case RSX_FP_OPCODE_UPG: + LOG_ERROR(RSX, "Unimplemented fp_opcode UPG"); + break; case RSX_FP_OPCODE_DP2A: SetDst("($0.x * $1.x + $0.y * $1.y + $2.x)"); break; - //case RSX_FP_OPCODE_TXL: break; - - //case RSX_FP_OPCODE_TXB: break; - //case RSX_FP_OPCODE_TEXBEM: break; - //case RSX_FP_OPCODE_TXPBEM: break; - //case RSX_FP_OPCODE_BEMLUM: break; + case RSX_FP_OPCODE_TXL: break; + LOG_ERROR(RSX, "Unimplemented fp_opcode TXL"); + break; + case RSX_FP_OPCODE_TXB: break; + LOG_ERROR(RSX, "Unimplemented fp_opcode TXB"); + break; + case RSX_FP_OPCODE_TEXBEM: + LOG_ERROR(RSX, "Unimplemented fp_opcode TEXBEM"); + break; + case RSX_FP_OPCODE_TXPBEM: + LOG_ERROR(RSX, "Unimplemented fp_opcode TXPBEM"); + break; + case RSX_FP_OPCODE_BEMLUM: + LOG_ERROR(RSX, "Unimplemented fp_opcode BEMLUM"); + break; case RSX_FP_OPCODE_REFL: SetDst("($0 - 2.0 * $1 * dot($0, $1))"); break; - //case RSX_FP_OPCODE_TIMESWTEX: break; + case RSX_FP_OPCODE_TIMESWTEX: + LOG_ERROR(RSX, "Unimplemented fp_opcode TIMESWTEX"); + break; case RSX_FP_OPCODE_DP2: SetDst("vec4(dot($0.xy, $1.xy))"); break; case RSX_FP_OPCODE_NRM: SetDst("normalize($0.xyz)"); break; case RSX_FP_OPCODE_DIV: SetDst("($0 / $1)"); break; @@ -384,9 +419,10 @@ void GLFragmentDecompilerThread::Task() case RSX_FP_OPCODE_LIF: SetDst("vec4(1.0, $0.y, ($0.y > 0 ? pow(2.0, $0.w) : 0.0), 1.0)"); break; case RSX_FP_OPCODE_FENCT: break; case RSX_FP_OPCODE_FENCB: break; - case RSX_FP_OPCODE_BRK: SetDst("break"); break; - //case RSX_FP_OPCODE_CAL: break; + case RSX_FP_OPCODE_CAL: + LOG_ERROR(RSX, "Unimplemented fp_opcode CAL"); + break; case RSX_FP_OPCODE_IFE: AddCode("if($cond)"); m_else_offsets.push_back(src1.else_offset << 2); @@ -427,11 +463,13 @@ void GLFragmentDecompilerThread::Task() m_code_level++; } break; - //case RSX_FP_OPCODE_RET: SetDst("return"); break; + case RSX_FP_OPCODE_RET: + SetDst("return"); + break; default: LOG_ERROR(RSX, "Unknown fp opcode 0x%x (inst %d)", opcode, m_size / (4 * 4)); - //Emu.Pause(); + Emu.Pause(); break; } diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp index b774c688e6..fffaf8f42a 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp @@ -547,15 +547,15 @@ void GLVertexDecompilerThread::Task() switch (d1.sca_opcode) { - case 0x00: break; // NOP - case 0x01: SetDSTSca("$s"); break; // MOV - case 0x02: SetDSTSca("(1.0 / $s)"); break; // RCP - case 0x03: SetDSTSca("clamp(1.0 / $s, 5.42101e-20, 1.884467e19)"); break; // RCC - case 0x04: SetDSTSca("inversesqrt(abs($s))"); break; // RSQ - case 0x05: SetDSTSca("exp($s)"); break; // EXP - case 0x06: SetDSTSca("log($s)"); break; // LOG - case 0x07: SetDSTSca("vec4(1.0, $s.x, ($s.x > 0 ? exp2($s.w * log2($s.y)) : 0.0), 1.0)"); break; // LIT - case 0x08: // BRA + case RSX_SCA_OPCODE_NOP: break; + case RSX_SCA_OPCODE_MOV: SetDSTSca("$s"); break; + case RSX_SCA_OPCODE_RCP: SetDSTSca("(1.0 / $s)"); break; + case RSX_SCA_OPCODE_RCC: SetDSTSca("clamp(1.0 / $s, 5.42101e-20, 1.884467e19)"); break; + case RSX_SCA_OPCODE_RSQ: SetDSTSca("inversesqrt(abs($s))"); break; + case RSX_SCA_OPCODE_EXP: SetDSTSca("exp($s)"); break; + case RSX_SCA_OPCODE_LOG: SetDSTSca("log($s)"); break; + case RSX_SCA_OPCODE_LIT: SetDSTSca("vec4(1.0, $s.x, ($s.x > 0 ? exp2($s.w * log2($s.y)) : 0.0), 1.0)"); break; + case RSX_SCA_OPCODE_BRA: { AddCode("$if ($cond)"); AddCode("{"); @@ -566,7 +566,7 @@ void GLVertexDecompilerThread::Task() AddCode("}"); } break; - case 0x09: // BRI : works differently (BRI o[1].x(TR) L0;) + case RSX_SCA_OPCODE_BRI: // works differently (BRI o[1].x(TR) L0;) { uint jump_position; @@ -597,17 +597,38 @@ void GLVertexDecompilerThread::Task() AddCode("}"); } break; - //case 0x0a: AddCode("$ifcond $f(); //CAL"); break; // CAL : works same as BRI - case 0x0b: AddCode("$ifcond $f(); //CLI"); break; // CLI : works same as BRI - case 0x0c: AddCode("$ifcond return;"); break; // RET : works like BRI but shorter (RET o[1].x(TR);) - case 0x0d: SetDSTSca("log2($s)"); break; // LG2 - case 0x0e: SetDSTSca("exp2($s)"); break; // EX2 - case 0x0f: SetDSTSca("sin($s)"); break; // SIN - case 0x10: SetDSTSca("cos($s)"); break; // COS - //case 0x11: break; // BRB : works differently (BRB o[1].x !b0, L0;) - //case 0x12: break; // CLB : works same as BRB - //case 0x13: break; // PSH : works differently (PSH o[1].x A0;) - //case 0x14: break; // POP : works differently (POP o[1].x;) + case RSX_SCA_OPCODE_CAL: + // works same as BRI + AddCode("$ifcond $f(); //CAL"); + break; + case RSX_SCA_OPCODE_CLI: + // works same as BRI + AddCode("$ifcond $f(); //CLI"); + break; + case RSX_SCA_OPCODE_RET: + // works like BRI but shorter (RET o[1].x(TR);) + AddCode("$ifcond return;"); + break; + case RSX_SCA_OPCODE_LG2: SetDSTSca("log2($s)"); break; + case RSX_SCA_OPCODE_EX2: SetDSTSca("exp2($s)"); break; + case RSX_SCA_OPCODE_SIN: SetDSTSca("sin($s)"); break; + case RSX_SCA_OPCODE_COS: SetDSTSca("cos($s)"); break; + case RSX_SCA_OPCODE_BRB: + // works differently (BRB o[1].x !b0, L0;) + LOG_ERROR(RSX, "Unimplemented sca_opcode BRB"); + break; + case RSX_SCA_OPCODE_CLB: break; + // works same as BRB + LOG_ERROR(RSX, "Unimplemented sca_opcode CLB"); + break; + case RSX_SCA_OPCODE_PSH: break; + // works differently (PSH o[1].x A0;) + LOG_ERROR(RSX, "Unimplemented sca_opcode PSH"); + break; + case RSX_SCA_OPCODE_POP: break; + // works differently (POP o[1].x;) + LOG_ERROR(RSX, "Unimplemented sca_opcode POP"); + break; default: AddCode(fmt::Format("//Unknown vp sca_opcode 0x%x", fmt::by_value(d1.sca_opcode))); @@ -618,29 +639,29 @@ void GLVertexDecompilerThread::Task() switch (d1.vec_opcode) { - case 0x00: break; //NOP - case 0x01: SetDSTVec("$0"); break; //MOV - case 0x02: SetDSTVec("($0 * $1)"); break; //MUL - case 0x03: SetDSTVec("($0 + $2)"); break; //ADD - case 0x04: SetDSTVec("($0 * $1 + $2)"); break; //MAD - case 0x05: SetDSTVec("vec4(dot($0.xyz, $1.xyz))"); break; //DP3 - case 0x06: SetDSTVec("vec4(dot(vec4($0.xyz, 1.0), $1))"); break; //DPH - case 0x07: SetDSTVec("vec4(dot($0, $1))"); break; //DP4 - case 0x08: SetDSTVec("vec4(distance($0, $1))"); break; //DST - case 0x09: SetDSTVec("min($0, $1)"); break; //MIN - case 0x0a: SetDSTVec("max($0, $1)"); break; //MAX - case 0x0b: SetDSTVec("vec4(lessThan($0, $1))"); break; //SLT - case 0x0c: SetDSTVec("vec4(greaterThanEqual($0, $1))"); break; //SGE - case 0x0d: AddCode("$ifcond $a = ivec4($0)$am;"); break; //ARL - case 0x0e: SetDSTVec("fract($0)"); break; //FRC - case 0x0f: SetDSTVec("floor($0)"); break; //FLR - case 0x10: SetDSTVec("vec4(equal($0, $1))"); break; //SEQ - case 0x11: SetDSTVec("vec4(equal($0, vec4(0.0)))"); break; //SFL - case 0x12: SetDSTVec("vec4(greaterThan($0, $1))"); break; //SGT - case 0x13: SetDSTVec("vec4(lessThanEqual($0, $1))"); break; //SLE - case 0x14: SetDSTVec("vec4(notEqual($0, $1))"); break; //SNE - case 0x15: SetDSTVec("vec4(equal($0, vec4(1.0)))"); break; //STR - case 0x16: SetDSTVec("sign($0)"); break; //SSG + case RSX_VEC_OPCODE_NOP: break; + case RSX_VEC_OPCODE_MOV: SetDSTVec("$0"); break; + case RSX_VEC_OPCODE_MUL: SetDSTVec("($0 * $1)"); break; + case RSX_VEC_OPCODE_ADD: SetDSTVec("($0 + $2)"); break; + case RSX_VEC_OPCODE_MAD: SetDSTVec("($0 * $1 + $2)"); break; + case RSX_VEC_OPCODE_DP3: SetDSTVec("vec4(dot($0.xyz, $1.xyz))"); break; + case RSX_VEC_OPCODE_DPH: SetDSTVec("vec4(dot(vec4($0.xyz, 1.0), $1))"); break; + case RSX_VEC_OPCODE_DP4: SetDSTVec("vec4(dot($0, $1))"); break; + case RSX_VEC_OPCODE_DST: SetDSTVec("vec4(distance($0, $1))"); break; + case RSX_VEC_OPCODE_MIN: SetDSTVec("min($0, $1)"); break; + case RSX_VEC_OPCODE_MAX: SetDSTVec("max($0, $1)"); break; + case RSX_VEC_OPCODE_SLT: SetDSTVec("vec4(lessThan($0, $1))"); break; + case RSX_VEC_OPCODE_SGE: SetDSTVec("vec4(greaterThanEqual($0, $1))"); break; + case RSX_VEC_OPCODE_ARL: AddCode("$ifcond $a = ivec4($0)$am;"); break; + case RSX_VEC_OPCODE_FRC: SetDSTVec("fract($0)"); break; + case RSX_VEC_OPCODE_FLR: SetDSTVec("floor($0)"); break; + case RSX_VEC_OPCODE_SEQ: SetDSTVec("vec4(equal($0, $1))"); break; + case RSX_VEC_OPCODE_SFL: SetDSTVec("vec4(equal($0, vec4(0.0)))"); break; + case RSX_VEC_OPCODE_SGT: SetDSTVec("vec4(greaterThan($0, $1))"); break; + case RSX_VEC_OPCODE_SLE: SetDSTVec("vec4(lessThanEqual($0, $1))"); break; + case RSX_VEC_OPCODE_SNE: SetDSTVec("vec4(notEqual($0, $1))"); break; + case RSX_VEC_OPCODE_STR: SetDSTVec("vec4(equal($0, vec4(1.0)))"); break; + case RSX_VEC_OPCODE_SSG: SetDSTVec("sign($0)"); break; default: AddCode(fmt::Format("//Unknown vp opcode 0x%x", fmt::by_value(d1.vec_opcode))); diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.h b/rpcs3/Emu/RSX/GL/GLVertexProgram.h index 942dad6559..af8a666200 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.h +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.h @@ -4,6 +4,58 @@ #include "Utilities/Thread.h" #include +enum sca_opcode +{ + RSX_SCA_OPCODE_NOP = 0x00, + RSX_SCA_OPCODE_MOV = 0x01, + RSX_SCA_OPCODE_RCP = 0x02, + RSX_SCA_OPCODE_RCC = 0x03, + RSX_SCA_OPCODE_RSQ = 0x04, + RSX_SCA_OPCODE_EXP = 0x05, + RSX_SCA_OPCODE_LOG = 0x06, + RSX_SCA_OPCODE_LIT = 0x07, + RSX_SCA_OPCODE_BRA = 0x08, + RSX_SCA_OPCODE_BRI = 0x09, + RSX_SCA_OPCODE_CAL = 0x0a, + RSX_SCA_OPCODE_CLI = 0x0b, + RSX_SCA_OPCODE_RET = 0x0c, + RSX_SCA_OPCODE_LG2 = 0x0d, + RSX_SCA_OPCODE_EX2 = 0x0e, + RSX_SCA_OPCODE_SIN = 0x0f, + RSX_SCA_OPCODE_COS = 0x10, + RSX_SCA_OPCODE_BRB = 0x11, + RSX_SCA_OPCODE_CLB = 0x12, + RSX_SCA_OPCODE_PSH = 0x13, + RSX_SCA_OPCODE_POP = 0x14, +}; + +enum vec_opcode +{ + RSX_VEC_OPCODE_NOP = 0x00, + RSX_VEC_OPCODE_MOV = 0x01, + RSX_VEC_OPCODE_MUL = 0x02, + RSX_VEC_OPCODE_ADD = 0x03, + RSX_VEC_OPCODE_MAD = 0x04, + RSX_VEC_OPCODE_DP3 = 0x05, + RSX_VEC_OPCODE_DPH = 0x06, + RSX_VEC_OPCODE_DP4 = 0x07, + RSX_VEC_OPCODE_DST = 0x08, + RSX_VEC_OPCODE_MIN = 0x09, + RSX_VEC_OPCODE_MAX = 0x0a, + RSX_VEC_OPCODE_SLT = 0x0b, + RSX_VEC_OPCODE_SGE = 0x0c, + RSX_VEC_OPCODE_ARL = 0x0d, + RSX_VEC_OPCODE_FRC = 0x0e, + RSX_VEC_OPCODE_FLR = 0x0f, + RSX_VEC_OPCODE_SEQ = 0x10, + RSX_VEC_OPCODE_SFL = 0x11, + RSX_VEC_OPCODE_SGT = 0x12, + RSX_VEC_OPCODE_SLE = 0x13, + RSX_VEC_OPCODE_SNE = 0x14, + RSX_VEC_OPCODE_STR = 0x15, + RSX_VEC_OPCODE_SSG = 0x16, +}; + struct GLVertexDecompilerThread : public ThreadBase { union D0