aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/shader_cache.cpp
diff options
context:
space:
mode:
authorTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-28 01:18:23 -0400
committerTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-28 01:18:23 -0400
commit869c6e4b33a6432166597f6f48812d44b3f5de02 (patch)
treedcd740bff7b3692c80f895fb988a3e1fd0f274fd /src/video_core/shader_cache.cpp
parente6e0304303ba5280c318e6f66e9d5ea30d375060 (diff)
nx2: lower every shader title 4 uses in game
- Tensor-core ops for its neural compute pass: HMMA.16816.F16 (SHFL + HFMA2), MOVM.16.MT88 and LDSM .MT88. Opt-in via EDEN_NX2_TENSOR: the expansion (372 HMMAs) takes the host driver minutes to compile. - HSETP2 with an immediate half pair; skip @!PT instructions. - Constant bank 24, read only by three NVN2 fullscreen vertex shaders and never bound by the game, reads from bank 17 (also never bound: zeros, as on hw). - Debug dumps of the vertex stage's bound constant buffers on rejection. All 214 shaders captured after the menu lower (213 without EDEN_NX2_TENSOR).
Diffstat (limited to 'src/video_core/shader_cache.cpp')
-rw-r--r--src/video_core/shader_cache.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp
index 75e5432ab2..1f826313a1 100644
--- a/src/video_core/shader_cache.cpp
+++ b/src/video_core/shader_cache.cpp
@@ -5,6 +5,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <algorithm>
+#include <fmt/ranges.h>
#include <array>
#include <vector>
#include <boost/container/small_vector.hpp>
@@ -91,6 +92,22 @@ bool ShaderCache::RefreshStages(std::array<u64, 6>& unique_hashes) try {
native.native_execution_failed = true;
last_shaders_valid = false;
LOG_ERROR(HW_GPU, "Native graphics shader rejected: {}", error.what());
+ // Once: show what the vertex stage has bound, to find where an unbound bank's data lives.
+ static std::vector<std::string> dumped_errors;
+ if (const std::string what{error.what()};
+ what.find("constant buffer") != std::string::npos && dumped_errors.size() < 12 &&
+ std::count(dumped_errors.begin(), dumped_errors.end(), what) < 3) {
+ dumped_errors.push_back(what);
+ LOG_INFO(HW_GPU, "VS cbuf dump for: {}", what.substr(0, 40));
+ for (u32 slot = 3; slot < 8; ++slot) {
+ const auto& buffer = maxwell3d->state.shader_stages[0].const_buffers[slot];
+ if (!buffer.enabled) continue;
+ std::array<u32, 24> words{};
+ gpu_memory->ReadBlockUnsafe(buffer.address, words.data(), sizeof(words));
+ LOG_INFO(HW_GPU, "VS cbuf {} at {:#x} size {:#x}: {:08x}", slot, buffer.address, buffer.size,
+ fmt::join(words, " "));
+ }
+ }
return false;
}