diff options
| author | simply0001 <nicolas.tobago@icloud.com> | 2026-06-26 04:15:31 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-06-26 04:15:31 +0200 |
| commit | 629ebf1bdee023d3d3ecc96c3276cf3285f8f727 (patch) | |
| tree | de95d7adc46ff0ee49def3e632653f755a254eb6 | |
| parent | c993bc01a49c39c3d293ce401db86b3dccba69c1 (diff) | |
[video_core/maxwell3d] compute macro param address on demand (#4067)
GetMacroAddress only reads a couple of indices per macro, but ProcessMacro was
then building a full std::vector GPUVAddr> with one push_back per parameter word
every submission. macro_segments already holds base, count per chunk, so
GetMacroAddress can just walk it instead, drops the per-word loop, a
.clear(), and a vector member.
Also makes it so it returns on the first match in the macro dispatch instead of running every
std::get_if check.
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4067
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 10 | ||||
| -rw-r--r-- | src/video_core/macro.cpp | 28 |
3 files changed, 22 insertions, 20 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 3474ad6d63..53b75726bd 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -208,9 +208,6 @@ void Maxwell3D::ProcessMacro(Core::System& system, u32 method, const u32* base_s } macro_params.insert(macro_params.end(), base_start, base_start + amount); - for (size_t i = 0; i < amount; i++) { - macro_addresses.push_back(current_dma_segment + i * sizeof(u32)); - } macro_segments.emplace_back(current_dma_segment, amount); current_macro_dirty |= current_dirty; current_dirty = false; @@ -220,7 +217,6 @@ void Maxwell3D::ProcessMacro(Core::System& system, u32 method, const u32* base_s ConsumeSink(system); CallMacroMethod(system, executing_macro, macro_params); macro_params.clear(); - macro_addresses.clear(); macro_segments.clear(); current_macro_dirty = false; } diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 823be0f63e..bbde8b9986 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -3158,7 +3158,14 @@ public: DrawManager draw_manager; GPUVAddr GetMacroAddress(size_t index) const { - return macro_addresses[index]; + size_t base = 0; + for (const auto& [addr, count] : macro_segments) { + if (index < base + count) { + return addr + (index - base) * sizeof(u32); + } + base += count; + } + return 0; } void RefreshParameters() { @@ -3261,7 +3268,6 @@ private: bool execute_on{true}; std::vector<std::pair<GPUVAddr, size_t>> macro_segments; - std::vector<GPUVAddr> macro_addresses; bool current_macro_dirty{}; }; diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp index 2833f95ee9..0d026a1ce5 100644 --- a/src/video_core/macro.cpp +++ b/src/video_core/macro.cpp @@ -1356,33 +1356,33 @@ static void Dump(u64 hash, std::span<const u32> code, bool decompiled = false) { void MacroEngine::Execute(Core::System& system, Engines::Maxwell3D& maxwell3d, u32 method, std::span<const u32> parameters) { auto const execute_variant = [&system, &maxwell3d, ¶meters, method](AnyCachedMacro& acm) { if (auto a = std::get_if<HLE_DrawArraysIndirect>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_DrawIndexedIndirect>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_MultiDrawIndexedIndirectCount>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_MultiLayerClear>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_C713C83D8F63CCF3>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_D7333D26E0A93EDE>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_BindShader>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_SetRasterBoundingBox>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_ClearConstBuffer>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_ClearMemory>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_TransformFeedbackSetup>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<HLE_DrawIndirectByteCount>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<MacroInterpreterImpl>(&acm)) - a->Execute(system, maxwell3d, parameters, method); + return a->Execute(system, maxwell3d, parameters, method); if (auto a = std::get_if<std::unique_ptr<DynamicCachedMacro>>(&acm)) - a->get()->Execute(system, maxwell3d, parameters, method); + return a->get()->Execute(system, maxwell3d, parameters, method); }; if (auto const it = macro_cache.find(method); it != macro_cache.end()) { auto& ci = it->second; |
