diff options
author | Kelebek1 <eeeedddccc@hotmail.co.uk> | 2023-10-13 21:45:03 +0200 |
---|---|---|
committer | Kelebek1 <eeeedddccc@hotmail.co.uk> | 2023-10-14 13:09:35 +0200 |
commit | 32ad99701d88fe222ec72d4a841c964d6f1b42c6 (patch) | |
tree | 0ae2e505a667a11c348bc5fc610c51bca39891c6 /src/video_core | |
parent | Merge pull request #11772 from v1993/polyfill-thread-fixes (diff) | |
download | yuzu-32ad99701d88fe222ec72d4a841c964d6f1b42c6.tar yuzu-32ad99701d88fe222ec72d4a841c964d6f1b42c6.tar.gz yuzu-32ad99701d88fe222ec72d4a841c964d6f1b42c6.tar.bz2 yuzu-32ad99701d88fe222ec72d4a841c964d6f1b42c6.tar.lz yuzu-32ad99701d88fe222ec72d4a841c964d6f1b42c6.tar.xz yuzu-32ad99701d88fe222ec72d4a841c964d6f1b42c6.tar.zst yuzu-32ad99701d88fe222ec72d4a841c964d6f1b42c6.zip |
Diffstat (limited to 'src/video_core')
-rw-r--r-- | src/video_core/engines/draw_manager.cpp | 24 | ||||
-rw-r--r-- | src/video_core/engines/draw_manager.h | 2 |
2 files changed, 25 insertions, 1 deletions
diff --git a/src/video_core/engines/draw_manager.cpp b/src/video_core/engines/draw_manager.cpp index f34090791..d77ff455b 100644 --- a/src/video_core/engines/draw_manager.cpp +++ b/src/video_core/engines/draw_manager.cpp @@ -48,8 +48,14 @@ void DrawManager::ProcessMethodCall(u32 method, u32 argument) { SetInlineIndexBuffer(regs.inline_index_4x8.index3); break; case MAXWELL3D_REG_INDEX(vertex_array_instance_first): + DrawArrayInstanced(regs.vertex_array_instance_first.topology.Value(), + regs.vertex_array_instance_first.start.Value(), + regs.vertex_array_instance_first.count.Value(), false); + break; case MAXWELL3D_REG_INDEX(vertex_array_instance_subsequent): { - LOG_WARNING(HW_GPU, "(STUBBED) called"); + DrawArrayInstanced(regs.vertex_array_instance_subsequent.topology.Value(), + regs.vertex_array_instance_subsequent.start.Value(), + regs.vertex_array_instance_subsequent.count.Value(), true); break; } case MAXWELL3D_REG_INDEX(draw_texture.src_y0): { @@ -84,6 +90,22 @@ void DrawManager::DrawArray(PrimitiveTopology topology, u32 vertex_first, u32 ve ProcessDraw(false, num_instances); } +void DrawManager::DrawArrayInstanced(PrimitiveTopology topology, u32 vertex_first, u32 vertex_count, + bool subsequent) { + draw_state.topology = topology; + draw_state.vertex_buffer.first = vertex_first; + draw_state.vertex_buffer.count = vertex_count; + + if (!subsequent) { + draw_state.instance_count = 1; + } + + draw_state.base_instance = draw_state.instance_count - 1; + draw_state.draw_mode = DrawMode::Instance; + draw_state.instance_count++; + ProcessDraw(false, 1); +} + void DrawManager::DrawIndex(PrimitiveTopology topology, u32 index_first, u32 index_count, u32 base_index, u32 base_instance, u32 num_instances) { const auto& regs{maxwell3d->regs}; diff --git a/src/video_core/engines/draw_manager.h b/src/video_core/engines/draw_manager.h index 18d959143..cfc8127fc 100644 --- a/src/video_core/engines/draw_manager.h +++ b/src/video_core/engines/draw_manager.h @@ -66,6 +66,8 @@ public: void DrawArray(PrimitiveTopology topology, u32 vertex_first, u32 vertex_count, u32 base_instance, u32 num_instances); + void DrawArrayInstanced(PrimitiveTopology topology, u32 vertex_first, u32 vertex_count, + bool subsequent); void DrawIndex(PrimitiveTopology topology, u32 index_first, u32 index_count, u32 base_index, u32 base_instance, u32 num_instances); |