From 445e0bfd362a1ed7ef1861f02b55109af4cffd2e Mon Sep 17 00:00:00 2001 From: wildcard Date: Tue, 17 Feb 2026 22:06:38 +0100 Subject: [PATCH] [vulkan] fix vuid 00336 Another attempt, previous was PR321 which broke some games like kirby star allies --- src/video_core/renderer_vulkan/vk_texture_cache.cpp | 12 +++++++++++- src/video_core/renderer_vulkan/vk_texture_cache.h | 5 +++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 0069f10f9c..9768a00f8d 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -2179,6 +2179,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI using Shader::TextureType; const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info); + this->aspect_mask = aspect_mask; std::array swizzle{ SwizzleSource::R, SwizzleSource::G, @@ -2193,6 +2194,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); } } + this->swizzle = swizzle; const auto format_info = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); if (ImageUsageFlags(format_info, format) != image.UsageFlags()) { LOG_WARNING(Render_Vulkan, @@ -2273,6 +2275,8 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageInfo& ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::NullImageViewParams& params) : VideoCommon::ImageViewBase{params}, device{&runtime.device} { + swizzle = {SwizzleSource::R, SwizzleSource::G, SwizzleSource::B, SwizzleSource::A}; + aspect_mask = VK_IMAGE_ASPECT_COLOR_BIT; if (device->HasNullDescriptor()) { return; } @@ -2329,7 +2333,13 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type, Shader::ImageFormat image_format) { if (image_handle) { if (image_format == Shader::ImageFormat::Typeless) { - return Handle(texture_type); + auto& view = identity_views[static_cast(texture_type)]; + if (!view) { + const auto format_info = + MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); + view = MakeView(format_info.format, aspect_mask); + } + return *view; } const bool is_signed = image_format == Shader::ImageFormat::R8_SINT || image_format == Shader::ImageFormat::R16_SINT; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index 4bb9687ab0..ce92defdbe 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -17,6 +17,8 @@ #include "video_core/vulkan_common/vulkan_memory_allocator.h" #include "video_core/vulkan_common/vulkan_wrapper.h" +#include "video_core/textures/texture.h" + namespace Settings { struct ResolutionScalingInfo; } @@ -379,6 +381,9 @@ private: const SlotVector* slot_images = nullptr; std::array image_views; + std::array identity_views; + std::array swizzle; + VkImageAspectFlags aspect_mask; std::optional storage_views; vk::ImageView depth_view; vk::ImageView stencil_view;