From b2ac18173fe18473b3386f0e4849caa33b27304f Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 28 Oct 2025 04:25:23 +0100 Subject: [PATCH] [video_core] Fix more edge cases in image_view and image_view_info (#2853) This fixes more edge cases where incorrect textures were used in image_view and image_view_info. Complement to PR 2830. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2853 Reviewed-by: crueter Co-authored-by: MaranBr Co-committed-by: MaranBr --- src/video_core/texture_cache/image_info.cpp | 20 ++++++++++++++----- .../texture_cache/image_view_info.cpp | 19 +++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index cdb3eee2be..677e22b8a7 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -52,10 +52,20 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept { ASSERT(!config.IsPitchLinear()); } TextureType tex_type = config.texture_type; - if (tex_type == TextureType::Texture1D && (config.Depth() > 1 || config.BaseLayer() != 0)) { - tex_type = TextureType::Texture1DArray; - } else if (tex_type == TextureType::Texture2D && (config.Depth() > 1 || config.BaseLayer() != 0)) { - tex_type = TextureType::Texture2DArray; + if ((config.Depth() > 1 || config.BaseLayer() != 0) && config.BaseLayer() < config.Depth()) { + switch (tex_type) { + case TextureType::Texture1D: + tex_type = TextureType::Texture1DArray; + break; + case TextureType::Texture2D: + tex_type = TextureType::Texture2DArray; + break; + case TextureType::TextureCubemap: + tex_type = TextureType::TextureCubeArray; + break; + default: + break; + } } switch (tex_type) { case TextureType::Texture1D: @@ -76,7 +86,6 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept { break; case TextureType::Texture2D: case TextureType::Texture2DNoMipmap: - ASSERT(config.BaseLayer() == 0); ASSERT(config.Depth() == 1); type = config.IsPitchLinear() ? ImageType::Linear : ImageType::e2D; rescaleable = !config.IsPitchLinear(); @@ -106,6 +115,7 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept { case TextureType::TextureCubeArray: UNIMPLEMENTED_IF(config.load_store_hint != 0); ASSERT(config.Depth() > 0); + ASSERT(config.BaseLayer() < config.Depth()); type = ImageType::e2D; size.width = config.Width(); size.height = config.Height(); diff --git a/src/video_core/texture_cache/image_view_info.cpp b/src/video_core/texture_cache/image_view_info.cpp index dc05eebb57..d9057604ae 100644 --- a/src/video_core/texture_cache/image_view_info.cpp +++ b/src/video_core/texture_cache/image_view_info.cpp @@ -41,10 +41,20 @@ ImageViewInfo::ImageViewInfo(const TICEntry& config, s32 base_layer) noexcept }; range.extent.levels = config.res_max_mip_level - config.res_min_mip_level + 1; TextureType tex_type = config.texture_type; - if (tex_type == TextureType::Texture1D && (config.Depth() > 1 || base_layer != 0)) { - tex_type = TextureType::Texture1DArray; - } else if (tex_type == TextureType::Texture2D && (config.Depth() > 1 || base_layer != 0)) { - tex_type = TextureType::Texture2DArray; + if ((config.Depth() > 1 || base_layer != 0) && static_cast(base_layer) < config.Depth()) { + switch (tex_type) { + case TextureType::Texture1D: + tex_type = TextureType::Texture1DArray; + break; + case TextureType::Texture2D: + tex_type = TextureType::Texture2DArray; + break; + case TextureType::TextureCubemap: + tex_type = TextureType::TextureCubeArray; + break; + default: + break; + } } switch (tex_type) { case TextureType::Texture1D: @@ -63,7 +73,6 @@ ImageViewInfo::ImageViewInfo(const TICEntry& config, s32 base_layer) noexcept case TextureType::Texture2D: case TextureType::Texture2DNoMipmap: ASSERT(config.Depth() == 1); - ASSERT(base_layer == 0); type = config.normalized_coords ? ImageViewType::e2D : ImageViewType::Rect; range.extent.layers = 1; break;