|
|
@ -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<StorageViews>();
|
|
|
|
|
|
+ }
|
|
|
|
|
|
+ const size_t index{static_cast<size_t>(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<StorageViews>();
|
|
|
|
|
|
- }
|
|
|
|
|
|
auto& views{is_signed ? storage_views->signeds : storage_views->unsigneds}; |
|
|
|
|
|
- auto& view{views[static_cast<size_t>(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<vk::ImageView, Shader::NUM_TEXTURE_TYPES> typeless;
|
|
|
|
|
|
std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> signeds; |
|
|
|
|
|
std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> unsigneds; |
|
|
|
|
|
}; |