rsx/fp: Use CFG for fragment program

This commit is contained in:
kd-11
2025-11-23 19:39:48 +03:00
committed by kd-11
parent 9d92e190eb
commit cb7650240c
@@ -1297,7 +1297,7 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode)
std::string FragmentProgramDecompiler::Decompile()
{
auto data = static_cast<be_t<u32>*>(m_prog.get_data());
const auto graph = rsx::assembler::deconstruct_fragment_program(m_prog);
m_size = 0;
m_location = 0;
m_loop_count = 0;
@@ -1314,7 +1314,11 @@ std::string FragmentProgramDecompiler::Decompile()
int forced_unit = FORCE_NONE;
while (true)
for (const auto &block : graph.blocks)
{
// TODO: Handle block prologue if any
for (const auto& inst : block.instructions)
{
for (auto found = std::find(m_end_offsets.begin(), m_end_offsets.end(), m_size);
found != m_end_offsets.end();
@@ -1338,10 +1342,10 @@ std::string FragmentProgramDecompiler::Decompile()
m_code_level++;
}
dst.HEX = GetData(data[0]);
src0.HEX = GetData(data[1]);
src1.HEX = GetData(data[2]);
src2.HEX = GetData(data[3]);
dst.HEX = inst.bytecode[0];
src0.HEX = inst.bytecode[1];
src1.HEX = inst.bytecode[2];
src2.HEX = inst.bytecode[3];
m_offset = 4 * sizeof(u32);
opflags = 0;
@@ -1444,11 +1448,12 @@ std::string FragmentProgramDecompiler::Decompile()
}
m_size += m_offset;
ensure((m_offset & 15) == 0); // Must be aligned to 16 bytes
if (dst.end) break;
}
ensure(m_offset % sizeof(u32) == 0);
data += m_offset / sizeof(u32);
// TODO: Handle block epilogue if needed
}
while (m_code_level > 1)