mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-06-30 09:25:23 +02:00
[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>
This commit is contained in:
parent
c993bc01a4
commit
629ebf1bde
3 changed files with 22 additions and 20 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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{};
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue