aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorMaranBr <maranbr@outlook.com>2025-10-28 04:25:23 +0100
committercrueter <crueter@eden-emu.dev>2025-10-28 04:25:23 +0100
commitb2ac18173fe18473b3386f0e4849caa33b27304f (patch)
treefabd05540f96b313a3240fcf308bde26bf48ed32 /src/video_core/texture_cache
parent39f226a853470df63a8bc56f052d3b738460f2d5 (diff)
[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 <crueter@eden-emu.dev> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
Diffstat (limited to 'src/video_core/texture_cache')
-rw-r--r--src/video_core/texture_cache/image_info.cpp20
-rw-r--r--src/video_core/texture_cache/image_view_info.cpp19
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<u32>(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;