rsx/vp: Discard broken vertex programs with no writes to POS register

This commit is contained in:
kd-11 2018-07-04 22:41:34 +03:00 committed by kd-11
parent 2ca935a26b
commit 2c34195954
4 changed files with 37 additions and 16 deletions

View file

@ -52,7 +52,7 @@ std::string VertexProgramDecompiler::GetDST(bool isSca)
default:
if (d3.dst > 15)
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)") + mask;
ret += m_parr.AddParam(PF_PARAM_OUT, 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;
@ -391,6 +391,13 @@ std::string VertexProgramDecompiler::BuildCode()
lvl += m_instructions[i].open_scopes;
}
bool is_valid = m_parr.HasParam(PF_PARAM_OUT, getFloatTypeName(4), "dst_reg0");
if (!is_valid)
{
LOG_WARNING(RSX, "Vertex program has no POS output, shader will be NOPed");
main_body = "/*" + main_body + "*/";
}
std::stringstream OS;
insertHeader(OS);