diff --git a/pending_changes.diff b/pending_changes.diff new file mode 100644 index 0000000000..5290bb413c --- /dev/null +++ b/pending_changes.diff @@ -0,0 +1,46 @@ +diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp +index 136a11f78d..b9e89355bd 100644 +--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp ++++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp +@@ -2165,16 +2165,24 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type, + if (!image_handle) { + return VK_NULL_HANDLE; + } ++ if (!storage_views) { ++ storage_views = std::make_unique(); ++ } ++ const size_t index{static_cast(texture_type)}; + if (image_format == Shader::ImageFormat::Typeless) { +- return Handle(texture_type); ++ auto& view{storage_views->typeless[index]}; ++ if (view) { ++ return *view; ++ } ++ const auto format_info = ++ MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); ++ view = MakeView(format_info.format, VK_IMAGE_ASPECT_COLOR_BIT); ++ return *view; + } + const bool is_signed{image_format == Shader::ImageFormat::R8_SINT || + image_format == Shader::ImageFormat::R16_SINT}; +- if (!storage_views) { +- storage_views = std::make_unique(); +- } + auto& views{is_signed ? storage_views->signeds : storage_views->unsigneds}; +- auto& view{views[static_cast(texture_type)]}; ++ auto& view{views[index]}; + if (view) { + return *view; + } +diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h +index cd11cc8fc7..7b3697cabe 100644 +--- a/src/video_core/renderer_vulkan/vk_texture_cache.h ++++ b/src/video_core/renderer_vulkan/vk_texture_cache.h +@@ -264,6 +264,7 @@ public: + + private: + struct StorageViews { ++ std::array typeless; + std::array signeds; + std::array unsigneds; + }; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 136a11f78d..b9e89355bd 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -2165,16 +2165,24 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type, if (!image_handle) { return VK_NULL_HANDLE; } + if (!storage_views) { + storage_views = std::make_unique(); + } + const size_t index{static_cast(texture_type)}; if (image_format == Shader::ImageFormat::Typeless) { - return Handle(texture_type); + auto& view{storage_views->typeless[index]}; + if (view) { + return *view; + } + const auto format_info = + MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); + view = MakeView(format_info.format, VK_IMAGE_ASPECT_COLOR_BIT); + return *view; } const bool is_signed{image_format == Shader::ImageFormat::R8_SINT || image_format == Shader::ImageFormat::R16_SINT}; - if (!storage_views) { - storage_views = std::make_unique(); - } auto& views{is_signed ? storage_views->signeds : storage_views->unsigneds}; - auto& view{views[static_cast(texture_type)]}; + auto& view{views[index]}; if (view) { return *view; } diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index cd11cc8fc7..7b3697cabe 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -264,6 +264,7 @@ public: private: struct StorageViews { + std::array typeless; std::array signeds; std::array unsigneds; };