From 73ebf59af77a81edee6c276a8c0f7e533a5948b2 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Sun, 26 Oct 2025 02:14:45 +0200 Subject: [video_core] Improve texture rendering (#2830) This fixes some edge cases and improves texture rendering, bringing it closer to specifications. This fixes many assertions that occur in some games, such as EOW. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2830 Reviewed-by: Maufeat Co-authored-by: MaranBr Co-committed-by: MaranBr --- src/video_core/texture_cache/image_info.cpp | 130 ++++++++++++++++------------ 1 file changed, 73 insertions(+), 57 deletions(-) (limited to 'src/video_core/texture_cache/image_info.cpp') diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 5cf5ddeaf4..cdb3eee2be 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -54,65 +54,81 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept { 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; } switch (tex_type) { - case TextureType::Texture1D: - ASSERT(config.BaseLayer() == 0); - type = ImageType::e1D; - size.width = config.Width(); - resources.layers = 1; - break; - case TextureType::Texture1DArray: - type = ImageType::e1D; - size.width = config.Width(); - resources.layers = config.BaseLayer() + config.Depth(); - break; - case TextureType::Texture2D: - case TextureType::Texture2DNoMipmap: - 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; - break; - case TextureType::Texture2DArray: - type = ImageType::e2D; - rescaleable = true; - size.width = config.Width(); - size.height = config.Height(); - resources.layers = config.BaseLayer() + config.Depth(); - break; - case TextureType::TextureCubemap: - ASSERT(config.Depth() == 1); - type = ImageType::e2D; - size.width = config.Width(); - size.height = config.Height(); - resources.layers = config.BaseLayer() + 6; - break; - case TextureType::TextureCubeArray: - UNIMPLEMENTED_IF(config.load_store_hint != 0); - type = ImageType::e2D; - size.width = config.Width(); - size.height = config.Height(); - resources.layers = config.BaseLayer() + config.Depth() * 6; - break; - case TextureType::Texture3D: - ASSERT(config.BaseLayer() == 0); - type = ImageType::e3D; - size.width = config.Width(); - size.height = config.Height(); - size.depth = config.Depth(); - resources.layers = 1; - break; - case TextureType::Texture1DBuffer: - type = ImageType::Buffer; - size.width = config.Width(); - resources.layers = 1; - break; - default: - ASSERT_MSG(false, "Invalid texture_type={}", static_cast(tex_type)); - break; + case TextureType::Texture1D: + ASSERT(config.BaseLayer() == 0); + ASSERT(config.Depth() == 1); + type = ImageType::e1D; + size.width = config.Width(); + size.depth = 1; + resources.layers = 1; + break; + case TextureType::Texture1DArray: + ASSERT(config.Depth() > 0); + ASSERT(config.BaseLayer() < config.Depth()); + type = ImageType::e1D; + size.width = config.Width(); + size.depth = 1; + 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(); + size.depth = 1; + resources.layers = 1; + break; + case TextureType::Texture2DArray: + ASSERT(config.Depth() > 0); + ASSERT(config.BaseLayer() < config.Depth()); + type = ImageType::e2D; + rescaleable = true; + size.width = config.Width(); + size.height = config.Height(); + size.depth = 1; + resources.layers = config.Depth() - config.BaseLayer(); + break; + case TextureType::TextureCubemap: + ASSERT(config.Depth() == 1); + type = ImageType::e2D; + size.width = config.Width(); + size.height = config.Height(); + size.depth = 1; + 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(); + size.depth = 1; + resources.layers = (config.Depth() - config.BaseLayer()) * 6; + break; + case TextureType::Texture3D: + ASSERT(config.BaseLayer() == 0); + type = ImageType::e3D; + size.width = config.Width(); + size.height = config.Height(); + size.depth = config.Depth(); + resources.layers = 1; + break; + case TextureType::Texture1DBuffer: + type = ImageType::Buffer; + size.width = config.Width(); + size.depth = 1; + resources.layers = 1; + break; + default: + ASSERT_MSG(false, "Invalid texture_type={}", static_cast(tex_type)); + break; } if (num_samples > 1) { size.width *= NumSamplesX(config.msaa_mode); -- cgit v1.2.3