[Vulkan][TextureCache] Always use identity-swizzled views for storage images (#321)

Validation flagged writes to a VK_DESCRIPTOR_TYPE_STORAGE_IMAGE descriptor because the bound VkImageView had a non-identity component mapping  and hence the vuid-00336 error, this fixes the said error.

------

This commit helps to fix some graphical issues on games like Trident's Tale, where game didn't render anything than just plain terrain, helps to stabilize Nier Automata graphical issues, meanwhile the most annoying glitches are gone, there's still remain other issues.

Reviewed-on: #321
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Co-authored-by: wildcard <nubieluv@gmail.com>
Co-committed-by: wildcard <nubieluv@gmail.com>
This commit is contained in:
wildcard 2025-08-28 05:21:05 +02:00 committed by crueter
parent 26b5286250
commit 8ed05425dd
Signed by: crueter
GPG key ID: 425ACD2D4830EBC6

View file

@ -2160,20 +2160,34 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type,
if (!image_handle) {
return VK_NULL_HANDLE;
}
if (image_format == Shader::ImageFormat::Typeless) {
return Handle(texture_type);
}
const bool is_signed{image_format == Shader::ImageFormat::R8_SINT ||
image_format == Shader::ImageFormat::R16_SINT};
if (!storage_views) {
storage_views = std::make_unique<StorageViews>();
}
auto& views{is_signed ? storage_views->signeds : storage_views->unsigneds};
auto& view{views[static_cast<size_t>(texture_type)]};
// Storage images MUST use identity component mapping.
// Typeless: use the underlying image's native format.
if (image_format == Shader::ImageFormat::Typeless) {
auto& view = storage_views->unsigneds[static_cast<size_t>(texture_type)];
if (view) {
return *view;
}
view = MakeView(Format(image_format), VK_IMAGE_ASPECT_COLOR_BIT);
const auto fmt_info =
MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, /*is_image=*/true, format);
const VkFormat vk_format = fmt_info.format;
// Storage images are color-aspect only
view = MakeView(vk_format, VK_IMAGE_ASPECT_COLOR_BIT); // identity components inside
return *view;
}
const bool is_signed = (image_format == Shader::ImageFormat::R8_SINT ||image_format == Shader::ImageFormat::R16_SINT);
auto& views = is_signed ? storage_views->signeds : storage_views->unsigneds;
auto& view = views[static_cast<size_t>(texture_type)];
if (view) {
return *view;
}
const VkFormat vk_format = Format(image_format);
view = MakeView(vk_format, VK_IMAGE_ASPECT_COLOR_BIT);// identity components inside
return *view;
}