From 7222930fcbb2340a15677bb9685e96a18941ee8a Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Sun, 14 Dec 2025 18:11:12 +0900 Subject: [PATCH] [Vulkan] Ensure entire scaled range fits within the buffer. Fixes devices lost errors when using resolution scaling --- src/xenia/gpu/vulkan/vulkan_texture_cache.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/xenia/gpu/vulkan/vulkan_texture_cache.cc b/src/xenia/gpu/vulkan/vulkan_texture_cache.cc index 240aadbc3..272ca17a2 100644 --- a/src/xenia/gpu/vulkan/vulkan_texture_cache.cc +++ b/src/xenia/gpu/vulkan/vulkan_texture_cache.cc @@ -2879,12 +2879,19 @@ bool VulkanTextureCache::MakeScaledResolveRangeCurrent( uint32_t draw_resolution_scale_area = draw_resolution_scale_x() * draw_resolution_scale_y(); uint64_t start_scaled = uint64_t(start_unscaled) * draw_resolution_scale_area; + uint64_t length_scaled_alignment_bits = + (UINT64_C(1) << length_scaled_alignment_log2) - 1; + uint64_t length_scaled = + (uint64_t(length_unscaled) * draw_resolution_scale_area + + length_scaled_alignment_bits) & + ~length_scaled_alignment_bits; + uint64_t end_scaled = start_scaled + length_scaled; - // Find which buffer contains this range + // Find which buffer contains this entire range (not just the start) for (size_t i = 0; i < scaled_resolve_buffers_.size(); ++i) { const ScaledResolveBuffer& buffer = scaled_resolve_buffers_[i]; if (start_scaled >= buffer.range_start_scaled && - start_scaled < + end_scaled <= (buffer.range_start_scaled + buffer.range_length_scaled)) { scaled_resolve_current_buffer_index_ = i; return true;