diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index ad9fb43e28..9d0a09efd9 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -460,7 +460,22 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode) case RSX_FP_OPCODE_TXPBEM: SetDst("textureProj($t, $0.xyz, $1.x)"); return true; case RSX_FP_OPCODE_TXD: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXD"); return true; case RSX_FP_OPCODE_TXB: SetDst("texture($t, $0.xy, $1.x)"); return true; - case RSX_FP_OPCODE_TXL: SetDst("textureLod($t, $0.xy, $1.x)"); return true; + case RSX_FP_OPCODE_TXL: + if (dst.tex_num >= m_texture_dimensions.size()) + { + SetDst(getFunction(FUNCTION::FUNCTION_TEXTURE_SAMPLE_LOD)); + return true; + } + switch (m_texture_dimensions[dst.tex_num]) + { + case texture_dimension::texture_dimension_2d: + SetDst(getFunction(FUNCTION::FUNCTION_TEXTURE_SAMPLE_LOD)); + return true; + case texture_dimension::texture_dimension_cubemap: + SetDst(getFunction(FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE_LOD)); + return true; + } + return false; case RSX_FP_OPCODE_UP2: SetDst("unpackSnorm2x16($0)"); return true; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478)) case RSX_FP_OPCODE_UP4: SetDst("unpackSnorm4x8($0)"); return true; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478)) case RSX_FP_OPCODE_UP16: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP16"); return true; diff --git a/rpcs3/Emu/RSX/Common/ShaderParam.h b/rpcs3/Emu/RSX/Common/ShaderParam.h index 69443dd6cb..d04f89f6c3 100644 --- a/rpcs3/Emu/RSX/Common/ShaderParam.h +++ b/rpcs3/Emu/RSX/Common/ShaderParam.h @@ -15,8 +15,10 @@ enum class FUNCTION { FUNCTION_DFDY, FUNCTION_TEXTURE_SAMPLE, FUNCTION_TEXTURE_SAMPLE_PROJ, + FUNCTION_TEXTURE_SAMPLE_LOD, FUNCTION_TEXTURE_CUBE_SAMPLE, FUNCTION_TEXTURE_CUBE_SAMPLE_PROJ, + FUNCTION_TEXTURE_CUBE_SAMPLE_LOD, }; enum class COMPARE { diff --git a/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp index 1c8f7e3c05..f484cd2d2b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp @@ -46,10 +46,14 @@ std::string getFunctionImp(FUNCTION f) return "$t.Sample($tsampler, $0.xy * $t_scale)"; case FUNCTION::FUNCTION_TEXTURE_SAMPLE_PROJ: return "$t.Sample($tsampler, ($0.xy / $0.z) * $t_scale)"; + case FUNCTION::FUNCTION_TEXTURE_SAMPLE_LOD: + return "$t.SampleLevel($tsampler, ($0.xy / $0.z) * $t_scale, $1)"; case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE: return "$t.Sample($tsampler, $0.xyz)"; case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE_PROJ: return "$t.Sample($tsampler, ($0.xyz / $0.w))"; + case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE_LOD: + return "$t.SampleLevel($tsampler, ($0.xyz / $0.w), $1)"; case FUNCTION::FUNCTION_DFDX: return "ddx($0)"; case FUNCTION::FUNCTION_DFDY: diff --git a/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp b/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp index 24a6167c0f..c8cde0fdf4 100644 --- a/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp +++ b/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp @@ -44,10 +44,14 @@ std::string getFunctionImpl(FUNCTION f) return "texture($t, $0.xy)"; case FUNCTION::FUNCTION_TEXTURE_SAMPLE_PROJ: return "textureProj($t, $0.xyz, $1.x)"; // Note: $1.x is bias + case FUNCTION::FUNCTION_TEXTURE_SAMPLE_LOD: + return "textureLod($t, $0.xy, $1)"; case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE: return "texture($t, $0.xyz)"; case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE_PROJ: return "textureProj($t, $0.xyzw, $1.x)"; // Note: $1.x is bias + case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE_LOD: + return "textureLod($t, $0.xyz, $1)"; case FUNCTION::FUNCTION_DFDX: return "dFdx($0)"; case FUNCTION::FUNCTION_DFDY: