From 170c10777957681a1bd62c16860b727a6df611fd Mon Sep 17 00:00:00 2001 From: nmzik Date: Sat, 24 Oct 2026 04:03:01 +0200 Subject: [PATCH] texture_cache: dedupe region queries with a picked flag --- .../host_gpu/renderer/cache/textureCache.cpp | 22 ++++++------------- .../host_gpu/renderer/cache/textureCache.h | 1 - src/graphics/host_gpu/renderer/image/image.h | 2 +- tests/ShaderRecompilerComputeTests.cpp | 17 -------------- 4 files changed, 8 insertions(+), 34 deletions(-) diff --git a/src/graphics/host_gpu/renderer/cache/textureCache.cpp b/src/graphics/host_gpu/renderer/cache/textureCache.cpp index 80b42d15c..c33179dd6 100644 --- a/src/graphics/host_gpu/renderer/cache/textureCache.cpp +++ b/src/graphics/host_gpu/renderer/cache/textureCache.cpp @@ -429,12 +429,6 @@ TextureCache::ImageIds TextureCache::FindImagesInRegion(uint64_t address, uint64 return {}; } - uint32_t query_epoch = ++m_image_query_epoch; - if (query_epoch == 0) { - m_slot_images.ForEach([](ImageId, const Image& image) { image.query_epoch = 0; }); - query_epoch = ++m_image_query_epoch; - } - ImageIds result; ForEachPage(address, size, [&](uint64_t page) { const auto* owners = m_image_page_table.Find(page); @@ -442,19 +436,17 @@ TextureCache::ImageIds TextureCache::FindImagesInRegion(uint64_t address, uint64 return; } owners->ForEach([&](ImageId id) { - auto* image = m_slot_images.try_get(id); - if (image == nullptr) { + const auto& image = m_slot_images[id]; + if (image.picked || !image.Overlaps(address, size, page_overlap)) { return; } - if (image->query_epoch == query_epoch) { - return; - } - image->query_epoch = query_epoch; - if (image->Overlaps(address, size, page_overlap)) { - result.push_back(id); - } + image.picked = true; + result.push_back(id); }); }); + for (const auto id: result) { + m_slot_images[id].picked = false; + } return result; } diff --git a/src/graphics/host_gpu/renderer/cache/textureCache.h b/src/graphics/host_gpu/renderer/cache/textureCache.h index 9050421e2..0b5fe8538 100644 --- a/src/graphics/host_gpu/renderer/cache/textureCache.h +++ b/src/graphics/host_gpu/renderer/cache/textureCache.h @@ -184,7 +184,6 @@ private: uint64_t m_pressure_gc_memory = 1536ull * 1024 * 1024; uint64_t m_critical_gc_memory = 3ull * 1024 * 1024 * 1024; uint64_t m_gc_tick = 0; - mutable uint32_t m_image_query_epoch = 0; bool m_readback_linear_images = false; bool m_readback_tiled_images = false; diff --git a/src/graphics/host_gpu/renderer/image/image.h b/src/graphics/host_gpu/renderer/image/image.h index 072255e0a..df27da3be 100644 --- a/src/graphics/host_gpu/renderer/image/image.h +++ b/src/graphics/host_gpu/renderer/image/image.h @@ -149,7 +149,7 @@ public: ImageUsage usage; ImageBinding binding; bool registered = false; - mutable uint32_t query_epoch = 0; + mutable bool picked = false; // Set only while FindImagesInRegion collects it. uint64_t track_addr = 0; uint64_t track_addr_end = 0; ImageId depth_id {}; diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index c821194af..8f2273ace 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -331,16 +331,6 @@ struct TextureCacheTestAccess { return count; } - static void SetQueryEpoch(TextureCache &cache, uint32_t epoch) { - std::lock_guard lock(cache.m_lock); - cache.m_image_query_epoch = epoch; - } - - static uint32_t QueryEpoch(TextureCache &cache) { - std::lock_guard lock(cache.m_lock); - return cache.m_image_query_epoch; - } - static ImageId InsertImage(TextureCache &cache, const ImageInfo &info) { std::lock_guard lock(cache.m_lock); return cache.InsertImage(info); @@ -6063,13 +6053,6 @@ public: large_owner) == 0, "large image unregister left coarse memberships behind"); - TextureCacheTestAccess::SetQueryEpoch(texture_cache, UINT32_MAX); - const auto wrap_results = TextureCacheTestAccess::FindImages( - texture_cache, base, sizeof(initial), false); - Require(name, "page-owner query epoch wrap", - IsOnlyImage(wrap_results, first) && - TextureCacheTestAccess::QueryEpoch(texture_cache) == 1, - "query deduplication failed while wrapping its epoch"); auto &image = texture_cache.GetImage(first); constexpr uint32_t final_sampled_value = 0x88776655u;