Просмотр исходного кода

Maxwell3D: Use override constants from nouveau

This fixes some incorrect rendering in Sunshine
Liam 4 лет назад
Родитель
Сommit
37aa472269
2 измененных файлов с 37 добавлено и 2 удалено
  1. 22 1
      src/video_core/engines/maxwell_3d.cpp
  2. 15 1
      src/video_core/engines/maxwell_3d.h

+ 22 - 1
src/video_core/engines/maxwell_3d.cpp

@@ -370,8 +370,29 @@ void Maxwell3D::CallMethodFromMME(u32 method, u32 method_argument) {
 }
 }
 
 
 void Maxwell3D::ProcessTopologyOverride() {
 void Maxwell3D::ProcessTopologyOverride() {
+    using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology;
+    using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride;
+
+    PrimitiveTopology topology{};
+
+    switch (regs.topology_override) {
+    case PrimitiveTopologyOverride::None:
+    case PrimitiveTopologyOverride::Points:
+        topology = PrimitiveTopology::Points;
+        break;
+    case PrimitiveTopologyOverride::Lines:
+        topology = PrimitiveTopology::Lines;
+        break;
+    case PrimitiveTopologyOverride::LineStrip:
+        topology = PrimitiveTopology::LineStrip;
+        break;
+    default:
+        topology = static_cast<PrimitiveTopology>(regs.topology_override);
+        break;
+    }
+
     if (use_topology_override) {
     if (use_topology_override) {
-        regs.draw.topology.Assign(regs.topology_override);
+        regs.draw.topology.Assign(topology);
     }
     }
 }
 }
 
 

+ 15 - 1
src/video_core/engines/maxwell_3d.h

@@ -367,6 +367,20 @@ public:
             Patches = 0xe,
             Patches = 0xe,
         };
         };
 
 
+        enum class PrimitiveTopologyOverride : u32 {
+            None = 0x0,
+            Points = 0x1,
+            Lines = 0x2,
+            LineStrip = 0x3,
+            Triangles = 0x4,
+            TriangleStrip = 0x5,
+            LinesAdjacency = 0xa,
+            LineStripAdjacency = 0xb,
+            TrianglesAdjacency = 0xc,
+            TriangleStripAdjacency = 0xd,
+            Patches = 0xe,
+        };
+
         enum class IndexFormat : u32 {
         enum class IndexFormat : u32 {
             UnsignedByte = 0x0,
             UnsignedByte = 0x0,
             UnsignedShort = 0x1,
             UnsignedShort = 0x1,
@@ -1251,7 +1265,7 @@ public:
 
 
                 INSERT_PADDING_WORDS_NOINIT(0xC);
                 INSERT_PADDING_WORDS_NOINIT(0xC);
 
 
-                PrimitiveTopology topology_override;
+                PrimitiveTopologyOverride topology_override;
 
 
                 INSERT_PADDING_WORDS_NOINIT(0x12);
                 INSERT_PADDING_WORDS_NOINIT(0x12);