diff options
| author | 2015-05-31 02:21:55 -0400 | |
|---|---|---|
| committer | 2015-05-31 02:21:55 -0400 | |
| commit | 8852fc6a87eaf8edbb26e93d44c1596f0167e3ac (patch) | |
| tree | 2ff0e6c796bcc3d489c7fb3e67a78bccbc4a3cc4 /src/video_core/rasterizer.cpp | |
| parent | Merge pull request #830 from SeannyM/qt-noborder (diff) | |
| parent | Pica: Use zero for the SecondaryFragmentColor source. (diff) | |
| download | yuzu-8852fc6a87eaf8edbb26e93d44c1596f0167e3ac.tar.gz yuzu-8852fc6a87eaf8edbb26e93d44c1596f0167e3ac.tar.xz yuzu-8852fc6a87eaf8edbb26e93d44c1596f0167e3ac.zip | |
Merge pull request #822 from bunnei/pica-improvements
Pica improvements
Diffstat (limited to 'src/video_core/rasterizer.cpp')
| -rw-r--r-- | src/video_core/rasterizer.cpp | 76 |
1 files changed, 71 insertions, 5 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp index 6df3a74f2..113b573f8 100644 --- a/src/video_core/rasterizer.cpp +++ b/src/video_core/rasterizer.cpp | |||
| @@ -402,11 +402,16 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | |||
| 402 | 402 | ||
| 403 | auto GetSource = [&](Source source) -> Math::Vec4<u8> { | 403 | auto GetSource = [&](Source source) -> Math::Vec4<u8> { |
| 404 | switch (source) { | 404 | switch (source) { |
| 405 | // TODO: What's the difference between these two? | ||
| 406 | case Source::PrimaryColor: | 405 | case Source::PrimaryColor: |
| 406 | |||
| 407 | // HACK: Until we implement fragment lighting, use primary_color | ||
| 407 | case Source::PrimaryFragmentColor: | 408 | case Source::PrimaryFragmentColor: |
| 408 | return primary_color; | 409 | return primary_color; |
| 409 | 410 | ||
| 411 | // HACK: Until we implement fragment lighting, use zero | ||
| 412 | case Source::SecondaryFragmentColor: | ||
| 413 | return {0, 0, 0, 0}; | ||
| 414 | |||
| 410 | case Source::Texture0: | 415 | case Source::Texture0: |
| 411 | return texture_color[0]; | 416 | return texture_color[0]; |
| 412 | 417 | ||
| @@ -570,6 +575,13 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | |||
| 570 | case Operation::Add: | 575 | case Operation::Add: |
| 571 | return std::min(255, input[0] + input[1]); | 576 | return std::min(255, input[0] + input[1]); |
| 572 | 577 | ||
| 578 | case Operation::AddSigned: | ||
| 579 | { | ||
| 580 | // TODO(bunnei): Verify that the color conversion from (float) 0.5f to (byte) 128 is correct | ||
| 581 | auto result = static_cast<int>(input[0]) + static_cast<int>(input[1]) - 128; | ||
| 582 | return static_cast<u8>(MathUtil::Clamp<int>(result, 0, 255)); | ||
| 583 | } | ||
| 584 | |||
| 573 | case Operation::Lerp: | 585 | case Operation::Lerp: |
| 574 | return (input[0] * input[2] + input[1] * (255 - input[2])) / 255; | 586 | return (input[0] * input[2] + input[1] * (255 - input[2])) / 255; |
| 575 | 587 | ||
| @@ -808,10 +820,9 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | |||
| 808 | } | 820 | } |
| 809 | }; | 821 | }; |
| 810 | 822 | ||
| 811 | using BlendEquation = Regs::BlendEquation; | ||
| 812 | static auto EvaluateBlendEquation = [](const Math::Vec4<u8>& src, const Math::Vec4<u8>& srcfactor, | 823 | static auto EvaluateBlendEquation = [](const Math::Vec4<u8>& src, const Math::Vec4<u8>& srcfactor, |
| 813 | const Math::Vec4<u8>& dest, const Math::Vec4<u8>& destfactor, | 824 | const Math::Vec4<u8>& dest, const Math::Vec4<u8>& destfactor, |
| 814 | BlendEquation equation) { | 825 | Regs::BlendEquation equation) { |
| 815 | Math::Vec4<int> result; | 826 | Math::Vec4<int> result; |
| 816 | 827 | ||
| 817 | auto src_result = (src * srcfactor).Cast<int>(); | 828 | auto src_result = (src * srcfactor).Cast<int>(); |
| @@ -866,8 +877,63 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | |||
| 866 | blend_output = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_rgb); | 877 | blend_output = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_rgb); |
| 867 | blend_output.a() = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_a).a(); | 878 | blend_output.a() = EvaluateBlendEquation(combiner_output, srcfactor, dest, dstfactor, params.blend_equation_a).a(); |
| 868 | } else { | 879 | } else { |
| 869 | LOG_CRITICAL(HW_GPU, "logic op: %x", output_merger.logic_op); | 880 | static auto LogicOp = [](u8 src, u8 dest, Regs::LogicOp op) -> u8 { |
| 870 | UNIMPLEMENTED(); | 881 | switch (op) { |
| 882 | case Regs::LogicOp::Clear: | ||
| 883 | return 0; | ||
| 884 | |||
| 885 | case Regs::LogicOp::And: | ||
| 886 | return src & dest; | ||
| 887 | |||
| 888 | case Regs::LogicOp::AndReverse: | ||
| 889 | return src & ~dest; | ||
| 890 | |||
| 891 | case Regs::LogicOp::Copy: | ||
| 892 | return src; | ||
| 893 | |||
| 894 | case Regs::LogicOp::Set: | ||
| 895 | return 255; | ||
| 896 | |||
| 897 | case Regs::LogicOp::CopyInverted: | ||
| 898 | return ~src; | ||
| 899 | |||
| 900 | case Regs::LogicOp::NoOp: | ||
| 901 | return dest; | ||
| 902 | |||
| 903 | case Regs::LogicOp::Invert: | ||
| 904 | return ~dest; | ||
| 905 | |||
| 906 | case Regs::LogicOp::Nand: | ||
| 907 | return ~(src & dest); | ||
| 908 | |||
| 909 | case Regs::LogicOp::Or: | ||
| 910 | return src | dest; | ||
| 911 | |||
| 912 | case Regs::LogicOp::Nor: | ||
| 913 | return ~(src | dest); | ||
| 914 | |||
| 915 | case Regs::LogicOp::Xor: | ||
| 916 | return src ^ dest; | ||
| 917 | |||
| 918 | case Regs::LogicOp::Equiv: | ||
| 919 | return ~(src ^ dest); | ||
| 920 | |||
| 921 | case Regs::LogicOp::AndInverted: | ||
| 922 | return ~src & dest; | ||
| 923 | |||
| 924 | case Regs::LogicOp::OrReverse: | ||
| 925 | return src | ~dest; | ||
| 926 | |||
| 927 | case Regs::LogicOp::OrInverted: | ||
| 928 | return ~src | dest; | ||
| 929 | } | ||
| 930 | }; | ||
| 931 | |||
| 932 | blend_output = Math::MakeVec( | ||
| 933 | LogicOp(combiner_output.r(), dest.r(), output_merger.logic_op), | ||
| 934 | LogicOp(combiner_output.g(), dest.g(), output_merger.logic_op), | ||
| 935 | LogicOp(combiner_output.b(), dest.b(), output_merger.logic_op), | ||
| 936 | LogicOp(combiner_output.a(), dest.a(), output_merger.logic_op)); | ||
| 871 | } | 937 | } |
| 872 | 938 | ||
| 873 | const Math::Vec4<u8> result = { | 939 | const Math::Vec4<u8> result = { |