[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:
parent
26b5286250
commit
8ed05425dd
1 changed files with 23 additions and 9 deletions
|
@ -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)]};
|
||||
if (view) {
|
||||
|
||||
// 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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
view = MakeView(Format(image_format), VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue