From 7654a08d9ac1ba21280fca4f734cc1dae038a9e6 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 21 Oct 2024 03:17:39 -0700 Subject: [PATCH] vulkan: Report only missing format feature flags. (#1420) --- .../renderer_vulkan/vk_instance.cpp | 30 +++++++++++-------- src/video_core/renderer_vulkan/vk_instance.h | 3 ++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index dda4e0d9f..0edc4228a 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -160,22 +160,23 @@ Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index, // Check and log format support details. for (const auto& format : LiverpoolToVK::SurfaceFormats()) { - if (!IsFormatSupported(GetSupportedFormat(format.vk_format, format.flags), format.flags)) { + if (!IsFormatSupported(format.vk_format, format.flags)) { LOG_WARNING(Render_Vulkan, "Surface format data_format={}, number_format={} is not fully supported " - "(vk_format={}, requested flags={})", + "(vk_format={}, missing features={})", static_cast(format.data_format), static_cast(format.number_format), vk::to_string(format.vk_format), - vk::to_string(format.flags)); + vk::to_string(format.flags & ~GetFormatFeatureFlags(format.vk_format))); } } for (const auto& format : LiverpoolToVK::DepthFormats()) { - if (!IsFormatSupported(GetSupportedFormat(format.vk_format, format.flags), format.flags)) { + if (!IsFormatSupported(format.vk_format, format.flags)) { LOG_WARNING(Render_Vulkan, "Depth format z_format={}, stencil_format={} is not fully supported " - "(vk_format={}, requested flags={})", + "(vk_format={}, missing features={})", static_cast(format.z_format), static_cast(format.stencil_format), - vk::to_string(format.vk_format), vk::to_string(format.flags)); + vk::to_string(format.vk_format), + vk::to_string(format.flags & ~GetFormatFeatureFlags(format.vk_format))); } } } @@ -546,18 +547,21 @@ void Instance::CollectToolingInfo() { } } -bool Instance::IsFormatSupported(const vk::Format format, - const vk::FormatFeatureFlags2 flags) const { - if (format == vk::Format::eUndefined) [[unlikely]] { - return true; - } - +vk::FormatFeatureFlags2 Instance::GetFormatFeatureFlags(vk::Format format) const { const auto it = format_properties.find(format); if (it == format_properties.end()) { UNIMPLEMENTED_MSG("Properties of format {} have not been queried.", vk::to_string(format)); } - return ((it->second.optimalTilingFeatures | it->second.bufferFeatures) & flags) == flags; + return it->second.optimalTilingFeatures | it->second.bufferFeatures; +} + +bool Instance::IsFormatSupported(const vk::Format format, + const vk::FormatFeatureFlags2 flags) const { + if (format == vk::Format::eUndefined) [[unlikely]] { + return true; + } + return (GetFormatFeatureFlags(format) & flags) == flags; } static vk::Format GetAlternativeFormat(const vk::Format format) { diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 474b86e9a..51c2c57c5 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -275,6 +275,9 @@ private: void CollectDeviceParameters(); void CollectToolingInfo(); + /// Gets the supported feature flags for a format. + [[nodiscard]] vk::FormatFeatureFlags2 GetFormatFeatureFlags(vk::Format format) const; + /// Determines if a format is supported for a set of feature flags. [[nodiscard]] bool IsFormatSupported(vk::Format format, vk::FormatFeatureFlags2 flags) const;