From c42aeacf2518b7001d9192b555247503fd314869 Mon Sep 17 00:00:00 2001 From: Gliniak Date: Thu, 25 Dec 2025 14:40:33 +0100 Subject: [PATCH] [Vulkan] Ensure entire scaled range fits within the buffer. Fixes devices lost errors when using resolution scaling Co-authored-by: Herman S. <429230+has207@users.noreply.github.com> --- src/xenia/gpu/vulkan/vulkan_texture_cache.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/xenia/gpu/vulkan/vulkan_texture_cache.cc b/src/xenia/gpu/vulkan/vulkan_texture_cache.cc index a6b561d9a..056ccd68c 100644 --- a/src/xenia/gpu/vulkan/vulkan_texture_cache.cc +++ b/src/xenia/gpu/vulkan/vulkan_texture_cache.cc @@ -2856,15 +2856,24 @@ bool VulkanTextureCache::MakeScaledResolveRangeCurrent( return false; } - uint32_t draw_resolution_scale_area = + const 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; + const uint64_t start_scaled = + uint64_t(start_unscaled) * draw_resolution_scale_area; - // Find which buffer contains this range + const uint64_t length_scaled_alignment_bits = + (UINT64_C(1) << length_scaled_alignment_log2) - 1; + const uint64_t length_scaled = + (uint64_t(length_unscaled) * draw_resolution_scale_area + + length_scaled_alignment_bits) & + ~length_scaled_alignment_bits; + const uint64_t end_scaled = start_scaled + length_scaled; + + // 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;