Browse Source

[vk] VUID‑00336 Fix

pull/2838/head
Ribbit 3 months ago
committed by crueter
parent
commit
c7a85bfb6f
  1. 46
      pending_changes.diff
  2. 18
      src/video_core/renderer_vulkan/vk_texture_cache.cpp
  3. 1
      src/video_core/renderer_vulkan/vk_texture_cache.h

46
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<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;
};

18
src/video_core/renderer_vulkan/vk_texture_cache.cpp

@ -2165,16 +2165,24 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type,
if (!image_handle) { if (!image_handle) {
return VK_NULL_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) { 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 || const bool is_signed{image_format == Shader::ImageFormat::R8_SINT ||
image_format == Shader::ImageFormat::R16_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& views{is_signed ? storage_views->signeds : storage_views->unsigneds};
auto& view{views[static_cast<size_t>(texture_type)]};
auto& view{views[index]};
if (view) { if (view) {
return *view; return *view;
} }

1
src/video_core/renderer_vulkan/vk_texture_cache.h

@ -264,6 +264,7 @@ public:
private: private:
struct StorageViews { 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> signeds;
std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> unsigneds; std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> unsigneds;
}; };

Loading…
Cancel
Save