From ff83d23ed5a2b204a6768e853329204cb1dd1bd3 Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Sun, 25 Jan 2015 23:34:14 -0500
Subject: [PATCH] GPU: Implement the remaining depth testing functions.

---
 src/video_core/pica.h         | 11 ++++++++---
 src/video_core/rasterizer.cpp | 20 ++++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index de1ce05b6d..15850ba172 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -311,9 +311,14 @@ struct Regs {
 
     struct {
         enum DepthFunc : u32 {
-            Always      = 1,
-            LessThan    = 4,
-            GreaterThan = 6,
+            Never               = 0,
+            Always              = 1,
+            Equal               = 2,
+            NotEqual            = 3,
+            LessThan            = 4,
+            LessThanOrEqual     = 5,
+            GreaterThan         = 6,
+            GreaterThanOrEqual  = 7,
         };
 
         union {
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 025d4e4841..219a1bbb7f 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -441,18 +441,38 @@ 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;
 
+                case registers.output_merger.GreaterThanOrEqual:
+                    pass = z >= ref_z;
+                    break;
+
                 default:
                     LOG_ERROR(HW_GPU, "Unknown depth test function %x", registers.output_merger.depth_test_func.Value());
                     break;