rsx: Fix alpha test on VK/GL

Moving alpha test outside of fp_main. This enforces alpha test is still done even if shader asm has early return
This commit is contained in:
Jake 2018-03-09 03:31:01 -06:00 committed by kd-11
parent 7233640cf0
commit 3a9428a88e
2 changed files with 42 additions and 42 deletions

View File

@ -348,6 +348,26 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
}
}
OS << "}\n\n";
OS << "void main()\n";
OS << "{\n";
std::string parameters = "";
for (auto &reg_name : output_values)
{
if (m_parr.HasParam(PF_PARAM_NONE, "vec4", reg_name))
{
if (parameters.length())
parameters += ", ";
parameters += reg_name;
OS << " vec4 " << reg_name << " = vec4(0.);\n";
}
}
OS << "\n" << " fs_main(" + parameters + ");\n\n";
if (!first_output_name.empty())
{
auto make_comparison_test = [](rsx::comparison_function compare_func, const std::string &test, const std::string &a, const std::string &b) -> std::string
@ -381,29 +401,9 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
}
}
OS << " if (alpha_test != 0 && !comparison_passes(" << first_output_name << ".a, alpha_ref, alpha_func)) discard;\n";
OS << " if (alpha_test != 0 && !comparison_passes(" << first_output_name << ".a, alpha_ref, alpha_func)) discard;\n\n";
}
OS << "}\n\n";
OS << "void main()\n";
OS << "{\n";
std::string parameters = "";
for (auto &reg_name : output_values)
{
if (m_parr.HasParam(PF_PARAM_NONE, "vec4", reg_name))
{
if (parameters.length())
parameters += ", ";
parameters += reg_name;
OS << " vec4 " << reg_name << " = vec4(0.);\n";
}
}
OS << "\n" << " fs_main(" + parameters + ");\n\n";
//Append the color output assignments
OS << color_output_block;

View File

@ -340,6 +340,26 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
}
}
OS << "}\n\n";
OS << "void main()\n";
OS << "{\n";
std::string parameters = "";
for (auto &reg_name : output_values)
{
if (m_parr.HasParam(PF_PARAM_NONE, "vec4", reg_name))
{
if (parameters.length())
parameters += ", ";
parameters += reg_name;
OS << " vec4 " << reg_name << " = vec4(0.);\n";
}
}
OS << "\n" << " fs_main(" + parameters + ");\n\n";
if (!first_output_name.empty())
{
auto make_comparison_test = [](rsx::comparison_function compare_func, const std::string &test, const std::string &a, const std::string &b) -> std::string
@ -373,29 +393,9 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
}
}
OS << " if (alpha_test != 0 && !comparison_passes(" << first_output_name << ".a, alpha_ref, alpha_func)) discard;\n";
OS << " if (alpha_test != 0 && !comparison_passes(" << first_output_name << ".a, alpha_ref, alpha_func)) discard;\n\n";
}
OS << "}\n\n";
OS << "void main()\n";
OS << "{\n";
std::string parameters = "";
for (auto &reg_name : output_values)
{
if (m_parr.HasParam(PF_PARAM_NONE, "vec4", reg_name))
{
if (parameters.length())
parameters += ", ";
parameters += reg_name;
OS << " vec4 " << reg_name << " = vec4(0.);\n";
}
}
OS << "\n" << " fs_main(" + parameters + ");\n\n";
//Append the color output assignments
OS << color_output_block;