From 133f4b918749afc0977d9430d03e0c50a7c76948 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 7 Sep 2025 22:27:40 -0500 Subject: [PATCH] Core: ClampRangeSize fixes (#3555) * Swap !IsFree() for IsMapped() IsFree only checks if the VMAType == Free. As is, that means ClampRangeSize will include memory that is Reserved or PoolReserved, and neither of those types are GPU mapped. This fixes this bug, may help with some non-GPU memory asserts. * Apply ClampRangeSize to vertex buffers Helps with some cases encountered by UE and Minecraft. --- src/core/memory.cpp | 2 +- src/video_core/buffer_cache/buffer_cache.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index a7af90e13..1a6f550e1 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -82,7 +82,7 @@ u64 MemoryManager::ClampRangeSize(VAddr virtual_addr, u64 size) { ++vma; // Keep adding to the size while there is contigious virtual address space. - while (!vma->second.IsFree() && clamped_size < size) { + while (vma->second.IsMapped() && clamped_size < size) { clamped_size += vma->second.size; ++vma; } diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index c1e203b30..41703dfe7 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -283,7 +283,8 @@ void BufferCache::BindVertexBuffers(const Vulkan::GraphicsPipeline& pipeline) { // Map buffers for merged ranges for (auto& range : ranges_merged) { - const auto [buffer, offset] = ObtainBuffer(range.base_address, range.GetSize(), false); + const u64 size = memory->ClampRangeSize(range.base_address, range.GetSize()); + const auto [buffer, offset] = ObtainBuffer(range.base_address, size, false); range.vk_buffer = buffer->buffer; range.offset = offset; }