From 7c894b35b677d4b73334ecbcea60b0135c1d44d5 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Wed, 29 Oct 2025 09:33:14 -0400 Subject: [PATCH] Try another approach --- src/video_core/buffer_cache/buffer_cache.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 46574da798..8a84448d78 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1574,18 +1574,20 @@ void BufferCache

::MappedUploadMemory(Buffer& buffer, if constexpr (USE_MEMORY_MAPS) { auto upload_staging = runtime.UploadStagingBuffer(total_size_bytes); const std::span staging_pointer = upload_staging.mapped_span; + std::vector valid_copies; for (BufferCopy& copy : copies) { - u8* const src_pointer = staging_pointer.data() + copy.src_offset; const DAddr device_addr = buffer.CpuAddr() + copy.dst_offset; - if (device_memory.GetSpan(device_addr, copy.size) == nullptr) { - LOG_ERROR(HW_GPU, "Read out of bounds: dst_offset={}, size={}, device_addr={}", copy.dst_offset, copy.size, device_addr); - continue; - } + u8* const src_pointer = staging_pointer.data() + copy.src_offset; device_memory.ReadBlockUnsafe(device_addr, src_pointer, copy.size); - copy.src_offset += upload_staging.offset; + if (device_memory.GetSpan(device_addr, copy.size)) { + copy.src_offset += upload_staging.offset; + valid_copies.push_back(copy); + } + } + if (!valid_copies.empty()) { + const bool can_reorder = runtime.CanReorderUpload(buffer, valid_copies); + runtime.CopyBuffer(buffer, upload_staging.buffer, valid_copies, true, can_reorder); } - const bool can_reorder = runtime.CanReorderUpload(buffer, copies); - runtime.CopyBuffer(buffer, upload_staging.buffer, copies, true, can_reorder); } }