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

Merged
CamilleLaVey merged 1 commit from vuid_00336_fix into master 2025-08-28 05:21:06 +02:00

View file

@ -2160,20 +2160,34 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type,
if (!image_handle) { if (!image_handle) {
return VK_NULL_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) { if (!storage_views) {
storage_views = std::make_unique<StorageViews>(); 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.
if (view) { // 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; 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; return *view;
} }