From 9365e1453ff37eedf723dbad3e53e95a5d37d270 Mon Sep 17 00:00:00 2001 From: DynamoFox Date: Tue, 23 Jul 2024 21:31:32 +0200 Subject: [PATCH] Fix 'auto' GPU identification and display * Refactors the previous code segment * Fixes 'auto' GPU identification and display in DDNet Graphics tab of the settings. The 'auto' GPU is the best one encountered in the VK physical device enumeration array until we encounter one that is at least "integrated" when accessing them in increasing order * Selects the first GPU that matches a name when using one by user specified name --- .../client/backend/vulkan/backend_vulkan.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/engine/client/backend/vulkan/backend_vulkan.cpp b/src/engine/client/backend/vulkan/backend_vulkan.cpp index 140b7e9e6f9..4efcc5bd8dd 100644 --- a/src/engine/client/backend/vulkan/backend_vulkan.cpp +++ b/src/engine/client/backend/vulkan/backend_vulkan.cpp @@ -3730,12 +3730,12 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase m_pGpuList->m_vGpus.reserve(vDeviceList.size()); size_t FoundDeviceIndex = 0; - size_t FoundGpuType = STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_INVALID; STWGraphicGpu::ETWGraphicsGpuType AutoGpuType = STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_INVALID; bool IsAutoGpu = str_comp(g_Config.m_GfxGpuName, "auto") == 0; + bool UserSelectedGpuChosen = false; for(auto &CurDevice : vDeviceList) { vkGetPhysicalDeviceProperties(CurDevice, &(vDevicePropList[Index])); @@ -3754,18 +3754,24 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase NewGpu.m_GpuType = GPUType; m_pGpuList->m_vGpus.push_back(NewGpu); - if(GPUType < AutoGpuType) + // We always decide what the 'auto' GPU would be, even if user is forcing a GPU by name in config + // Reminder: A worse GPU enumeration has a higher value than a better GPU enumeration, thus the '>' + if(AutoGpuType > STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_INTEGRATED) { str_copy(m_pGpuList->m_AutoGpu.m_aName, DeviceProp.deviceName); m_pGpuList->m_AutoGpu.m_GpuType = GPUType; AutoGpuType = GPUType; - } - if(((IsAutoGpu && (FoundGpuType > STWGraphicGpu::ETWGraphicsGpuType::GRAPHICS_GPU_TYPE_INTEGRATED && GPUType < FoundGpuType)) || str_comp(DeviceProp.deviceName, g_Config.m_GfxGpuName) == 0) && (DevAPIMajor > gs_BackendVulkanMajor || (DevAPIMajor == gs_BackendVulkanMajor && DevAPIMinor >= gs_BackendVulkanMinor))) + if(IsAutoGpu) + FoundDeviceIndex = Index; + } + // We only select the first GPU that matches, because it comes first in the enumeration array, it's preferred by the system + // Reminder: We can't break the cycle here if the name matches because we need to choose the best GPU for 'auto' mode + if(!IsAutoGpu && !UserSelectedGpuChosen && str_comp(DeviceProp.deviceName, g_Config.m_GfxGpuName) == 0) { FoundDeviceIndex = Index; - FoundGpuType = GPUType; + UserSelectedGpuChosen = true; } } Index++;