Переглянути джерело

Merge pull request #9406 from vonchenplus/topology

video_core: Adjust topology update logic and Adjust Clear Manage
bunnei 3 роки тому
батько
коміт
da58eb6208

+ 34 - 24
src/video_core/engines/draw_manager.cpp

@@ -46,21 +46,26 @@ void DrawManager::ProcessMethodCall(u32 method, u32 argument) {
         SetInlineIndexBuffer(regs.inline_index_4x8.index2);
         SetInlineIndexBuffer(regs.inline_index_4x8.index2);
         SetInlineIndexBuffer(regs.inline_index_4x8.index3);
         SetInlineIndexBuffer(regs.inline_index_4x8.index3);
         break;
         break;
-    case MAXWELL3D_REG_INDEX(topology_override):
-        use_topology_override = true;
+    case MAXWELL3D_REG_INDEX(vertex_array_instance_first):
+    case MAXWELL3D_REG_INDEX(vertex_array_instance_subsequent): {
+        LOG_WARNING(HW_GPU, "(STUBBED) called");
         break;
         break;
+    }
     default:
     default:
         break;
         break;
     }
     }
 }
 }
 
 
 void DrawManager::Clear(u32 layer_count) {
 void DrawManager::Clear(u32 layer_count) {
-    maxwell3d->rasterizer->Clear(layer_count);
+    if (maxwell3d->ShouldExecute()) {
+        maxwell3d->rasterizer->Clear(layer_count);
+    }
 }
 }
 
 
 void DrawManager::DrawDeferred() {
 void DrawManager::DrawDeferred() {
-    if (draw_state.draw_mode != DrawMode::Instance || draw_state.instance_count == 0)
+    if (draw_state.draw_mode != DrawMode::Instance || draw_state.instance_count == 0) {
         return;
         return;
+    }
     DrawEnd(draw_state.instance_count + 1, true);
     DrawEnd(draw_state.instance_count + 1, true);
     draw_state.instance_count = 0;
     draw_state.instance_count = 0;
 }
 }
@@ -115,8 +120,9 @@ void DrawManager::DrawEnd(u32 instance_count, bool force_draw) {
     const auto& regs{maxwell3d->regs};
     const auto& regs{maxwell3d->regs};
     switch (draw_state.draw_mode) {
     switch (draw_state.draw_mode) {
     case DrawMode::Instance:
     case DrawMode::Instance:
-        if (!force_draw)
+        if (!force_draw) {
             break;
             break;
+        }
         [[fallthrough]];
         [[fallthrough]];
     case DrawMode::General:
     case DrawMode::General:
         draw_state.base_instance = regs.global_base_instance_index;
         draw_state.base_instance = regs.global_base_instance_index;
@@ -156,25 +162,28 @@ void DrawManager::DrawIndexSmall(u32 argument) {
     ProcessDraw(true, 1);
     ProcessDraw(true, 1);
 }
 }
 
 
-void DrawManager::ProcessTopologyOverride() {
-    if (!use_topology_override)
-        return;
-
+void DrawManager::UpdateTopology() {
     const auto& regs{maxwell3d->regs};
     const auto& regs{maxwell3d->regs};
-    switch (regs.topology_override) {
-    case PrimitiveTopologyOverride::None:
-        break;
-    case PrimitiveTopologyOverride::Points:
-        draw_state.topology = PrimitiveTopology::Points;
-        break;
-    case PrimitiveTopologyOverride::Lines:
-        draw_state.topology = PrimitiveTopology::Lines;
-        break;
-    case PrimitiveTopologyOverride::LineStrip:
-        draw_state.topology = PrimitiveTopology::LineStrip;
+    switch (regs.primitive_topology_control) {
+    case PrimitiveTopologyControl::UseInBeginMethods:
         break;
         break;
-    default:
-        draw_state.topology = static_cast<PrimitiveTopology>(regs.topology_override);
+    case PrimitiveTopologyControl::UseSeparateState:
+        switch (regs.topology_override) {
+        case PrimitiveTopologyOverride::None:
+            break;
+        case PrimitiveTopologyOverride::Points:
+            draw_state.topology = PrimitiveTopology::Points;
+            break;
+        case PrimitiveTopologyOverride::Lines:
+            draw_state.topology = PrimitiveTopology::Lines;
+            break;
+        case PrimitiveTopologyOverride::LineStrip:
+            draw_state.topology = PrimitiveTopology::LineStrip;
+            break;
+        default:
+            draw_state.topology = static_cast<PrimitiveTopology>(regs.topology_override);
+            break;
+        }
         break;
         break;
     }
     }
 }
 }
@@ -183,9 +192,10 @@ void DrawManager::ProcessDraw(bool draw_indexed, u32 instance_count) {
     LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology,
     LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology,
               draw_indexed ? draw_state.index_buffer.count : draw_state.vertex_buffer.count);
               draw_indexed ? draw_state.index_buffer.count : draw_state.vertex_buffer.count);
 
 
-    ProcessTopologyOverride();
+    UpdateTopology();
 
 
-    if (maxwell3d->ShouldExecute())
+    if (maxwell3d->ShouldExecute()) {
         maxwell3d->rasterizer->Draw(draw_indexed, instance_count);
         maxwell3d->rasterizer->Draw(draw_indexed, instance_count);
+    }
 }
 }
 } // namespace Tegra::Engines
 } // namespace Tegra::Engines

