From a762f70df3fc23185540f88724b261b065e5d979 Mon Sep 17 00:00:00 2001 From: Jun-Hong Cheng Date: Sun, 26 Apr 2026 04:57:00 +0800 Subject: [PATCH] Fix Vulkan device sorting logic violating strict weak ordering (#4322) --- src/video_core/renderer_vulkan/vk_instance.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 886ea8e75..aa6bab389 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -116,13 +116,20 @@ Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index, std::sort(properties2.begin(), properties2.end(), [](const auto& left, const auto& right) { const vk::PhysicalDeviceProperties& left_prop = std::get<1>(left).properties; const vk::PhysicalDeviceProperties& right_prop = std::get<1>(right).properties; - if (left_prop.apiVersion >= TargetVulkanApiVersion && - right_prop.apiVersion < TargetVulkanApiVersion) { - return true; + const bool left_supports_api = left_prop.apiVersion >= TargetVulkanApiVersion; + const bool right_supports_api = right_prop.apiVersion >= TargetVulkanApiVersion; + if (left_supports_api != right_supports_api) { + return left_supports_api; } - if (left_prop.deviceType != right_prop.deviceType) { - return left_prop.deviceType == vk::PhysicalDeviceType::eDiscreteGpu; + + const bool left_is_discrete = + left_prop.deviceType == vk::PhysicalDeviceType::eDiscreteGpu; + const bool right_is_discrete = + right_prop.deviceType == vk::PhysicalDeviceType::eDiscreteGpu; + if (left_is_discrete != right_is_discrete) { + return left_is_discrete; } + constexpr auto get_mem = [](const vk::PhysicalDeviceMemoryProperties& mem) -> size_t { size_t max = 0; for (u32 i = 0; i < mem.memoryHeapCount; i++) {