diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 78b6684c49..6c733fe902 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -1426,7 +1426,6 @@ ImageId TextureCache

::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, DA if (solution) { gpu_addr = solution->gpu_addr; cpu_addr = solution->cpu_addr; - // TODO: properly update new_info.size.depth. new_info.resources = solution->resources; join_overlap_ids.push_back(overlap_id); join_copies_to_do.emplace_back(JoinCopy{false, overlap_id}); diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index f61a8558d9..e3faa5bf95 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp @@ -346,7 +346,7 @@ template if (!IsBlockLinearSizeCompatible(new_info, info, base.level, 0, strict_size)) { return std::nullopt; } - const u32 mip_depth = std::max(1U, new_info.size.depth << base.level); + const u32 mip_depth = AdjustMipSize(new_info.size.depth, base.level); if (mip_depth < info.size.depth + base.layer) { return std::nullopt; } @@ -431,8 +431,14 @@ template return std::nullopt; } const SubresourceExtent resources = new_info.resources; - s32 layers = 1; - if (info.type != ImageType::e3D) { + s32 layers; + if (info.type == ImageType::e3D) { + const u32 mip_depth = AdjustMipSize(info.size.depth, base->level); + if (mip_depth < new_info.size.depth + base->layer) { + return std::nullopt; + } + layers = 1; + } else { layers = std::max(resources.layers, info.resources.layers + base->layer); } return OverlapResult{ @@ -1219,10 +1225,10 @@ std::optional FindSubresource(const ImageInfo& candidate, const return std::nullopt; } if (existing.type == ImageType::e3D) { - // const u32 mip_depth = std::max(1U, existing.size.depth << base->level); - // if (mip_depth < candidate.size.depth + base->layer) { - // return std::nullopt; - // } + const u32 mip_depth = AdjustMipSize(existing.size.depth, base->level); + if (mip_depth < candidate.size.depth + base->layer) { + return std::nullopt; + } } else if (existing.resources.layers < candidate.resources.layers + base->layer) { return std::nullopt; } @@ -1250,7 +1256,7 @@ bool IsSubCopy(const ImageInfo& candidate, const ImageBase& image, GPUVAddr cand return false; } if (existing.type == ImageType::e3D) { - const u32 mip_depth = std::max(1U, existing.size.depth << base->level); + const u32 mip_depth = AdjustMipSize(existing.size.depth, base->level); if (mip_depth < candidate.size.depth + base->layer) { return false; }