From 3a9428a88e0ecb0c0fce755f349c2d1cc2eafe90 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 9 Mar 2018 03:31:01 -0600 Subject: [PATCH] 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 --- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 42 +++++++++++++------------- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 42 +++++++++++++------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index d7142c56ad..ab9db54365 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -348,6 +348,26 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) } } + OS << "}\n\n"; + + OS << "void main()\n"; + OS << "{\n"; + + std::string parameters = ""; + for (auto ®_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 ®_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; diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 551ff533b9..92056267bf 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -340,6 +340,26 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS) } } + OS << "}\n\n"; + + OS << "void main()\n"; + OS << "{\n"; + + std::string parameters = ""; + for (auto ®_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 ®_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;