From 774c3bec3025d2d7b29e4d74a4ec31b00928f4fc Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 9 May 2025 11:34:07 +0200 Subject: [PATCH] Add dummy depth image --- src/video_core/amdgpu/resource.h | 13 ++++++ src/video_core/texture_cache/image_info.cpp | 46 +++++++++++---------- src/video_core/texture_cache/image_view.cpp | 28 +++++++------ 3 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index c387c7bf2..3cab3b041 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -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; } diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index ed18516a1..2213c2616 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -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(); } diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index 84aaddb86..e22438a01 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -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()); } }