aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache/image_info.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/texture_cache/image_info.cpp')
-rw-r--r--src/video_core/texture_cache/image_info.cpp130
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);