Browse Source

video_core: Adjust topology update logic

nce_cpp
FengChen 3 years ago
parent
commit
f09cf68f91
  1. 42
      src/video_core/engines/draw_manager.cpp
  2. 4
      src/video_core/engines/draw_manager.h

42
src/video_core/engines/draw_manager.cpp

@ -46,9 +46,6 @@ 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;
break;
default: default:
break; break;
} }
@ -156,25 +153,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;
switch (regs.primitive_topology_control) {
case PrimitiveTopologyControl::UseInBeginMethods:
break; 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);
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,7 +183,7 @@ void DrawManager::ProcessDraw(bool draw_indexed, u32 instance_count) {
LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology.Value(), LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology.Value(),
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);

4
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
Loading…
Cancel
Save