diff options
| author | 2016-04-02 03:26:10 +0200 | |
|---|---|---|
| committer | 2016-04-17 22:44:24 +0200 | |
| commit | e2b63a2dd7ed1b2714daf5ff94f7603111ce78c6 (patch) | |
| tree | 0ab1612e1c091a348580affd4ad4853798c55785 /src/video_core/rasterizer.cpp | |
| parent | Merge pull request #1657 from JayFoxRox/remove-dump-geometry (diff) | |
| download | yuzu-e2b63a2dd7ed1b2714daf5ff94f7603111ce78c6.tar.gz yuzu-e2b63a2dd7ed1b2714daf5ff94f7603111ce78c6.tar.xz yuzu-e2b63a2dd7ed1b2714daf5ff94f7603111ce78c6.zip | |
Rasterizer: Allow all blend factors for alpha blend-func
Diffstat (limited to 'src/video_core/rasterizer.cpp')
| -rw-r--r-- | src/video_core/rasterizer.cpp | 99 |
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(); |