mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-27 04:25:12 +00:00
Add dummy depth image
This commit is contained in:
parent
161cb46c4e
commit
774c3bec30
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user