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

View File

@ -1297,7 +1297,7 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode)
std::string FragmentProgramDecompiler::Decompile() 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_size = 0;
m_location = 0; m_location = 0;
m_loop_count = 0; m_loop_count = 0;
@ -1314,7 +1314,11 @@ std::string FragmentProgramDecompiler::Decompile()
int forced_unit = FORCE_NONE; 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); for (auto found = std::find(m_end_offsets.begin(), m_end_offsets.end(), m_size);
found != m_end_offsets.end(); found != m_end_offsets.end();
@ -1338,10 +1342,10 @@ std::string FragmentProgramDecompiler::Decompile()
m_code_level++; m_code_level++;
} }
dst.HEX = GetData(data[0]); dst.HEX = inst.bytecode[0];
src0.HEX = GetData(data[1]); src0.HEX = inst.bytecode[1];
src1.HEX = GetData(data[2]); src1.HEX = inst.bytecode[2];
src2.HEX = GetData(data[3]); src2.HEX = inst.bytecode[3];
m_offset = 4 * sizeof(u32); m_offset = 4 * sizeof(u32);
opflags = 0; opflags = 0;
@ -1444,11 +1448,12 @@ std::string FragmentProgramDecompiler::Decompile()
} }
m_size += m_offset; m_size += m_offset;
ensure((m_offset & 15) == 0); // Must be aligned to 16 bytes
if (dst.end) break; if (dst.end) break;
}
ensure(m_offset % sizeof(u32) == 0); // TODO: Handle block epilogue if needed
data += m_offset / sizeof(u32);
} }
while (m_code_level > 1) while (m_code_level > 1)