Browse Source

Another try

pull/2830/head
MaranBr 5 months ago
committed by crueter
parent
commit
e90c23a5c5
  1. 30
      src/video_core/texture_cache/image_info.cpp
  2. 31
      src/video_core/texture_cache/image_view_info.cpp

30
src/video_core/texture_cache/image_info.cpp

@ -52,58 +52,58 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept {
ASSERT(!config.IsPitchLinear()); ASSERT(!config.IsPitchLinear());
} }
TextureType tex_type = config.texture_type; 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) { switch (tex_type) {
case TextureType::Texture1D: case TextureType::Texture1D:
ASSERT(config.BaseLayer() == 0); ASSERT(config.BaseLayer() == 0);
ASSERT(config.Depth() == 1);
type = ImageType::e1D; type = ImageType::e1D;
size.width = config.Width(); size.width = config.Width();
resources.layers = 1; resources.layers = 1;
break; break;
case TextureType::Texture1DArray: case TextureType::Texture1DArray:
ASSERT(config.Depth() > 1);
type = ImageType::e1D; type = ImageType::e1D;
size.width = config.Width(); size.width = config.Width();
resources.layers = config.BaseLayer() + config.Depth();
resources.layers = config.Depth() - config.BaseLayer();
break; break;
case TextureType::Texture2D: case TextureType::Texture2D:
case TextureType::Texture2DNoMipmap: case TextureType::Texture2DNoMipmap:
ASSERT(config.BaseLayer() == 0);
ASSERT(config.Depth() == 1); ASSERT(config.Depth() == 1);
type = config.IsPitchLinear() ? ImageType::Linear : ImageType::e2D; type = config.IsPitchLinear() ? ImageType::Linear : ImageType::e2D;
rescaleable = !config.IsPitchLinear(); rescaleable = !config.IsPitchLinear();
size.width = config.Width(); size.width = config.Width();
size.height = config.Height(); size.height = config.Height();
resources.layers = config.BaseLayer() + 1;
resources.layers = 1;
break; break;
case TextureType::Texture2DArray: case TextureType::Texture2DArray:
ASSERT(config.Depth() > 1 || config.BaseLayer() != 0);
type = ImageType::e2D; type = ImageType::e2D;
rescaleable = true; rescaleable = true;
size.width = config.Width(); size.width = config.Width();
size.height = config.Height(); size.height = config.Height();
resources.layers = config.BaseLayer() + config.Depth();
resources.layers = config.Depth() - config.BaseLayer();
break; break;
case TextureType::TextureCubemap: case TextureType::TextureCubemap:
ASSERT(config.Depth() == 1); ASSERT(config.Depth() == 1);
ASSERT(config.BaseLayer() == 0);
type = ImageType::e2D; type = ImageType::e2D;
size.width = config.Width(); size.width = config.Width();
size.height = config.Height(); size.height = config.Height();
resources.layers = config.BaseLayer() + 6;
resources.layers = 6;
break; break;
case TextureType::TextureCubeArray: case TextureType::TextureCubeArray:
UNIMPLEMENTED_IF(config.load_store_hint != 0); UNIMPLEMENTED_IF(config.load_store_hint != 0);
ASSERT(config.Depth() > 0);
type = ImageType::e2D; type = ImageType::e2D;
size.width = config.Width(); size.width = config.Width();
size.height = config.Height(); size.height = config.Height();
resources.layers = config.BaseLayer() + config.Depth() * 6;
resources.layers = (config.Depth() - config.BaseLayer()) * 6;
break; break;
case TextureType::Texture3D: case TextureType::Texture3D:
ASSERT(config.BaseLayer() == 0); ASSERT(config.BaseLayer() == 0);

31
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; range.extent.levels = config.res_max_mip_level - config.res_min_mip_level + 1;
TextureType tex_type = config.texture_type; 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) { switch (tex_type) {
case TextureType::Texture1D: case TextureType::Texture1D:
ASSERT(config.Height() == 1); ASSERT(config.Height() == 1);
ASSERT(config.Depth() == 1); ASSERT(config.Depth() == 1);
ASSERT(base_layer == 0);
type = ImageViewType::e1D; type = ImageViewType::e1D;
range.extent.layers = 1;
break; break;
case TextureType::Texture1DArray: case TextureType::Texture1DArray:
ASSERT(config.Height() == 1); ASSERT(config.Height() == 1);
ASSERT(config.Depth() > 1 || base_layer != 0);
type = ImageViewType::e1DArray; type = ImageViewType::e1DArray;
range.extent.layers = config.Depth();
range.extent.layers = config.Depth() - base_layer;
break; break;
case TextureType::Texture2D: case TextureType::Texture2D:
case TextureType::Texture2DNoMipmap: case TextureType::Texture2DNoMipmap:
ASSERT(config.Depth() == 1); ASSERT(config.Depth() == 1);
ASSERT(base_layer == 0);
type = config.normalized_coords ? ImageViewType::e2D : ImageViewType::Rect; type = config.normalized_coords ? ImageViewType::e2D : ImageViewType::Rect;
range.extent.layers = 1;
break; break;
case TextureType::Texture2DArray: case TextureType::Texture2DArray:
ASSERT(config.Depth() > 1 || base_layer != 0);
type = ImageViewType::e2DArray; type = ImageViewType::e2DArray;
range.extent.layers = config.Depth();
range.extent.layers = config.Depth() - base_layer;
break; break;
case TextureType::Texture3D: case TextureType::Texture3D:
ASSERT(base_layer == 0);
type = ImageViewType::e3D; type = ImageViewType::e3D;
range.extent.layers = 1;
break; break;
case TextureType::TextureCubemap: case TextureType::TextureCubemap:
ASSERT(config.Depth() == 1); ASSERT(config.Depth() == 1);
ASSERT(base_layer == 0);
type = ImageViewType::Cube; type = ImageViewType::Cube;
range.extent.layers = 6; range.extent.layers = 6;
break; break;
case TextureType::TextureCubeArray: case TextureType::TextureCubeArray:
ASSERT(config.Depth() > 0);
type = ImageViewType::CubeArray; type = ImageViewType::CubeArray;
range.extent.layers = config.Depth() * 6;
range.extent.layers = (config.Depth() - base_layer) * 6;
break; break;
case TextureType::Texture1DBuffer: case TextureType::Texture1DBuffer:
type = ImageViewType::Buffer; type = ImageViewType::Buffer;
range.extent.layers = 1;
break; break;
default: default:
ASSERT_MSG(false, "Invalid texture_type={}", static_cast<int>(tex_type)); ASSERT_MSG(false, "Invalid texture_type={}", static_cast<int>(tex_type));

Loading…
Cancel
Save