aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/macro.cpp
diff options
context:
space:
mode:
authorDjihads <76681596+Djihads80@users.noreply.github.com>2026-10-29 02:25:36 +0100
committerGitHub <noreply@github.com>2026-10-29 02:25:36 +0100
commit0bb5055b6541c74f47603a8dff0569a509cbaf18 (patch)
treeda827ff9c4f2f9a5309ee2804ee689f608c0ac2f /src/video_core/macro.cpp
parent1af7fe72927af9fc64aa4af117bc9b30043c4dc7 (diff)
parent535b6769709eb22333af26269f1b16f37adce4db (diff)
Merge pull request #1 from Djihads80/yumekiru/ns2-progress-v2
Experimental NS2 support and accumulated GPU fixes
Diffstat (limited to 'src/video_core/macro.cpp')
-rw-r--r--src/video_core/macro.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp
index 86f528af15..4364204740 100644
--- a/src/video_core/macro.cpp
+++ b/src/video_core/macro.cpp
@@ -4,6 +4,8 @@
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include <cstdlib>
+#include <unordered_set>
#include <cstring>
#include <fstream>
#include <optional>
@@ -1339,6 +1341,42 @@ 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) {
+ if (native_turing) {
+ maxwell3d.RefreshParameters();
+ const auto context = reinterpret_cast<std::uintptr_t>(this);
+ static std::unordered_set<std::uintptr_t> captured_contexts;
+ if (std::getenv("EDEN_NATIVE_FRAME_CAPTURE") && captured_contexts.insert(context).second) {
+ std::ofstream dump("native-graphics-mme-" + std::to_string(context) + ".bin", std::ios::binary);
+ dump.write(reinterpret_cast<const char*>(native_code.data()), sizeof(native_code));
+ }
+ LOG_DEBUG(HW_GPU, "Native MME context={:#x}", context);
+ LOG_DEBUG(HW_GPU, "Native MME start={:#x}, parameters={}, data={:08x}", method, parameters.size(), fmt::join(parameters, ","));
+ u32 dma_count{};
+ const auto result = native_interpreter.Execute(native_code, method, parameters,
+ [&](u32 address) { return address < Maxwell3D::Regs::NUM_REGS ? maxwell3d.GetRegisterValue(address) : 0U; },
+ [&](u32 address, u32 value) {
+ if (address >= 0xe00) return false;
+ if (address == 0x158) dma_count = value; // MME_DMA_READ_FIFOED
+ maxwell3d.CallMethod(system, address, value, true);
+ return true;
+ }, [&]() -> std::optional<std::vector<u32>> {
+ if (dma_count > 0x10000) return std::nullopt;
+ std::vector<u32> data(dma_count);
+ const GPUVAddr address = (u64{maxwell3d.GetRegisterValue(0x154) & 0xff} << 32) |
+ maxwell3d.GetRegisterValue(0x155);
+ if (dma_count && !maxwell3d.ReadMacroMemory(address, data)) return std::nullopt;
+ dma_count = 0;
+ return data;
+ });
+ if (!result.success) {
+ native_execution_failed = true;
+ std::ofstream dump("native-mme-" + std::to_string(method) + ".bin", std::ios::binary);
+ dump.write(reinterpret_cast<const char*>(native_code.data()), sizeof(native_code));
+ LOG_ERROR(HW_GPU, "Native MME failed: start={:#x}, pc={:#x}, consumed={}/{}, error={}",
+ method, result.pc, result.consumed, parameters.size(), result.error);
+ }
+ return;
+ }
const auto execute_variant = [&system, &maxwell3d, &parameters,
method](AnyCachedMacro& cached) {
if (std::holds_alternative<MacroInterpreterImpl>(cached) ||