diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index cce454fa48..8ccfad0820 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -212,7 +212,11 @@ constexpr VkBorderColor ConvertBorderColor(const std::array& color) { return device.IsFormatSupported(view_format, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT, FormatType::Optimal); }); - if (has_storage_compatible_view) { + const bool storage_allowed_for_samples = + image_ci.samples == VK_SAMPLE_COUNT_1_BIT || + (device.GetStorageImageSampleCounts() & + static_cast(image_ci.samples)) != 0; + if (has_storage_compatible_view && storage_allowed_for_samples) { image_ci.usage |= VK_IMAGE_USAGE_STORAGE_BIT; } diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 9ac91fc3d0..07fb676d1f 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -887,6 +887,10 @@ FN_MAX_LIMIT_LIST u64 GetDeviceMemoryUsage() const; + VkSampleCountFlags GetStorageImageSampleCounts() const { + return properties.properties.limits.storageImageSampleCounts; + } + u32 GetSetsPerPool() const { return sets_per_pool; }