diff options
Diffstat (limited to 'src/video_core/rasterizer.cpp')
| -rw-r--r-- | src/video_core/rasterizer.cpp | 70 |
1 files changed, 67 insertions, 3 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp index 025d4e484..7f66c6d42 100644 --- a/src/video_core/rasterizer.cpp +++ b/src/video_core/rasterizer.cpp @@ -431,6 +431,47 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, combiner_output = Math::MakeVec(color_output, alpha_output); } + if (registers.output_merger.alpha_test.enable) { + bool pass = false; + + switch (registers.output_merger.alpha_test.func) { + case registers.output_merger.Never: + pass = false; + break; + + case registers.output_merger.Always: + pass = true; + break; + + case registers.output_merger.Equal: + pass = combiner_output.a() == registers.output_merger.alpha_test.ref; + break; + + case registers.output_merger.NotEqual: + pass = combiner_output.a() != registers.output_merger.alpha_test.ref; + break; + + case registers.output_merger.LessThan: + pass = combiner_output.a() < registers.output_merger.alpha_test.ref; + break; + + case registers.output_merger.LessThanOrEqual: + pass = combiner_output.a() <= registers.output_merger.alpha_test.ref; + break; + + case registers.output_merger.GreaterThan: + pass = combiner_output.a() > registers.output_merger.alpha_test.ref; + break; + + case registers.output_merger.GreaterThanOrEqual: + pass = combiner_output.a() >= registers.output_merger.alpha_test.ref; + break; + } + + if (!pass) + continue; + } + // TODO: Does depth indeed only get written even if depth testing is enabled? if (registers.output_merger.depth_test_enable) { u16 z = (u16)(-(v0.screenpos[2].ToFloat32() * w0 + @@ -441,20 +482,36 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, bool pass = false; switch (registers.output_merger.depth_test_func) { + case registers.output_merger.Never: + pass = false; + break; + case registers.output_merger.Always: pass = true; break; + case registers.output_merger.Equal: + pass = z == ref_z; + break; + + case registers.output_merger.NotEqual: + pass = z != ref_z; + break; + case registers.output_merger.LessThan: pass = z < ref_z; break; + case registers.output_merger.LessThanOrEqual: + pass = z <= ref_z; + break; + case registers.output_merger.GreaterThan: pass = z > ref_z; break; - default: - LOG_ERROR(HW_GPU, "Unknown depth test function %x", registers.output_merger.depth_test_func.Value()); + case registers.output_merger.GreaterThanOrEqual: + pass = z >= ref_z; break; } @@ -537,7 +594,14 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, exit(0); } - DrawPixel(x >> 4, y >> 4, combiner_output); + const Math::Vec4<u8> result = { + registers.output_merger.red_enable ? combiner_output.r() : dest.r(), + registers.output_merger.green_enable ? combiner_output.g() : dest.g(), + registers.output_merger.blue_enable ? combiner_output.b() : dest.b(), + registers.output_merger.alpha_enable ? combiner_output.a() : dest.a() + }; + + DrawPixel(x >> 4, y >> 4, result); } } } |
