aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/macro.cpp
diff options
context:
space:
mode:
authorTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-28 23:07:49 -0400
committerTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-28 23:07:49 -0400
commit25b674eabdb92212a6d8149d6616b2af59317695 (patch)
treebf842baa3e7da325eb570fe9e75c4b67b8f33b35 /src/video_core/macro.cpp
parent571f9b58eb8a9c102a91a5d26cd32ebae4330232 (diff)
nx2: measure the TSC on AMD, no rethrows for rejected shaders, debug hooks off the hot path
- AMD CPUs have no CPUID leaf 0x15, so the TSC frequency stayed 0 and every guest CNTPCT read went through QueryPerformanceCounter (~10% of the game's main core in title 1). Measure it like Intel CPUs without a crystal frequency. - A rejected native shader was rethrown (two C++ throws) every time it was bound; return false instead (~1-2% of the GPU thread). - The semaphore watch, pushbuffer entry hashing, first-write trace and per-macro debug logs ran on every command word or macro call; they now cost a flag check unless their environment variable is set (~4% of the GPU thread). Also starts the macro engine's profile zone.
Diffstat (limited to 'src/video_core/macro.cpp')
-rw-r--r--src/video_core/macro.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp
index d3ba353ca0..c74cd6087a 100644
--- a/src/video_core/macro.cpp
+++ b/src/video_core/macro.cpp
@@ -36,6 +36,7 @@
#include "common/bit_field.h"
#include "common/logging.h"
#include "video_core/engines/maxwell_3d.h"
+#include "video_core/nx2_profile.h"
namespace Tegra {
@@ -1343,6 +1344,7 @@ 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) {
+ VideoCommon::Nx2Profile::Scope profile_scope{VideoCommon::Nx2Profile::Zone::Macro};
if (native_turing) {
maxwell3d.RefreshParameters();
const auto context = reinterpret_cast<std::uintptr_t>(this);
@@ -1352,8 +1354,11 @@ void MacroEngine::Execute(Core::System& system, Engines::Maxwell3D& maxwell3d, u
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, ","));
+ // EDEN_NX2_MME_LOG: log every macro call (runs ~750,000 times a second in title 1).
+ if (static const bool log_calls = std::getenv("EDEN_NX2_MME_LOG") != nullptr; log_calls) {
+ 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, ","));
+ }
// Reused between calls (a macro never calls another: methods >= 0xe00 are refused below).
auto& fifo = native_fifo;
fifo.assign(parameters.begin(), parameters.end());