aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache/descriptor_table.h
diff options
context:
space:
mode:
authorcirakg <cirakg@cirakg.xyz>2026-11-03 21:58:24 +0100
committercirakg <cirakg@cirakg.xyz>2026-11-03 21:58:24 +0100
commitcdfb1ae93444c0aa02dfe592af36d70ab36549fd (patch)
tree2fa8d7062d907d5ab8d85d64c66be87ea4cdf0d1 /src/video_core/texture_cache/descriptor_table.h
parent51341ec09b25de1d9b01d0c00ee828dd5b861d5c (diff)
parent4383b9787afbf6c63291bf803c8330afb4f21a16 (diff)
Merge upstream Djihads80/Eglantine nx2 into nx2HEADnx2
# Conflicts: # .github/workflows/release-binaries.yml
Diffstat (limited to 'src/video_core/texture_cache/descriptor_table.h')
-rw-r--r--src/video_core/texture_cache/descriptor_table.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/video_core/texture_cache/descriptor_table.h b/src/video_core/texture_cache/descriptor_table.h
index a441e572de..2c768b72fc 100644
--- a/src/video_core/texture_cache/descriptor_table.h
+++ b/src/video_core/texture_cache/descriptor_table.h
@@ -7,12 +7,14 @@
#pragma once
#include <algorithm>
+#include <cstring>
#include <vector>
#include "common/alignment.h"
#include "common/common_types.h"
#include "common/div_ceil.h"
#include "common/assert.h"
+#include "core/memory.h"
#include "video_core/memory_manager.h"
#include "video_core/rasterizer_interface.h"
@@ -44,7 +46,15 @@ public:
}
const GPUVAddr gpu_addr = current_gpu_addr + index * sizeof(T);
std::pair<T, bool> result;
- gpu_memory.ReadBlockUnsafe(gpu_addr, std::addressof(result.first), sizeof(T));
+ // This runs for every texture and sampler of every draw. An entry within one page is
+ // contiguous in host memory, so a single page lookup replaces the generic block read.
+ const bool one_page =
+ (gpu_addr & Core::Memory::YUZU_PAGEMASK) + sizeof(T) <= Core::Memory::YUZU_PAGESIZE;
+ if (const u8* const host = one_page ? gpu_memory.GetPointer(gpu_addr) : nullptr) {
+ std::memcpy(std::addressof(result.first), host, sizeof(T));
+ } else {
+ gpu_memory.ReadBlockUnsafe(gpu_addr, std::addressof(result.first), sizeof(T));
+ }
if ((read_descriptors[index / 64] & (1ULL << (index % 64))) != 0) {
result.second = result.first != descriptors[index];
} else {