summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar FengChen2022-12-08 22:03:14 +0800
committerGravatar FengChen2022-12-08 22:40:28 +0800
commit15d63c3d3d0f70efe470eef2b295d6c4bc3bce19 (patch)
tree18d26dc8f8b3e93c869041a3fe6bae07d1a78f0e
parentMerge pull request #9401 from vonchenplus/draw_manager (diff)
downloadyuzu-15d63c3d3d0f70efe470eef2b295d6c4bc3bce19.tar.gz
yuzu-15d63c3d3d0f70efe470eef2b295d6c4bc3bce19.tar.xz
yuzu-15d63c3d3d0f70efe470eef2b295d6c4bc3bce19.zip
video_core: Adjust topology update logic
-rw-r--r--src/video_core/engines/draw_manager.cpp42
-rw-r--r--src/video_core/engines/draw_manager.h4
2 files changed, 23 insertions, 23 deletions
diff --git a/src/video_core/engines/draw_manager.cpp b/src/video_core/engines/draw_manager.cpp
index c59524e58..36e4ec89d 100644
--- a/src/video_core/engines/draw_manager.cpp
+++ b/src/video_core/engines/draw_manager.cpp
@@ -46,9 +46,6 @@ void DrawManager::ProcessMethodCall(u32 method, u32 argument) {
46 SetInlineIndexBuffer(regs.inline_index_4x8.index2); 46 SetInlineIndexBuffer(regs.inline_index_4x8.index2);
47 SetInlineIndexBuffer(regs.inline_index_4x8.index3); 47 SetInlineIndexBuffer(regs.inline_index_4x8.index3);
48 break; 48 break;
49 case MAXWELL3D_REG_INDEX(topology_override):
50 use_topology_override = true;
51 break;
52 default: 49 default:
53 break; 50 break;
54 } 51 }
@@ -156,25 +153,28 @@ void DrawManager::DrawIndexSmall(u32 argument) {
156 ProcessDraw(true, 1); 153 ProcessDraw(true, 1);
157} 154}
158 155
159void DrawManager::ProcessTopologyOverride() { 156void DrawManager::UpdateTopology() {
160 if (!use_topology_override)
161 return;
162
163 const auto& regs{maxwell3d->regs}; 157 const auto& regs{maxwell3d->regs};
164 switch (regs.topology_override) { 158 switch (regs.primitive_topology_control) {
165 case PrimitiveTopologyOverride::None: 159 case PrimitiveTopologyControl::UseInBeginMethods:
166 break;
167 case PrimitiveTopologyOverride::Points:
168 draw_state.topology = PrimitiveTopology::Points;
169 break; 160 break;
170 case PrimitiveTopologyOverride::Lines: 161 case PrimitiveTopologyControl::UseSeparateState:
171 draw_state.topology = PrimitiveTopology::Lines; 162 switch (regs.topology_override) {
172 break; 163 case PrimitiveTopologyOverride::None:
173 case PrimitiveTopologyOverride::LineStrip: 164 break;
174 draw_state.topology = PrimitiveTopology::LineStrip; 165 case PrimitiveTopologyOverride::Points:
175 break; 166 draw_state.topology = PrimitiveTopology::Points;
176 default: 167 break;
177 draw_state.topology = static_cast<PrimitiveTopology>(regs.topology_override); 168 case PrimitiveTopologyOverride::Lines:
169 draw_state.topology = PrimitiveTopology::Lines;
170 break;
171 case PrimitiveTopologyOverride::LineStrip:
172 draw_state.topology = PrimitiveTopology::LineStrip;
173 break;
174 default:
175 draw_state.topology = static_cast<PrimitiveTopology>(regs.topology_override);
176 break;
177 }
178 break; 178 break;
179 } 179 }
180} 180}
@@ -183,7 +183,7 @@ void DrawManager::ProcessDraw(bool draw_indexed, u32 instance_count) {
183 LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology.Value(), 183 LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology.Value(),
184 draw_indexed ? draw_state.index_buffer.count : draw_state.vertex_buffer.count); 184 draw_indexed ? draw_state.index_buffer.count : draw_state.vertex_buffer.count);
185 185
186 ProcessTopologyOverride(); 186 UpdateTopology();
187 187
188 if (maxwell3d->ShouldExecute()) 188 if (maxwell3d->ShouldExecute())
189 maxwell3d->rasterizer->Draw(draw_indexed, instance_count); 189 maxwell3d->rasterizer->Draw(draw_indexed, instance_count);
diff --git a/src/video_core/engines/draw_manager.h b/src/video_core/engines/draw_manager.h
index 4f67027ca..0e6930a9c 100644
--- a/src/video_core/engines/draw_manager.h
+++ b/src/video_core/engines/draw_manager.h
@@ -10,6 +10,7 @@ class RasterizerInterface;
10} 10}
11 11
12namespace Tegra::Engines { 12namespace Tegra::Engines {
13using PrimitiveTopologyControl = Maxwell3D::Regs::PrimitiveTopologyControl;
13using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology; 14using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology;
14using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride; 15using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride;
15using IndexBuffer = Maxwell3D::Regs::IndexBuffer; 16using IndexBuffer = Maxwell3D::Regs::IndexBuffer;
@@ -58,12 +59,11 @@ private:
58 59
59 void DrawIndexSmall(u32 argument); 60 void DrawIndexSmall(u32 argument);
60 61
61 void ProcessTopologyOverride(); 62 void UpdateTopology();
62 63
63 void ProcessDraw(bool draw_indexed, u32 instance_count); 64 void ProcessDraw(bool draw_indexed, u32 instance_count);
64 65
65 Maxwell3D* maxwell3d{}; 66 Maxwell3D* maxwell3d{};
66 State draw_state{}; 67 State draw_state{};
67 bool use_topology_override{};
68}; 68};
69} // namespace Tegra::Engines 69} // namespace Tegra::Engines