summaryrefslogtreecommitdiff
path: root/src/video_core/macro
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/macro')
-rw-r--r--src/video_core/macro/macro_hle.cpp45
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
14namespace Tegra { 15namespace 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
27void HLE_0D61FC9FAAC9FCAD(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { 28void 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
34void HLE_0217920100488FF7(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { 35void 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
55void HLE_3F5E74B9C9A50164(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { 64void 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
96void HLE_EAD26C3E2109B06B(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) { 109void 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
108constexpr std::array<std::pair<u64, HLEFunction>, 5> hle_funcs{{ 121constexpr 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
116class HLEMacroImpl final : public CachedMacro { 129class HLEMacroImpl final : public CachedMacro {