Add dummy depth image

This commit is contained in:
kalaposfos13 2025-05-09 11:34:07 +02:00
parent 161cb46c4e
commit 774c3bec30
3 changed files with 52 additions and 35 deletions

View File

@ -219,6 +219,19 @@ struct Image {
return image;
}
static constexpr Image DummyDepth() {
Image image{};
image.data_format = u64(DataFormat::Format32);
image.num_format = u64(NumberFormat::Float);
image.dst_sel_x = u64(CompSwizzle::Red);
image.dst_sel_y = u64(CompSwizzle::Green);
image.dst_sel_z = u64(CompSwizzle::Blue);
image.dst_sel_w = u64(CompSwizzle::Alpha);
image.tiling_index = u64(TilingMode::Texture_MicroTiled);
image.type = u64(ImageType::Color2D);
return image;
}
bool Valid() const {
return (type & 0x8u) != 0;
}

View File

@ -124,43 +124,45 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slice
}
ImageInfo::ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept {
tiling_mode = image.GetTilingMode();
pixel_format = LiverpoolToVK::SurfaceFormat(image.GetDataFmt(), image.GetNumberFmt());
// Override format if image is forced to be a depth target, except if the image is a dummy one
AmdGpu::Image i = image;
tiling_mode = i.GetTilingMode();
pixel_format = LiverpoolToVK::SurfaceFormat(i.GetDataFmt(), i.GetNumberFmt());
// Override format if i is forced to be a depth target, except if the i is a dummy one
if (desc.is_depth) {
if (image.width != 0 && image.height != 0) {
if (i.width != 0 && i.height != 0) {
pixel_format = Vulkan::LiverpoolToVK::PromoteFormatToDepth(pixel_format);
if (pixel_format == vk::Format::eUndefined) {
ASSERT_MSG(image.width == 0 && image.height == 0,
ASSERT_MSG(i.width == 0 && i.height == 0,
"PromoteFormatToDepth failed, info dump: format: {}, size: {}x{}, "
"data_format: {}",
vk::to_string(pixel_format), image.width, image.height,
AmdGpu::NameOf(image.GetDataFmt()));
vk::to_string(pixel_format), i.width, i.height,
AmdGpu::NameOf(i.GetDataFmt()));
pixel_format = vk::Format::eD32Sfloat;
}
} else {
i = AmdGpu::Image::DummyDepth();
pixel_format = vk::Format::eD32Sfloat;
}
}
type = ConvertImageType(image.GetType());
props.is_tiled = image.IsTiled();
props.is_volume = image.GetType() == AmdGpu::ImageType::Color3D;
props.is_pow2 = image.pow2pad;
type = ConvertImageType(i.GetType());
props.is_tiled = i.IsTiled();
props.is_volume = i.GetType() == AmdGpu::ImageType::Color3D;
props.is_pow2 = i.pow2pad;
props.is_block = IsBlockCoded();
size.width = image.width + 1;
size.height = image.height + 1;
size.depth = props.is_volume ? image.depth + 1 : 1;
pitch = image.Pitch();
resources.levels = image.NumLevels();
resources.layers = image.NumLayers();
num_samples = image.NumSamples();
num_bits = NumBits(image.GetDataFmt());
size.width = i.width + 1;
size.height = i.height + 1;
size.depth = props.is_volume ? i.depth + 1 : 1;
pitch = i.Pitch();
resources.levels = i.NumLevels();
resources.layers = i.NumLayers();
num_samples = i.NumSamples();
num_bits = NumBits(i.GetDataFmt());
guest_address = image.Address();
guest_address = i.Address();
mips_layout.reserve(resources.levels);
tiling_idx = image.tiling_index;
alt_tile = Libraries::Kernel::sceKernelIsNeoMode() && image.alt_tile_mode;
tiling_idx = i.tiling_index;
alt_tile = Libraries::Kernel::sceKernelIsNeoMode() && i.alt_tile_mode;
UpdateSize();
}

View File

@ -31,37 +31,39 @@ vk::ImageViewType ConvertImageViewType(AmdGpu::ImageType type) {
ImageViewInfo::ImageViewInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept
: is_storage{desc.is_written} {
const auto dfmt = image.GetDataFmt();
auto nfmt = image.GetNumberFmt();
AmdGpu::Image i = image;
const auto dfmt = i.GetDataFmt();
auto nfmt = i.GetNumberFmt();
if (is_storage && nfmt == AmdGpu::NumberFormat::Srgb) {
nfmt = AmdGpu::NumberFormat::Unorm;
}
format = Vulkan::LiverpoolToVK::SurfaceFormat(dfmt, nfmt);
// Override format if image is forced to be a depth target, except if the image is a dummy one
// Override format if i is forced to be a depth target, except if the i is a dummy one
if (desc.is_depth) {
if (image.width != 0 && image.height != 0) {
if (i.width != 0 && i.height != 0) {
format = Vulkan::LiverpoolToVK::PromoteFormatToDepth(format);
if (format == vk::Format::eUndefined) {
ASSERT_MSG(image.width == 0 && image.height == 0,
ASSERT_MSG(i.width == 0 && i.height == 0,
"PromoteFormatToDepth failed, info dump: format: {}, size: {}x{}, "
"data_format: {}",
vk::to_string(format), image.width, image.height,
AmdGpu::NameOf(image.GetDataFmt()));
vk::to_string(format), i.width, i.height,
AmdGpu::NameOf(i.GetDataFmt()));
format = vk::Format::eD32Sfloat;
}
} else {
i = AmdGpu::Image::DummyDepth();
format = vk::Format::eD32Sfloat;
}
}
range.base.level = image.base_level;
range.base.layer = image.base_array;
range.extent.levels = image.NumViewLevels(desc.is_array);
range.extent.layers = image.NumViewLayers(desc.is_array);
type = ConvertImageViewType(image.GetViewType(desc.is_array));
range.base.level = i.base_level;
range.base.layer = i.base_array;
range.extent.levels = i.NumViewLevels(desc.is_array);
range.extent.layers = i.NumViewLayers(desc.is_array);
type = ConvertImageViewType(i.GetViewType(desc.is_array));
if (!is_storage) {
mapping = Vulkan::LiverpoolToVK::ComponentMapping(image.DstSelect());
mapping = Vulkan::LiverpoolToVK::ComponentMapping(i.DstSelect());
}
}