diff options
| author | MaranBr <maranbr@outlook.com> | 2025-10-26 02:14:45 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2025-10-26 02:14:45 +0200 |
| commit | 73ebf59af77a81edee6c276a8c0f7e533a5948b2 (patch) | |
| tree | 1237e67fd4b387efc46b03fc6459a1346a790246 /src/video_core/texture_cache/image_info.cpp | |
| parent | 53bfd56b70848f913e5082f3d0677437b06c21fd (diff) | |
[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 <sahyno1996@gmail.com>
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
Diffstat (limited to 'src/video_core/texture_cache/image_info.cpp')
| -rw-r--r-- | src/video_core/texture_cache/image_info.cpp | 130 |
1 files changed, 73 insertions, 57 deletions
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<int>(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<int>(tex_type)); + break; } if (num_samples > 1) { size.width *= NumSamplesX(config.msaa_mode); |