+ 2 - 2
src/video_core/engines/draw_manager.h

@@ -10,6 +10,7 @@ class RasterizerInterface;
 }
 }
 
 
 namespace Tegra::Engines {
 namespace Tegra::Engines {
+using PrimitiveTopologyControl = Maxwell3D::Regs::PrimitiveTopologyControl;
 using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology;
 using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology;
 using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride;
 using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride;
 using IndexBuffer = Maxwell3D::Regs::IndexBuffer;
 using IndexBuffer = Maxwell3D::Regs::IndexBuffer;
@@ -58,12 +59,11 @@ private:
 
 
     void DrawIndexSmall(u32 argument);
     void DrawIndexSmall(u32 argument);
 
 
-    void ProcessTopologyOverride();
+    void UpdateTopology();
 
 
     void ProcessDraw(bool draw_indexed, u32 instance_count);
     void ProcessDraw(bool draw_indexed, u32 instance_count);
 
 
     Maxwell3D* maxwell3d{};
     Maxwell3D* maxwell3d{};
     State draw_state{};
     State draw_state{};
-    bool use_topology_override{};
 };
 };
 } // namespace Tegra::Engines
 } // namespace Tegra::Engines

+ 0 - 3
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -138,9 +138,6 @@ void RasterizerOpenGL::LoadDiskResources(u64 title_id, std::stop_token stop_load
 
 
 void RasterizerOpenGL::Clear(u32 layer_count) {
 void RasterizerOpenGL::Clear(u32 layer_count) {
     MICROPROFILE_SCOPE(OpenGL_Clears);
     MICROPROFILE_SCOPE(OpenGL_Clears);
-    if (!maxwell3d->ShouldExecute()) {
-        return;
-    }
 
 
     const auto& regs = maxwell3d->regs;
     const auto& regs = maxwell3d->regs;
     bool use_color{};
     bool use_color{};

+ 0 - 3
src/video_core/renderer_vulkan/vk_rasterizer.cpp

@@ -216,9 +216,6 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) {
 void RasterizerVulkan::Clear(u32 layer_count) {
 void RasterizerVulkan::Clear(u32 layer_count) {
     MICROPROFILE_SCOPE(Vulkan_Clearing);
     MICROPROFILE_SCOPE(Vulkan_Clearing);
 
 
-    if (!maxwell3d->ShouldExecute()) {
-        return;
-    }
     FlushWork();
     FlushWork();
 
 
     query_cache.UpdateCounters();
     query_cache.UpdateCounters();