rsx/fp: Use CFG for fragment program
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user