From cf9769fe654bf5cffcb0110bc87b497308d8dfdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Mon, 18 Aug 2014 22:07:52 +0200 Subject: [PATCH] Fragment Shader recompiler comments Don't expect changes due to this commit. --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 157 ++++++++++++------------- rpcs3/Emu/RSX/GL/GLFragmentProgram.h | 23 ++-- rpcs3/Emu/RSX/GL/GLVertexProgram.cpp | 11 +- rpcs3/Emu/RSX/RSXFragmentProgram.h | 73 +++++++++++- 4 files changed, 166 insertions(+), 98 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index bfb96fd2bb..b36279f580 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -267,9 +267,8 @@ std::string GLFragmentDecompilerThread::BuildCode() std::string p; - for (u32 i = 0; i 0 ? exp2($0.w * log2($0.y)) : 0.0), 1.0)"); break; // LIT (compute light coefficients) - case 0x1f: SetDst("($0 * ($1 - $2) + $2)"); break; // LRP (linear interpolation) + 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_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_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 0x20: SetDst("vec4(equal($0, vec4(1.0)))"); break; // STR (set on true) - case 0x21: SetDst("vec4(equal($0, vec4(0.0)))"); break; // SFL (set on false) - case 0x22: SetDst("cos($0)"); break; // COS - case 0x23: SetDst("sin($0)"); break; // SIN - //case 0x24: break; // PK2 (pack two 16-bit floats) - //case 0x25: break; // UP2 (unpack two 16-bit floats) - case 0x26: SetDst("pow($0, $1)"); break; // POW - //case 0x27: break; // PKB - //case 0x28: break; // UPB - //case 0x29: break; // PK16 - //case 0x2a: break; // UP16 - //case 0x2b: break; // BEM - //case 0x2c: break; // PKG - //case 0x2d: break; // UPG - case 0x2e: SetDst("($0.x * $1.x + $0.y * $1.y + $2.x)"); break; // DP2A (2-component dot product and add) - //case 0x2f: break; // TXL (texture lookup with LOD) + 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_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_DP2A: SetDst("($0.x * $1.x + $0.y * $1.y + $2.x)"); break; + //case RSX_FP_OPCODE_TXL: break; - //case 0x30: break; - //case 0x31: break; // TXB (texture lookup with bias) - //case 0x33: break; // TEXBEM - //case 0x34: break; // TXPBEM - //case 0x35: break; // BEMLUM - case 0x36: SetDst("($0 - 2.0 * $1 * dot($0, $1))"); break; // RFL (reflection vector) - //case 0x37: break; // TIMESWTEX - case 0x38: SetDst("vec4(dot($0.xy, $1.xy))"); break; // DP2 - case 0x39: SetDst("normalize($0.xyz)"); break; // NRM - case 0x3a: SetDst("($0 / $1)"); break; // DIV - case 0x3b: SetDst("($0 / sqrt($1))"); break; // DIVSQ - case 0x3c: SetDst("vec4(1.0, $0.y, ($0.y > 0 ? pow(2.0, $0.w) : 0.0), 1.0)"); break; // LIF - case 0x3d: break; // FENCT - case 0x3e: break; // FENCB + //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_REFL: SetDst("($0 - 2.0 * $1 * dot($0, $1))"); break; + //case RSX_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; + case RSX_FP_OPCODE_DIVSQ: SetDst("($0 / sqrt($1))"); break; + 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 0x40: SetDst("break"); break; //BRK - //case 0x41: break; //CAL - case 0x42: - AddCode("if($cond)"); //IF + case RSX_FP_OPCODE_BRK: SetDst("break"); break; + //case RSX_FP_OPCODE_CAL: break; + case RSX_FP_OPCODE_IFE: + AddCode("if($cond)"); m_else_offsets.push_back(src1.else_offset << 2); m_end_offsets.push_back(src2.end_offset << 2); AddCode("{"); m_code_level++; break; - case 0x43: //LOOP + case RSX_FP_OPCODE_LOOP: if(!src0.exec_if_eq && !src0.exec_if_gr && !src0.exec_if_lt) { AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) {} //-> %u //LOOP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3, src2.end_offset)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment, src2.end_offset)); } else { AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) //LOOP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment)); m_loop_count++; m_end_offsets.push_back(src2.end_offset << 2); AddCode("{"); m_code_level++; } break; - case 0x44: //REP + case RSX_FP_OPCODE_REP: if(!src0.exec_if_eq && !src0.exec_if_gr && !src0.exec_if_lt) { AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) {} //-> %u //REP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3, src2.end_offset)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment, src2.end_offset)); } else { AddCode(fmt::Format("if($cond) for(int i%u = %u; i%u < %u; i%u += %u) //REP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment)); m_loop_count++; m_end_offsets.push_back(src2.end_offset << 2); AddCode("{"); m_code_level++; } break; - //case 0x45: SetDst("return"); break; //RET + //case RSX_FP_OPCODE_RET: SetDst("return"); break; default: LOG_ERROR(RSX, "Unknown fp opcode 0x%x (inst %d)", opcode, m_size / (4 * 4)); @@ -543,10 +541,9 @@ void GLShaderProgram::Compile() void GLShaderProgram::Delete() { - for (u32 i = 0; i