summaryrefslogtreecommitdiff
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/rasterizer.cpp')
-rw-r--r--src/video_core/rasterizer.cpp99
1 files changed, 42 insertions, 57 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 5b9ed7c64..0434ad05a 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -923,92 +923,72 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
923 if (output_merger.alphablend_enable) { 923 if (output_merger.alphablend_enable) {
924 auto params = output_merger.alpha_blending; 924 auto params = output_merger.alpha_blending;
925 925
926 auto LookupFactorRGB = [&](Regs::BlendFactor factor) -> Math::Vec3<u8> { 926 auto LookupFactor = [&](unsigned channel, Regs::BlendFactor factor) -> u8 {
927 DEBUG_ASSERT(channel < 4);
928
929 const Math::Vec4<u8> blend_const = {
930 static_cast<u8>(output_merger.blend_const.r),
931 static_cast<u8>(output_merger.blend_const.g),
932 static_cast<u8>(output_merger.blend_const.b),
933 static_cast<u8>(output_merger.blend_const.a)
934 };
935
927 switch (factor) { 936 switch (factor) {
928 case Regs::BlendFactor::Zero : 937 case Regs::BlendFactor::Zero:
929 return Math::Vec3<u8>(0, 0, 0); 938 return 0;
930 939
931 case Regs::BlendFactor::One : 940 case Regs::BlendFactor::One:
932 return Math::Vec3<u8>(255, 255, 255); 941 return 255;
933 942
934 case Regs::BlendFactor::SourceColor: 943 case Regs::BlendFactor::SourceColor:
935 return combiner_output.rgb(); 944 return combiner_output[channel];
936 945
937 case Regs::BlendFactor::OneMinusSourceColor: 946 case Regs::BlendFactor::OneMinusSourceColor:
938 return Math::Vec3<u8>(255 - combiner_output.r(), 255 - combiner_output.g(), 255 - combiner_output.b()); 947 return 255 - combiner_output[channel];
939 948
940 case Regs::BlendFactor::DestColor: 949 case Regs::BlendFactor::DestColor:
941 return dest.rgb(); 950 return dest[channel];
942 951
943 case Regs::BlendFactor::OneMinusDestColor: 952 case Regs::BlendFactor::OneMinusDestColor:
944 return Math::Vec3<u8>(255 - dest.r(), 255 - dest.g(), 255 - dest.b()); 953 return 255 - dest[channel];
945 954
946 case Regs::BlendFactor::SourceAlpha: 955 case Regs::BlendFactor::SourceAlpha:
947 return Math::Vec3<u8>(combiner_output.a(), combiner_output.a(), combiner_output.a()); 956 return combiner_output.a();
948 957
949 case Regs::BlendFactor::OneMinusSourceAlpha: 958 case Regs::BlendFactor::OneMinusSourceAlpha:
950 return Math::Vec3<u8>(255 - combiner_output.a(), 255 - combiner_output.a(), 255 - combiner_output.a()); 959 return 255 - combiner_output.a();
951 960
952 case Regs::BlendFactor::DestAlpha: 961 case Regs::BlendFactor::DestAlpha:
953 return Math::Vec3<u8>(dest.a(), dest.a(), dest.a()); 962 return dest.a();
954 963
955 case Regs::BlendFactor::OneMinusDestAlpha: 964 case Regs::BlendFactor::OneMinusDestAlpha:
956 return Math::Vec3<u8>(255 - dest.a(), 255 - dest.a(), 255 - dest.a()); 965 return 255 - dest.a();
957 966
958 case Regs::BlendFactor::ConstantColor: 967 case Regs::BlendFactor::ConstantColor:
959 return Math::Vec3<u8>(output_merger.blend_const.r, output_merger.blend_const.g, output_merger.blend_const.b); 968 return blend_const[channel];
960 969
961 case Regs::BlendFactor::OneMinusConstantColor: 970 case Regs::BlendFactor::OneMinusConstantColor:
962 return Math::Vec3<u8>(255 - output_merger.blend_const.r, 255 - output_merger.blend_const.g, 255 - output_merger.blend_const.b); 971 return 255 - blend_const[channel];
963 972
964 case Regs::BlendFactor::ConstantAlpha: 973 case Regs::BlendFactor::ConstantAlpha:
965 return Math::Vec3<u8>(output_merger.blend_const.a, output_merger.blend_const.a, output_merger.blend_const.a); 974 return blend_const.a();
966 975
967 case Regs::BlendFactor::OneMinusConstantAlpha: 976 case Regs::BlendFactor::OneMinusConstantAlpha:
968 return Math::Vec3<u8>(255 - output_merger.blend_const.a, 255 - output_merger.blend_const.a, 255 - output_merger.blend_const.a); 977 return 255 - blend_const.a();
969
970 default:
971 LOG_CRITICAL(HW_GPU, "Unknown color blend factor %x", factor);
972 UNIMPLEMENTED();
973 break;
974 }
975
976 return {};
977 };
978
979 auto LookupFactorA = [&](Regs::BlendFactor factor) -> u8 {
980 switch (factor) {
981 case Regs::BlendFactor::Zero:
982 return 0;
983
984 case Regs::BlendFactor::One:
985 return 255;
986
987 case Regs::BlendFactor::SourceAlpha:
988 return combiner_output.a();
989
990 case Regs::BlendFactor::OneMinusSourceAlpha:
991 return 255 - combiner_output.a();
992 978
993 case Regs::BlendFactor::DestAlpha: 979 case Regs::BlendFactor::SourceAlphaSaturate:
994 return dest.a(); 980 // Returns 1.0 for the alpha channel
995 981 if (channel == 3)
996 case Regs::BlendFactor::OneMinusDestAlpha: 982 return 255;
997 return 255 - dest.a(); 983 return std::min(combiner_output.a(), static_cast<u8>(255 - dest.a()));
998
999 case Regs::BlendFactor::ConstantAlpha:
1000 return output_merger.blend_const.a;
1001
1002 case Regs::BlendFactor::OneMinusConstantAlpha:
1003 return 255 - output_merger.blend_const.a;
1004 984
1005 default: 985 default:
1006 LOG_CRITICAL(HW_GPU, "Unknown alpha blend factor %x", factor); 986 LOG_CRITICAL(HW_GPU, "Unknown blend factor %x", factor);
1007 UNIMPLEMENTED(); 987 UNIMPLEMENTED();
1008 break; 988 break;
1009 } 989 }
1010 990
1011 return {}; 991 return combiner_output[channel];
1012 }; 992 };
1013 993
1014 static auto EvaluateBlendEquation = [](const Math::Vec4<u8>& src, const Math::Vec4<u8>& srcfactor, 994 static auto EvaluateBlendEquation = [](const Math::Vec4<u8>& src, const Math::Vec4<u8>& srcfactor,
@@ -1060,10 +1040,15 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
1060 MathUtil::Clamp(result.a(), 0, 255)); 1040 MathUtil::Clamp(result.a(), 0, 255));
1061 }; 1041 };
1062 1042
1063 auto srcfactor = Math::MakeVec(LookupFactorRGB(params.factor_source_rgb), 1043 auto srcfactor = Math::MakeVec(LookupFactor(0, params.factor_source_rgb),
1064 LookupFactorA(params.factor_source_a)); 1044 LookupFactor(1, params.factor_source_rgb),
1065 auto dstfactor = Math::MakeVec(LookupFactorRGB(params.factor_dest_rgb), 1045 LookupFactor(2, params.factor_source_rgb),
1066 LookupFactorA(params.factor_dest_a)); 1046 LookupFactor(3, params.factor_source_a));
1047
1048 auto dstfactor = Math::MakeVec(LookupFactor(0, params.factor_dest_rgb),
1049 LookupFactor(1, params.factor_dest_rgb),
1050 LookupFactor(2, params.factor_dest_rgb),
1051 LookupFactor(3, params.factor_dest_a));
1067 1052
1068 blend_output = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_rgb); 1053 blend_output = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_rgb);
1069 blend_output.a() = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_a).a(); 1054 blend_output.a() = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_a).a();