mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-05 22:41:25 +12:00
rsx: Fix vertex decompiler to support 2 arg destination
This commit is contained in:
parent
7b3693bb29
commit
fde6099769
2 changed files with 11 additions and 3 deletions
|
@ -63,6 +63,9 @@ std::string CgBinaryDisasm::GetDSTDisasm(bool isSca)
|
||||||
LOG_ERROR(RSX, "dst index out of range: %u", d3.dst);
|
LOG_ERROR(RSX, "dst index out of range: %u", d3.dst);
|
||||||
|
|
||||||
ret += fmt::format("o[%d]", d3.dst) + GetVecMaskDisasm();
|
ret += fmt::format("o[%d]", d3.dst) + GetVecMaskDisasm();
|
||||||
|
// Vertex Program supports double destinations, notably in MOV
|
||||||
|
if (d0.dst_tmp != 0x3f)
|
||||||
|
ret += fmt::format(" R%d", d0.dst_tmp) + GetVecMaskDisasm();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,16 +41,21 @@ std::string VertexProgramDecompiler::GetDST(bool isSca)
|
||||||
{
|
{
|
||||||
std::string ret;
|
std::string ret;
|
||||||
|
|
||||||
|
std::string mask = GetMask(isSca);
|
||||||
|
|
||||||
switch (isSca ? 0x1f : d3.dst)
|
switch (isSca ? 0x1f : d3.dst)
|
||||||
{
|
{
|
||||||
case 0x1f:
|
case 0x1f:
|
||||||
ret += m_parr.AddParam(PF_PARAM_NONE, getFloatTypeName(4), std::string("tmp") + std::to_string(isSca ? d3.sca_dst_tmp : d0.dst_tmp));
|
ret += m_parr.AddParam(PF_PARAM_NONE, getFloatTypeName(4), std::string("tmp") + std::to_string(isSca ? d3.sca_dst_tmp : d0.dst_tmp)) + mask;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (d3.dst > 15)
|
if (d3.dst > 15)
|
||||||
LOG_ERROR(RSX, "dst index out of range: %u", d3.dst);
|
LOG_ERROR(RSX, "dst index out of range: %u", d3.dst);
|
||||||
ret += m_parr.AddParam(PF_PARAM_NONE, getFloatTypeName(4), std::string("dst_reg") + std::to_string(d3.dst), d3.dst == 0 ? getFloatTypeName(4) + "(0.0f, 0.0f, 0.0f, 1.0f)" : getFloatTypeName(4) + "(0.0, 0.0, 0.0, 0.0)");
|
ret += m_parr.AddParam(PF_PARAM_NONE, getFloatTypeName(4), std::string("dst_reg") + std::to_string(d3.dst), d3.dst == 0 ? getFloatTypeName(4) + "(0.0f, 0.0f, 0.0f, 1.0f)" : getFloatTypeName(4) + "(0.0, 0.0, 0.0, 0.0)") + mask;
|
||||||
|
// Handle double destination register as 'dst_reg = tmp'
|
||||||
|
if (d0.dst_tmp != 0x3f)
|
||||||
|
ret += " = " + m_parr.AddParam(PF_PARAM_NONE, getFloatTypeName(4), std::string("tmp") + std::to_string(d0.dst_tmp)) + mask;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +162,7 @@ void VertexProgramDecompiler::SetDST(bool is_sca, std::string value)
|
||||||
}
|
}
|
||||||
else if (d3.dst != 0x1f || (is_sca ? d3.sca_dst_tmp != 0x3f : d0.dst_tmp != 0x3f))
|
else if (d3.dst != 0x1f || (is_sca ? d3.sca_dst_tmp != 0x3f : d0.dst_tmp != 0x3f))
|
||||||
{
|
{
|
||||||
dest = GetDST(is_sca) + mask;
|
dest = GetDST(is_sca);
|
||||||
}
|
}
|
||||||
|
|
||||||
//std::string code;
|
//std::string code;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue