mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-12-23 06:56:20 +00:00
rsx/fp: Use CFG for fragment program
This commit is contained in:
parent
9d92e190eb
commit
cb7650240c
@ -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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user