diff --git a/src/graphics/host_gpu/renderer/cache/textureCache.cpp b/src/graphics/host_gpu/renderer/cache/textureCache.cpp index 97f2932a1..ca121548f 100644 --- a/src/graphics/host_gpu/renderer/cache/textureCache.cpp +++ b/src/graphics/host_gpu/renderer/cache/textureCache.cpp @@ -1209,7 +1209,7 @@ ImageId TextureCache::FindImageFromRange(uint64_t address, uint64_t size, bool e if (ensure_valid && owner->depth_id) { owner = m_slot_images.try_get(owner->depth_id); } - if (owner == nullptr || (ensure_valid && !owner->SafeToDownload())) { + if (owner == nullptr || (ensure_valid && !SafeToDownload(*owner))) { continue; } matches.push_back(id); @@ -1580,7 +1580,7 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, uint64_t vaddr, uin if (owner->depth_id) { owner = m_texture_cache.m_slot_images.try_get(owner->depth_id); } - if (owner != nullptr && owner->SafeToDownload()) { + if (owner != nullptr && m_texture_cache.SafeToDownload(*owner)) { matches.push_back(id); } } diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index 7e87c6986..7787a24fb 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -5673,6 +5673,25 @@ public: texture_cache.GetImage(exact_image).IsGpuModified(), "image ownership discarded or conflicted with disjoint dirty " "Buffer bytes on the same tracker page"); + auto exact_buffer = resources.GetBufferCache().ObtainBuffer( + base + exact_image_offset, sizeof(uint32_t), true); + Require(name, "overlapping buffer ownership allocation", + exact_buffer.first != nullptr, + "failed to create the overlapping dirty Buffer owner"); + exact_buffer.first->Fill(exact_buffer.second, sizeof(uint32_t), + dirty_sibling_value); + Libs::Graphics::Buffer exact_download( + m_runtime_context, scheduler, MemoryUsage::DeviceLocal, + base + exact_image_offset, AllFlags, sizeof(uint32_t)); + Require(name, "overlapping buffer ownership rejection", + !texture_cache.FindImageFromRange(base + exact_image_offset, + sizeof(uint32_t)) && + !BufferCacheTestAccess::SynchronizeBufferFromImage( + resources.GetBufferCache(), exact_download, + base + exact_image_offset, sizeof(uint32_t)), + "dirty Buffer bytes did not block the stale image source"); + resources.GetBufferCache().ReadMemory(base + exact_image_offset, + sizeof(uint32_t)); resources.GetBufferCache().ReadMemory(base + dirty_sibling_offset, sizeof(dirty_sibling_value));