diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/draw_manager.cpp | 58 | ||||
| -rw-r--r-- | src/video_core/engines/draw_manager.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 |
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 | ||
| 57 | void DrawManager::Clear(u32 layer_count) { | 59 | void 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 | ||
| 61 | void DrawManager::DrawDeferred() { | 65 | void 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 | ||
| 159 | void DrawManager::ProcessTopologyOverride() { | 165 | void 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 | ||
| 12 | namespace Tegra::Engines { | 12 | namespace Tegra::Engines { |
| 13 | using PrimitiveTopologyControl = Maxwell3D::Regs::PrimitiveTopologyControl; | ||
| 13 | using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology; | 14 | using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology; |
| 14 | using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride; | 15 | using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride; |
| 15 | using IndexBuffer = Maxwell3D::Regs::IndexBuffer; | 16 | using 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 | ||
| 139 | void RasterizerOpenGL::Clear(u32 layer_count) { | 139 | void 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) { | |||
| 216 | void RasterizerVulkan::Clear(u32 layer_count) { | 216 | void 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(); |