summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/engines/draw_manager.cpp58
-rw-r--r--src/video_core/engines/draw_manager.h4
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp3
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp3
4 files changed, 36 insertions, 32 deletions
diff --git a/src/video_core/engines/draw_manager.cpp b/src/video_core/engines/draw_manager.cpp
index b213c374f..3a78421f6 100644
--- a/src/video_core/engines/draw_manager.cpp
+++ b/src/video_core/engines/draw_manager.cpp
@@ -46,21 +46,26 @@ 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): 49 case MAXWELL3D_REG_INDEX(vertex_array_instance_first):
50 use_topology_override = true; 50 case MAXWELL3D_REG_INDEX(vertex_array_instance_subsequent): {
51 LOG_WARNING(HW_GPU, "(STUBBED) called");
51 break; 52 break;
53 }
52 default: 54 default:
53 break; 55 break;
54 } 56 }
55} 57}
56 58
57void DrawManager::Clear(u32 layer_count) { 59void DrawManager::Clear(u32 layer_count) {
58 maxwell3d->rasterizer->Clear(layer_count); 60 if (maxwell3d->ShouldExecute()) {
61 maxwell3d->rasterizer->Clear(layer_count);
62 }
59} 63}
60 64
61void DrawManager::DrawDeferred() { 65void DrawManager::DrawDeferred() {
62 if (draw_state.draw_mode != DrawMode::Instance || draw_state.instance_count == 0) 66 if (draw_state.draw_mode != DrawMode::Instance || draw_state.instance_count == 0) {
63 return; 67 return;
68 }
64 DrawEnd(draw_state.instance_count + 1, true); 69 DrawEnd(draw_state.instance_count + 1, true);
65 draw_state.instance_count = 0; 70 draw_state.instance_count = 0;
66} 71}
@@ -115,8 +120,9 @@ void DrawManager::DrawEnd(u32 instance_count, bool force_draw) {
115 const auto& regs{maxwell3d->regs}; 120 const auto& regs{maxwell3d->regs};
116 switch (draw_state.draw_mode) { 121 switch (draw_state.draw_mode) {
117 case DrawMode::Instance: 122 case DrawMode::Instance:
118 if (!force_draw) 123 if (!force_draw) {
119 break; 124 break;
125 }
120 [[fallthrough]]; 126 [[fallthrough]];
121 case DrawMode::General: 127 case DrawMode::General:
122 draw_state.base_instance = regs.global_base_instance_index; 128 draw_state.base_instance = regs.global_base_instance_index;
@@ -156,25 +162,28 @@ void DrawManager::DrawIndexSmall(u32 argument) {
156 ProcessDraw(true, 1); 162 ProcessDraw(true, 1);
157} 163}
158 164
159void DrawManager::ProcessTopologyOverride() { 165void DrawManager::UpdateTopology() {
160 if (!use_topology_override)
161 return;
162
163 const auto& regs{maxwell3d->regs}; 166 const auto& regs{maxwell3d->regs};
164 switch (regs.topology_override) { 167 switch (regs.primitive_topology_control) {
165 case PrimitiveTopologyOverride::None: 168 case PrimitiveTopologyControl::UseInBeginMethods:
166 break;
167 case PrimitiveTopologyOverride::Points:
168 draw_state.topology = PrimitiveTopology::Points;
169 break;
170 case PrimitiveTopologyOverride::Lines:
171 draw_state.topology = PrimitiveTopology::Lines;
172 break;
173 case PrimitiveTopologyOverride::LineStrip:
174 draw_state.topology = PrimitiveTopology::LineStrip;
175 break; 169 break;
176 default: 170 case PrimitiveTopologyControl::UseSeparateState:
177 draw_state.topology = static_cast<PrimitiveTopology>(regs.topology_override); 171 switch (regs.topology_override) {
172 case PrimitiveTopologyOverride::None:
173 break;
174 case PrimitiveTopologyOverride::Points:
175 draw_state.topology = PrimitiveTopology::Points;
176 break;
177 case PrimitiveTopologyOverride::Lines:
178 draw_state.topology = PrimitiveTopology::Lines;
179 break;
180 case PrimitiveTopologyOverride::LineStrip:
181 draw_state.topology = PrimitiveTopology::LineStrip;
182 break;
183 default:
184 draw_state.topology = static_cast<PrimitiveTopology>(regs.topology_override);
185 break;
186 }
178 break; 187 break;
179 } 188 }
180} 189}
@@ -183,9 +192,10 @@ void DrawManager::ProcessDraw(bool draw_indexed, u32 instance_count) {
183 LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology, 192 LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology,
184 draw_indexed ? draw_state.index_buffer.count : draw_state.vertex_buffer.count); 193 draw_indexed ? draw_state.index_buffer.count : draw_state.vertex_buffer.count);
185 194
186 ProcessTopologyOverride(); 195 UpdateTopology();
187 196
188 if (maxwell3d->ShouldExecute()) 197 if (maxwell3d->ShouldExecute()) {
189 maxwell3d->rasterizer->Draw(draw_indexed, instance_count); 198 maxwell3d->rasterizer->Draw(draw_indexed, instance_count);
199 }
190} 200}
191} // namespace Tegra::Engines 201} // namespace Tegra::Engines
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
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 64ed6f628..a44b8c454 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -138,9 +138,6 @@ void RasterizerOpenGL::LoadDiskResources(u64 title_id, std::stop_token stop_load
138 138
139void RasterizerOpenGL::Clear(u32 layer_count) { 139void RasterizerOpenGL::Clear(u32 layer_count) {
140 MICROPROFILE_SCOPE(OpenGL_Clears); 140 MICROPROFILE_SCOPE(OpenGL_Clears);
141 if (!maxwell3d->ShouldExecute()) {
142 return;
143 }
144 141
145 const auto& regs = maxwell3d->regs; 142 const auto& regs = maxwell3d->regs;
146 bool use_color{}; 143 bool use_color{};
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 823b9ca2a..a8b82abae 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -216,9 +216,6 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) {
216void RasterizerVulkan::Clear(u32 layer_count) { 216void RasterizerVulkan::Clear(u32 layer_count) {
217 MICROPROFILE_SCOPE(Vulkan_Clearing); 217 MICROPROFILE_SCOPE(Vulkan_Clearing);
218 218
219 if (!maxwell3d->ShouldExecute()) {
220 return;
221 }
222 FlushWork(); 219 FlushWork();
223 220
224 query_cache.UpdateCounters(); 221 query_cache.UpdateCounters();