aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/shader_cache.cpp
diff options
context:
space:
mode:
authorTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-29 00:45:20 -0400
committerTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-29 00:45:20 -0400
commitd56a30137df183de548ac49151ddeeecc1ab0f16 (patch)
treebf9179b177db21486138c333e4e500bebe391167 /src/video_core/shader_cache.cpp
parent322a5afce3d6c5fbcf16ed9a8914805087b33a55 (diff)
nx2: memo for compute macros; one lock per inline upload; cheaper shader invalidation
- Compute engine macros replay repeated calls like 3D ones (title 1's compute macro path fell from ~27% to ~14% of the GPU thread). - AccelerateInlineToMemory takes the buffer and texture cache mutexes together instead of one after the other. - ShaderCache::InvalidatePagesInRegion looks at the rejected programs only when the write can reach one (bounds kept as they are added); it ran a locked scan for every inline upload and pre-draw invalidation. Inline uploads went from ~10% to ~4% of the GPU thread.
Diffstat (limited to 'src/video_core/shader_cache.cpp')
-rw-r--r--src/video_core/shader_cache.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp
index 73a2bf6646..dfe80abac3 100644
--- a/src/video_core/shader_cache.cpp
+++ b/src/video_core/shader_cache.cpp
@@ -180,6 +180,10 @@ bool ShaderCache::IsRejected(VAddr addr) {
void ShaderCache::RememberRejection(VAddr addr) {
std::scoped_lock lock{rejected_mutex};
rejected_native.emplace(addr, std::current_exception());
+ rejected_lowest.store((std::min)(rejected_lowest.load(std::memory_order_relaxed), addr),
+ std::memory_order_relaxed);
+ rejected_highest.store((std::max)(rejected_highest.load(std::memory_order_relaxed), addr),
+ std::memory_order_relaxed);
}
void ShaderCache::GetGraphicsEnvironments(GraphicsEnvironments& result,
@@ -232,7 +236,10 @@ void ShaderCache::Register(std::unique_ptr<ShaderInfo> data, VAddr addr, size_t
void ShaderCache::InvalidatePagesInRegion(VAddr addr, size_t size) {
const VAddr addr_end = addr + size;
- {
+ // Rejected programs are few and in a few places: look at them only for writes that can
+ // reach them (this runs for every inline upload and pre-draw invalidation).
+ if (addr_end > rejected_lowest.load(std::memory_order_relaxed) &&
+ addr <= rejected_highest.load(std::memory_order_relaxed)) {
std::scoped_lock lock{rejected_mutex};
boost::unordered::erase_if(rejected_native, [&](const auto& rejected) {
return rejected.first >= addr && rejected.first < addr_end;