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.cpp59
1 files changed, 57 insertions, 2 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 8f39e609b..2613e398f 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -873,8 +873,63 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
873 blend_output = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_rgb); 873 blend_output = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_rgb);
874 blend_output.a() = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_a).a(); 874 blend_output.a() = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_a).a();
875 } else { 875 } else {
876 LOG_CRITICAL(HW_GPU, "logic op: %x", output_merger.logic_op); 876 static auto LogicOp = [](u8 src, u8 dest, Regs::LogicOp op) -> u8 {
877 UNIMPLEMENTED(); 877 switch (op) {
878 case Regs::LogicOp::Clear:
879 return 0;
880
881 case Regs::LogicOp::And:
882 return src & dest;
883
884 case Regs::LogicOp::AndReverse:
885 return src & ~dest;
886
887 case Regs::LogicOp::Copy:
888 return src;
889
890 case Regs::LogicOp::Set:
891 return 255;
892
893 case Regs::LogicOp::CopyInverted:
894 return ~src;
895
896 case Regs::LogicOp::NoOp:
897 return dest;
898
899 case Regs::LogicOp::Invert:
900 return ~dest;
901
902 case Regs::LogicOp::Nand:
903 return ~(src & dest);
904
905 case Regs::LogicOp::Or:
906 return src | dest;
907
908 case Regs::LogicOp::Nor:
909 return ~(src | dest);
910
911 case Regs::LogicOp::Xor:
912 return src ^ dest;
913
914 case Regs::LogicOp::Equiv:
915 return ~(src ^ dest);
916
917 case Regs::LogicOp::AndInverted:
918 return ~src & dest;
919
920 case Regs::LogicOp::OrReverse:
921 return src | ~dest;
922
923 case Regs::LogicOp::OrInverted:
924 return ~src | dest;
925 }
926 };
927
928 blend_output = Math::MakeVec(
929 LogicOp(combiner_output.r(), dest.r(), output_merger.logic_op),
930 LogicOp(combiner_output.g(), dest.g(), output_merger.logic_op),
931 LogicOp(combiner_output.b(), dest.b(), output_merger.logic_op),
932 LogicOp(combiner_output.a(), dest.a(), output_merger.logic_op));
878 } 933 }
879 934
880 const Math::Vec4<u8> result = { 935 const Math::Vec4<u8> result = {