diff options
| author | 2021-12-31 18:21:57 -0500 | |
|---|---|---|
| committer | 2021-12-31 20:03:22 -0500 | |
| commit | 951c61aeaaee4dfc343f147a7635ce51e935d167 (patch) | |
| tree | f59083973a5ba3b3f5630770136448f6826ed7f7 /src | |
| parent | Merge pull request #7647 from german77/toad (diff) | |
| download | yuzu-951c61aeaaee4dfc343f147a7635ce51e935d167.tar.gz yuzu-951c61aeaaee4dfc343f147a7635ce51e935d167.tar.xz yuzu-951c61aeaaee4dfc343f147a7635ce51e935d167.zip | |
texture_cache/util: Fix s32 overflow when resolving overlaps
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/texture_cache/util.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index 7bd31b211..d8e19cb2f 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp | |||
| @@ -364,14 +364,14 @@ template <u32 GOB_EXTENT> | |||
| 364 | 364 | ||
| 365 | [[nodiscard]] std::optional<SubresourceExtent> ResolveOverlapRightAddress2D( | 365 | [[nodiscard]] std::optional<SubresourceExtent> ResolveOverlapRightAddress2D( |
| 366 | const ImageInfo& new_info, GPUVAddr gpu_addr, const ImageBase& overlap, bool strict_size) { | 366 | const ImageInfo& new_info, GPUVAddr gpu_addr, const ImageBase& overlap, bool strict_size) { |
| 367 | const u32 layer_stride = new_info.layer_stride; | 367 | const u64 layer_stride = new_info.layer_stride; |
| 368 | const s32 new_size = layer_stride * new_info.resources.layers; | 368 | const u64 new_size = layer_stride * new_info.resources.layers; |
| 369 | const s32 diff = static_cast<s32>(overlap.gpu_addr - gpu_addr); | 369 | const u64 diff = overlap.gpu_addr - gpu_addr; |
| 370 | if (diff > new_size) { | 370 | if (diff > new_size) { |
| 371 | return std::nullopt; | 371 | return std::nullopt; |
| 372 | } | 372 | } |
| 373 | const s32 base_layer = diff / layer_stride; | 373 | const s32 base_layer = static_cast<s32>(diff / layer_stride); |
| 374 | const s32 mip_offset = diff % layer_stride; | 374 | const s32 mip_offset = static_cast<s32>(diff % layer_stride); |
| 375 | const std::array offsets = CalculateMipLevelOffsets(new_info); | 375 | const std::array offsets = CalculateMipLevelOffsets(new_info); |
| 376 | const auto end = offsets.begin() + new_info.resources.levels; | 376 | const auto end = offsets.begin() + new_info.resources.levels; |
| 377 | const auto it = std::find(offsets.begin(), end, static_cast<u32>(mip_offset)); | 377 | const auto it = std::find(offsets.begin(), end, static_cast<u32>(mip_offset)); |