|
|
|
@ -30,59 +30,67 @@ constexpr u8 RENDER_TARGET_SWIZZLE = (std::numeric_limits<u8>::max)(); |
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
ImageViewInfo::ImageViewInfo(const TICEntry& config, s32 base_layer) noexcept |
|
|
|
: format{PixelFormatFromTIC(config)}, |
|
|
|
x_source{CastSwizzle(config.x_source)}, |
|
|
|
y_source{CastSwizzle(config.y_source)}, |
|
|
|
z_source{CastSwizzle(config.z_source)}, |
|
|
|
w_source{CastSwizzle(config.w_source)} { |
|
|
|
range.base = SubresourceBase{ |
|
|
|
.level = static_cast<s32>(config.res_min_mip_level), |
|
|
|
.layer = base_layer, |
|
|
|
}; |
|
|
|
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)) { |
|
|
|
: format{PixelFormatFromTIC(config)}, |
|
|
|
x_source{CastSwizzle(config.x_source)}, |
|
|
|
y_source{CastSwizzle(config.y_source)}, |
|
|
|
z_source{CastSwizzle(config.z_source)}, |
|
|
|
w_source{CastSwizzle(config.w_source)} { |
|
|
|
range.base = SubresourceBase{ |
|
|
|
.level = static_cast<s32>(config.res_min_mip_level), |
|
|
|
.layer = base_layer, |
|
|
|
}; |
|
|
|
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) { |
|
|
|
if (config.Depth() > 1 || base_layer != 0) { |
|
|
|
tex_type = TextureType::Texture1DArray; |
|
|
|
} |
|
|
|
switch (tex_type) { |
|
|
|
case TextureType::Texture1D: |
|
|
|
ASSERT(config.Height() == 1); |
|
|
|
ASSERT(config.Depth() == 1); |
|
|
|
type = ImageViewType::e1D; |
|
|
|
break; |
|
|
|
case TextureType::Texture1DArray: |
|
|
|
ASSERT(config.Height() == 1); |
|
|
|
type = ImageViewType::e1DArray; |
|
|
|
range.extent.layers = config.Depth(); |
|
|
|
break; |
|
|
|
case TextureType::Texture2D: |
|
|
|
case TextureType::Texture2DNoMipmap: |
|
|
|
ASSERT(config.Depth() == 1); |
|
|
|
type = config.normalized_coords ? ImageViewType::e2D : ImageViewType::Rect; |
|
|
|
break; |
|
|
|
case TextureType::Texture2DArray: |
|
|
|
type = ImageViewType::e2DArray; |
|
|
|
range.extent.layers = config.Depth(); |
|
|
|
break; |
|
|
|
case TextureType::Texture3D: |
|
|
|
type = ImageViewType::e3D; |
|
|
|
break; |
|
|
|
case TextureType::TextureCubemap: |
|
|
|
ASSERT(config.Depth() == 1); |
|
|
|
type = ImageViewType::Cube; |
|
|
|
range.extent.layers = 6; |
|
|
|
break; |
|
|
|
case TextureType::TextureCubeArray: |
|
|
|
type = ImageViewType::CubeArray; |
|
|
|
range.extent.layers = config.Depth() * 6; |
|
|
|
break; |
|
|
|
case TextureType::Texture1DBuffer: |
|
|
|
type = ImageViewType::Buffer; |
|
|
|
break; |
|
|
|
default: |
|
|
|
ASSERT_MSG(false, "Invalid texture_type={}", static_cast<int>(tex_type)); |
|
|
|
break; |
|
|
|
} else if (tex_type == TextureType::Texture2D) { |
|
|
|
if (config.Depth() > 1) { |
|
|
|
tex_type = TextureType::Texture3D; |
|
|
|
} else if (base_layer != 0) { |
|
|
|
tex_type = TextureType::Texture2DArray; |
|
|
|
} |
|
|
|
} |
|
|
|
switch (tex_type) { |
|
|
|
case TextureType::Texture1D: |
|
|
|
ASSERT(config.Height() == 1); |
|
|
|
ASSERT(config.Depth() == 1); |
|
|
|
type = ImageViewType::e1D; |
|
|
|
break; |
|
|
|
case TextureType::Texture1DArray: |
|
|
|
ASSERT(config.Height() == 1); |
|
|
|
type = ImageViewType::e1DArray; |
|
|
|
range.extent.layers = config.Depth(); |
|
|
|
break; |
|
|
|
case TextureType::Texture2D: |
|
|
|
case TextureType::Texture2DNoMipmap: |
|
|
|
ASSERT(config.Depth() == 1); |
|
|
|
type = config.normalized_coords ? ImageViewType::e2D : ImageViewType::Rect; |
|
|
|
break; |
|
|
|
case TextureType::Texture2DArray: |
|
|
|
type = ImageViewType::e2DArray; |
|
|
|
range.extent.layers = config.Depth(); |
|
|
|
break; |
|
|
|
case TextureType::Texture3D: |
|
|
|
type = ImageViewType::e3D; |
|
|
|
break; |
|
|
|
case TextureType::TextureCubemap: |
|
|
|
ASSERT(config.Depth() == 1); |
|
|
|
type = ImageViewType::Cube; |
|
|
|
range.extent.layers = 6; |
|
|
|
break; |
|
|
|
case TextureType::TextureCubeArray: |
|
|
|
type = ImageViewType::CubeArray; |
|
|
|
range.extent.layers = config.Depth() * 6; |
|
|
|
break; |
|
|
|
case TextureType::Texture1DBuffer: |
|
|
|
type = ImageViewType::Buffer; |
|
|
|
break; |
|
|
|
default: |
|
|
|
ASSERT_MSG(false, "Invalid texture_type={}", static_cast<int>(tex_type)); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ImageViewInfo::ImageViewInfo(ImageViewType type_, PixelFormat format_, |
|
|
|
|