aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/shader_cache.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/shader_cache.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/shader_cache.cpp')
-rw-r--r--src/video_core/shader_cache.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp
index da5417be02..73a2bf6646 100644
--- a/src/video_core/shader_cache.cpp
+++ b/src/video_core/shader_cache.cpp
@@ -79,6 +79,13 @@ bool ShaderCache::RefreshStages(std::array<u64, 6>& unique_hashes) try {
return false;
}
const ShaderInfo* shader_info{TryGet(*cpu_shader_addr)};
+ if (!shader_info && native && IsRejected(*cpu_shader_addr)) {
+ // A rejected program fails the same way every time it is bound: skip its draws
+ // without rethrowing (two C++ throws each time cost ~1-2% of the GPU thread).
+ maxwell3d->GetNativeMacroEngine().native_execution_failed = true;
+ last_shaders_valid = false;
+ return false;
+ }
if (!shader_info) {
const u32 start_address{native ? 0 : shader_config.offset};
try {
@@ -165,6 +172,11 @@ void ShaderCache::RethrowIfRejected(VAddr addr) {
}
}
+bool ShaderCache::IsRejected(VAddr addr) {
+ std::scoped_lock lock{rejected_mutex};
+ return rejected_native.contains(addr);
+}
+
void ShaderCache::RememberRejection(VAddr addr) {
std::scoped_lock lock{rejected_mutex};
rejected_native.emplace(addr, std::current_exception());