GL/Vulkan: not discard fragment when hits NEVER comparsion (#2156)

GL/Vulkan: return no operation when comparison is never
This commit is contained in:
raven02 2016-09-26 21:59:38 +08:00 committed by GitHub
parent 7884356e90
commit 528b2d6c7b
2 changed files with 5 additions and 9 deletions

View file

@ -349,10 +349,6 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
{ {
auto make_comparison_test = [](rsx::comparison_function compare_func, const std::string &test, const std::string &a, const std::string &b) -> std::string auto make_comparison_test = [](rsx::comparison_function compare_func, const std::string &test, const std::string &a, const std::string &b) -> std::string
{ {
if (compare_func == rsx::comparison_function::always) return{};
if (compare_func == rsx::comparison_function::never) return " discard;\n";
std::string compare; std::string compare;
switch (compare_func) switch (compare_func)
{ {
@ -362,6 +358,8 @@ void GLFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
case rsx::comparison_function::less: compare = " < "; break; case rsx::comparison_function::less: compare = " < "; break;
case rsx::comparison_function::greater: compare = " > "; break; case rsx::comparison_function::greater: compare = " > "; break;
case rsx::comparison_function::greater_or_equal: compare = " >= "; break; case rsx::comparison_function::greater_or_equal: compare = " >= "; break;
default:
return "";
} }
return " if (" + test + "!(" + a + compare + b + ")) discard;\n"; return " if (" + test + "!(" + a + compare + b + ")) discard;\n";

View file

@ -356,10 +356,6 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
{ {
auto make_comparison_test = [](rsx::comparison_function compare_func, const std::string &test, const std::string &a, const std::string &b) -> std::string auto make_comparison_test = [](rsx::comparison_function compare_func, const std::string &test, const std::string &a, const std::string &b) -> std::string
{ {
if (compare_func == rsx::comparison_function::always) return{};
if (compare_func == rsx::comparison_function::never) return " discard;\n";
std::string compare; std::string compare;
switch (compare_func) switch (compare_func)
{ {
@ -368,7 +364,9 @@ void VKFragmentDecompilerThread::insertMainEnd(std::stringstream & OS)
case rsx::comparison_function::less_or_equal: compare = " <= "; break; case rsx::comparison_function::less_or_equal: compare = " <= "; break;
case rsx::comparison_function::less: compare = " < "; break; case rsx::comparison_function::less: compare = " < "; break;
case rsx::comparison_function::greater: compare = " > "; break; case rsx::comparison_function::greater: compare = " > "; break;
case rsx::comparison_function::greater_or_equal: compare = " >= "; break; case rsx::comparison_function::greater_or_equal: compare = " >= "; break;
default:
return "";
} }
return " if (" + test + "!(" + a + compare + b + ")) discard;\n"; return " if (" + test + "!(" + a + compare + b + ")) discard;\n";