From e90c23a5c5ca20256ae2475ec6dd3c96efe9926c Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 24 Oct 2025 11:02:49 -0400 Subject: [PATCH] Another try --- src/video_core/texture_cache/image_info.cpp | 30 +++++++++--------- .../texture_cache/image_view_info.cpp | 31 +++++++++++-------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index a5ddda9fa4..a240d65c6e 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -52,58 +52,58 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept { ASSERT(!config.IsPitchLinear()); } TextureType tex_type = config.texture_type; - if (tex_type == TextureType::Texture1D) { - if (config.Depth() > 1 || config.BaseLayer() != 0) { - tex_type = TextureType::Texture1DArray; - } - } else if (tex_type == TextureType::Texture2D) { - if (config.Depth() > 1) { - tex_type = TextureType::Texture3D; - } else if (config.BaseLayer() != 0) { - tex_type = TextureType::Texture2DArray; - } + 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; } switch (tex_type) { case TextureType::Texture1D: ASSERT(config.BaseLayer() == 0); + ASSERT(config.Depth() == 1); type = ImageType::e1D; size.width = config.Width(); resources.layers = 1; break; case TextureType::Texture1DArray: + ASSERT(config.Depth() > 1); type = ImageType::e1D; size.width = config.Width(); - resources.layers = config.BaseLayer() + config.Depth(); + resources.layers = config.Depth() - config.BaseLayer(); 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(); size.width = config.Width(); size.height = config.Height(); - resources.layers = config.BaseLayer() + 1; + resources.layers = 1; break; case TextureType::Texture2DArray: + ASSERT(config.Depth() > 1 || config.BaseLayer() != 0); type = ImageType::e2D; rescaleable = true; size.width = config.Width(); size.height = config.Height(); - resources.layers = config.BaseLayer() + config.Depth(); + resources.layers = config.Depth() - config.BaseLayer(); break; case TextureType::TextureCubemap: ASSERT(config.Depth() == 1); + ASSERT(config.BaseLayer() == 0); type = ImageType::e2D; size.width = config.Width(); size.height = config.Height(); - resources.layers = config.BaseLayer() + 6; + resources.layers = 6; break; case TextureType::TextureCubeArray: UNIMPLEMENTED_IF(config.load_store_hint != 0); + ASSERT(config.Depth() > 0); type = ImageType::e2D; size.width = config.Width(); size.height = config.Height(); - resources.layers = config.BaseLayer() + config.Depth() * 6; + resources.layers = (config.Depth() - config.BaseLayer()) * 6; break; case TextureType::Texture3D: ASSERT(config.BaseLayer() == 0); diff --git a/src/video_core/texture_cache/image_view_info.cpp b/src/video_core/texture_cache/image_view_info.cpp index c659e5fb04..2cca3c08ee 100644 --- a/src/video_core/texture_cache/image_view_info.cpp +++ b/src/video_core/texture_cache/image_view_info.cpp @@ -41,51 +41,56 @@ 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) { - if (config.Depth() > 1 || base_layer != 0) { - tex_type = TextureType::Texture1DArray; - } - } else if (tex_type == TextureType::Texture2D) { - if (config.Depth() > 1) { - tex_type = TextureType::Texture3D; - } else if (base_layer != 0) { - tex_type = TextureType::Texture2DArray; - } + 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; } switch (tex_type) { case TextureType::Texture1D: ASSERT(config.Height() == 1); ASSERT(config.Depth() == 1); + ASSERT(base_layer == 0); type = ImageViewType::e1D; + range.extent.layers = 1; break; case TextureType::Texture1DArray: ASSERT(config.Height() == 1); + ASSERT(config.Depth() > 1 || base_layer != 0); type = ImageViewType::e1DArray; - range.extent.layers = config.Depth(); + range.extent.layers = config.Depth() - base_layer; break; 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; case TextureType::Texture2DArray: + ASSERT(config.Depth() > 1 || base_layer != 0); type = ImageViewType::e2DArray; - range.extent.layers = config.Depth(); + range.extent.layers = config.Depth() - base_layer; break; case TextureType::Texture3D: + ASSERT(base_layer == 0); type = ImageViewType::e3D; + range.extent.layers = 1; break; case TextureType::TextureCubemap: ASSERT(config.Depth() == 1); + ASSERT(base_layer == 0); type = ImageViewType::Cube; range.extent.layers = 6; break; case TextureType::TextureCubeArray: + ASSERT(config.Depth() > 0); type = ImageViewType::CubeArray; - range.extent.layers = config.Depth() * 6; + range.extent.layers = (config.Depth() - base_layer) * 6; break; case TextureType::Texture1DBuffer: type = ImageViewType::Buffer; + range.extent.layers = 1; break; default: ASSERT_MSG(false, "Invalid texture_type={}", static_cast(tex_type));