diff --git a/src/video_core/rasterizer_cache/texture_codec.h b/src/video_core/rasterizer_cache/texture_codec.h index 6eb64d486..da42ac0d6 100644 --- a/src/video_core/rasterizer_cache/texture_codec.h +++ b/src/video_core/rasterizer_cache/texture_codec.h @@ -308,13 +308,16 @@ static constexpr void MortonCopy(u32 width, u32 height, u32 start_offset, u32 en LinearNextTile(); } - const u32 buffer_end = tiled_offset + aligned_end_offset - aligned_start_offset; - while (tiled_offset < buffer_end) { - auto linear_data = linear_buffer.subspan(linear_offset, linear_tile_stride); - auto tiled_data = tiled_buffer.subspan(tiled_offset, tile_size); - MortonCopyTile(width, tiled_data, linear_data); - tiled_offset += tile_size; - LinearNextTile(); + // If the copy spans multiple tiles, copy the fully aligned tiles in between. + if (aligned_start_offset < aligned_end_offset) { + const u32 buffer_end = tiled_offset + aligned_end_offset - aligned_start_offset; + while (tiled_offset < buffer_end) { + auto linear_data = linear_buffer.subspan(linear_offset, linear_tile_stride); + auto tiled_data = tiled_buffer.subspan(tiled_offset, tile_size); + MortonCopyTile(width, tiled_data, linear_data); + tiled_offset += tile_size; + LinearNextTile(); + } } // If during a texture download the end coordinate is not tile aligned, swizzle