mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-12-16 04:09:07 +00:00
rsx/fp: Enable CFG passes and emit block epilogues
This commit is contained in:
parent
e8e2d4b93d
commit
26fd0510ab
@ -14,7 +14,7 @@ namespace rsx::assembler::FP
|
|||||||
class RegisterAnnotationPass : public CFGPass
|
class RegisterAnnotationPass : public CFGPass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RegisterAnnotationPass(RSXFragmentProgram& prog)
|
RegisterAnnotationPass(const RSXFragmentProgram& prog)
|
||||||
: m_prog(prog)
|
: m_prog(prog)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,11 @@
|
|||||||
#include "FragmentProgramDecompiler.h"
|
#include "FragmentProgramDecompiler.h"
|
||||||
#include "ProgramStateCache.h"
|
#include "ProgramStateCache.h"
|
||||||
|
|
||||||
|
#include "Assembler/Passes/FP/RegisterAnnotationPass.h"
|
||||||
|
#include "Assembler/Passes/FP/RegisterDependencyPass.h"
|
||||||
|
|
||||||
|
#include "Emu/system_config.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
namespace rsx
|
namespace rsx
|
||||||
@ -1296,7 +1301,17 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode)
|
|||||||
|
|
||||||
std::string FragmentProgramDecompiler::Decompile()
|
std::string FragmentProgramDecompiler::Decompile()
|
||||||
{
|
{
|
||||||
const auto graph = deconstruct_fragment_program(m_prog);
|
auto graph = deconstruct_fragment_program(m_prog);
|
||||||
|
|
||||||
|
if (g_cfg.video.shader_precision != gpu_preset_level::low)
|
||||||
|
{
|
||||||
|
FP::RegisterAnnotationPass annotation_pass{ m_prog };
|
||||||
|
FP::RegisterDependencyPass dependency_pass{};
|
||||||
|
|
||||||
|
annotation_pass.run(graph);
|
||||||
|
dependency_pass.run(graph);
|
||||||
|
}
|
||||||
|
|
||||||
m_size = 0;
|
m_size = 0;
|
||||||
m_location = 0;
|
m_location = 0;
|
||||||
m_loop_count = 0;
|
m_loop_count = 0;
|
||||||
@ -1455,7 +1470,23 @@ std::string FragmentProgramDecompiler::Decompile()
|
|||||||
if (dst.end) break;
|
if (dst.end) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Handle block epilogue if needed
|
if (block.epilogue.empty())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddCode("// Epilogue");
|
||||||
|
|
||||||
|
for (auto& inst : block.epilogue)
|
||||||
|
{
|
||||||
|
m_instruction = &inst;
|
||||||
|
dst.HEX = inst.bytecode[0];
|
||||||
|
src0.HEX = inst.bytecode[1];
|
||||||
|
src1.HEX = inst.bytecode[2];
|
||||||
|
src2.HEX = inst.bytecode[3];
|
||||||
|
|
||||||
|
ensure(handle_tex_srb(inst.opcode) || handle_sct_scb(inst.opcode), "Unsupported operation");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (m_code_level > 1)
|
while (m_code_level > 1)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user