From 9359b8c17012c2fe1f05d2f542fe63e99a6e8b3b Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 5 Sep 2017 16:25:02 +0300 Subject: [PATCH] rsx/fp: Shader decompiler fixes - Requires proper 2-pass impl rsx/fp: Catch hanging code blocks rsx/fp: Don't pause on scaling error --- rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index 794af06c73..98c1a56691 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -33,7 +33,6 @@ void FragmentProgramDecompiler::SetDst(std::string code, bool append_mask) default: LOG_ERROR(RSX, "Bad scale: %d", u32{ src1.scale }); - Emu.Pause(); break; } @@ -548,7 +547,7 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode) if (DstExpectsSca() && (m_prog.shadow_textures & (1 << dst.tex_num))) { m_shadow_sampled_textures |= (1 << dst.tex_num); - SetDst(getFunction(FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_PROJ), false); //No swizzle mask on shadow lookup + SetDst(getFunction(FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_PROJ) + ".r", false); //No swizzle mask on shadow lookup } else SetDst(getFunction(FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_PROJ)); @@ -758,6 +757,14 @@ std::string FragmentProgramDecompiler::Decompile() data += m_offset / sizeof(u32); } + while (m_code_level > 1) + { + LOG_ERROR(RSX, "Hanging block found at end of shader. Malformed shader?"); + + m_code_level--; + AddCode("}"); + } + // flush m_code_level m_code_level = 1; std::string m_shader = BuildCode();