diff options
Diffstat (limited to 'src/video_core/macro')
| -rw-r--r-- | src/video_core/macro/macro_hle.cpp | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/src/video_core/macro/macro_hle.cpp b/src/video_core/macro/macro_hle.cpp index 1cc202cc7..da988cc0d 100644 --- a/src/video_core/macro/macro_hle.cpp +++ b/src/video_core/macro/macro_hle.cpp | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include "video_core/engines/maxwell_3d.h" | 9 | #include "video_core/engines/maxwell_3d.h" |
| 10 | #include "video_core/macro/macro.h" | 10 | #include "video_core/macro/macro.h" |
| 11 | #include "video_core/macro/macro_hle.h" | 11 | #include "video_core/macro/macro_hle.h" |
| 12 | #include "video_core/memory_manager.h" | ||
| 12 | #include "video_core/rasterizer_interface.h" | 13 | #include "video_core/rasterizer_interface.h" |
| 13 | 14 | ||
| 14 | namespace Tegra { | 15 | namespace Tegra { |
| @@ -24,15 +25,14 @@ void HLE_771BB18C62444DA0(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& | |||
| 24 | parameters[4], parameters[1], parameters[3], parameters[5], instance_count); | 25 | parameters[4], parameters[1], parameters[3], parameters[5], instance_count); |
| 25 | } | 26 | } |
| 26 | 27 | ||
| 27 | void HLE_0D61FC9FAAC9FCAD(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { | 28 | void HLE_DrawArraysIndirect(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { |
| 28 | const u32 instance_count = (maxwell3d.GetRegisterValue(0xD1B) & parameters[2]); | 29 | const u32 instance_count = (maxwell3d.GetRegisterValue(0xD1B) & parameters[2]); |
| 29 | maxwell3d.draw_manager->DrawArray( | 30 | maxwell3d.draw_manager->DrawArray( |
| 30 | static_cast<Tegra::Engines::Maxwell3D::Regs::PrimitiveTopology>(parameters[0]), | 31 | static_cast<Tegra::Engines::Maxwell3D::Regs::PrimitiveTopology>(parameters[0]), |
| 31 | parameters[3], parameters[1], parameters[4], instance_count); | 32 | parameters[3], parameters[1], parameters[4], instance_count); |
| 32 | } | 33 | } |
| 33 | 34 | ||
| 34 | void HLE_0217920100488FF7(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { | 35 | void HLE_DrawIndexedIndirect(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { |
| 35 | const u32 instance_count = (maxwell3d.GetRegisterValue(0xD1B) & parameters[2]); | ||
| 36 | const u32 element_base = parameters[4]; | 36 | const u32 element_base = parameters[4]; |
| 37 | const u32 base_instance = parameters[5]; | 37 | const u32 base_instance = parameters[5]; |
| 38 | maxwell3d.regs.vertex_id_base = element_base; | 38 | maxwell3d.regs.vertex_id_base = element_base; |
| @@ -41,9 +41,18 @@ void HLE_0217920100488FF7(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& | |||
| 41 | maxwell3d.CallMethod(0x8e4, element_base, true); | 41 | maxwell3d.CallMethod(0x8e4, element_base, true); |
| 42 | maxwell3d.CallMethod(0x8e5, base_instance, true); | 42 | maxwell3d.CallMethod(0x8e5, base_instance, true); |
| 43 | 43 | ||
| 44 | maxwell3d.draw_manager->DrawIndex( | 44 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); |
| 45 | static_cast<Tegra::Engines::Maxwell3D::Regs::PrimitiveTopology>(parameters[0]), | 45 | params.is_indexed = true; |
| 46 | parameters[3], parameters[1], element_base, base_instance, instance_count); | 46 | params.include_count = false; |
| 47 | params.count_start_address = 0; | ||
| 48 | params.indirect_start_address = maxwell3d.macro_addresses[1]; | ||
| 49 | params.buffer_size = 5 * sizeof(u32); | ||
| 50 | params.max_draw_counts = 1; | ||
| 51 | params.stride = 0; | ||
| 52 | |||
| 53 | maxwell3d.draw_manager->DrawIndexedIndirect( | ||
| 54 | static_cast<Tegra::Engines::Maxwell3D::Regs::PrimitiveTopology>(parameters[0]), 0, | ||
| 55 | 1U << 18); | ||
| 47 | 56 | ||
| 48 | maxwell3d.regs.vertex_id_base = 0x0; | 57 | maxwell3d.regs.vertex_id_base = 0x0; |
| 49 | maxwell3d.CallMethod(0x8e3, 0x640, true); | 58 | maxwell3d.CallMethod(0x8e3, 0x640, true); |
| @@ -51,8 +60,9 @@ void HLE_0217920100488FF7(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& | |||
| 51 | maxwell3d.CallMethod(0x8e5, 0x0, true); | 60 | maxwell3d.CallMethod(0x8e5, 0x0, true); |
| 52 | } | 61 | } |
| 53 | 62 | ||
| 54 | // Multidraw Indirect | 63 | // Multidraw Indixed Indirect |
| 55 | void HLE_3F5E74B9C9A50164(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { | 64 | void HLE_MultiDrawIndexedIndirect(Engines::Maxwell3D& maxwell3d, |
| 65 | const std::vector<u32>& parameters) { | ||
| 56 | const u32 start_indirect = parameters[0]; | 66 | const u32 start_indirect = parameters[0]; |
| 57 | const u32 end_indirect = parameters[1]; | 67 | const u32 end_indirect = parameters[1]; |
| 58 | if (start_indirect >= end_indirect) { | 68 | if (start_indirect >= end_indirect) { |
| @@ -66,7 +76,6 @@ void HLE_3F5E74B9C9A50164(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& | |||
| 66 | // size of each indirect segment | 76 | // size of each indirect segment |
| 67 | const u32 indirect_words = 5 + padding; | 77 | const u32 indirect_words = 5 + padding; |
| 68 | const u32 stride = indirect_words * sizeof(u32); | 78 | const u32 stride = indirect_words * sizeof(u32); |
| 69 | const GPUVAddr start_address = maxwell3d.current_dma_segment + 4 * sizeof(u32); | ||
| 70 | const std::size_t draw_count = end_indirect - start_indirect; | 79 | const std::size_t draw_count = end_indirect - start_indirect; |
| 71 | u32 lowest_first = std::numeric_limits<u32>::max(); | 80 | u32 lowest_first = std::numeric_limits<u32>::max(); |
| 72 | u32 highest_limit = std::numeric_limits<u32>::min(); | 81 | u32 highest_limit = std::numeric_limits<u32>::min(); |
| @@ -80,12 +89,16 @@ void HLE_3F5E74B9C9A50164(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& | |||
| 80 | 89 | ||
| 81 | const u32 base_vertex = parameters[8]; | 90 | const u32 base_vertex = parameters[8]; |
| 82 | const u32 base_instance = parameters[9]; | 91 | const u32 base_instance = parameters[9]; |
| 92 | maxwell3d.regs.vertex_id_base = base_vertex; | ||
| 83 | maxwell3d.CallMethod(0x8e3, 0x640, true); | 93 | maxwell3d.CallMethod(0x8e3, 0x640, true); |
| 84 | maxwell3d.CallMethod(0x8e4, base_vertex, true); | 94 | maxwell3d.CallMethod(0x8e4, base_vertex, true); |
| 85 | maxwell3d.CallMethod(0x8e5, base_instance, true); | 95 | maxwell3d.CallMethod(0x8e5, base_instance, true); |
| 86 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); | 96 | auto& params = maxwell3d.draw_manager->GetIndirectParams(); |
| 87 | params.start_address = start_address; | 97 | params.is_indexed = true; |
| 88 | params.buffer_size = sizeof(u32) + stride * draw_count; | 98 | params.include_count = true; |
| 99 | params.count_start_address = maxwell3d.macro_addresses[4]; | ||
| 100 | params.indirect_start_address = maxwell3d.macro_addresses[5]; | ||
| 101 | params.buffer_size = stride * draw_count; | ||
| 89 | params.max_draw_counts = draw_count; | 102 | params.max_draw_counts = draw_count; |
| 90 | params.stride = stride; | 103 | params.stride = stride; |
| 91 | maxwell3d.dirty.flags[VideoCommon::Dirty::IndexBuffer] = true; | 104 | maxwell3d.dirty.flags[VideoCommon::Dirty::IndexBuffer] = true; |
| @@ -93,7 +106,7 @@ void HLE_3F5E74B9C9A50164(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& | |||
| 93 | } | 106 | } |
| 94 | 107 | ||
| 95 | // Multi-layer Clear | 108 | // Multi-layer Clear |
| 96 | void HLE_EAD26C3E2109B06B(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { | 109 | void HLE_MultiLayerClear(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { |
| 97 | ASSERT(parameters.size() == 1); | 110 | ASSERT(parameters.size() == 1); |
| 98 | 111 | ||
| 99 | const Engines::Maxwell3D::Regs::ClearSurface clear_params{parameters[0]}; | 112 | const Engines::Maxwell3D::Regs::ClearSurface clear_params{parameters[0]}; |
| @@ -107,10 +120,10 @@ void HLE_EAD26C3E2109B06B(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& | |||
| 107 | 120 | ||
| 108 | constexpr std::array<std::pair<u64, HLEFunction>, 5> hle_funcs{{ | 121 | constexpr std::array<std::pair<u64, HLEFunction>, 5> hle_funcs{{ |
| 109 | {0x771BB18C62444DA0, &HLE_771BB18C62444DA0}, | 122 | {0x771BB18C62444DA0, &HLE_771BB18C62444DA0}, |
| 110 | {0x0D61FC9FAAC9FCAD, &HLE_0D61FC9FAAC9FCAD}, | 123 | {0x0D61FC9FAAC9FCAD, &HLE_DrawArraysIndirect}, |
| 111 | {0x0217920100488FF7, &HLE_0217920100488FF7}, | 124 | {0x0217920100488FF7, &HLE_DrawIndexedIndirect}, |
| 112 | {0x3F5E74B9C9A50164, &HLE_3F5E74B9C9A50164}, | 125 | {0x3F5E74B9C9A50164, &HLE_MultiDrawIndexedIndirect}, |
| 113 | {0xEAD26C3E2109B06B, &HLE_EAD26C3E2109B06B}, | 126 | {0xEAD26C3E2109B06B, &HLE_MultiLayerClear}, |
| 114 | }}; | 127 | }}; |
| 115 | 128 | ||
| 116 | class HLEMacroImpl final : public CachedMacro { | 129 | class HLEMacroImpl final : public CachedMacro { |