Explorar o código

GPU: Implement the remaining depth testing functions.

bunnei %!s(int64=11) %!d(string=hai) anos
pai
achega
ff83d23ed5
Modificáronse 2 ficheiros con 28 adicións e 3 borrados
  1. 8 3
      src/video_core/pica.h
  2. 20 0
      src/video_core/rasterizer.cpp

+ 8 - 3
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 {

+ 20 - 0
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;