From 05d2c2940bfb2da5c0c2d6e755661fbc155477f8 Mon Sep 17 00:00:00 2001 From: Thraix Date: Sun, 14 May 2023 20:24:04 +0200 Subject: [PATCH] Fix vulkan linking issues and add iGPU support - Fix vulkan linking by setting correct VK_LAYER_PATH and correct vulkan library path - Add priority to GPU selection. Prioritizing dedicated GPUs over integrated GPUs --- CopiumEngine/CopiumEngine.vcxproj | 4 +-- CopiumEngine/CopiumEngine.vcxproj.user | 4 +-- CopiumEngine/src/copium/core/Device.cpp | 44 +++++++++++++----------- CopiumEngine/src/copium/core/Device.h | 2 +- CopiumEngine/src/copium/core/Vulkan.cpp | 2 +- CopiumEngine/src/copium/core/Window.cpp | 10 +++--- ext/projects/glfw3/glfw3.vcxproj | 2 ++ ext/projects/glfw3/glfw3.vcxproj.filters | 6 ++++ 8 files changed, 44 insertions(+), 30 deletions(-) diff --git a/CopiumEngine/CopiumEngine.vcxproj b/CopiumEngine/CopiumEngine.vcxproj index 9ff3538..fa4aaab 100644 --- a/CopiumEngine/CopiumEngine.vcxproj +++ b/CopiumEngine/CopiumEngine.vcxproj @@ -127,7 +127,7 @@ Console true - $(SolutionDir)libs\$(Platform)\$(Configuration)\;C:/VulkanSDK/1.3.236.0/Lib;%(AdditionalLibraryDirectories) + $(SolutionDir)libs\$(Platform)\$(Configuration)\;$(VULKAN_SDK)/Lib;%(AdditionalLibraryDirectories) vulkan-1.lib;glfw3.lib;shaderc_combinedd.lib;msdfgen-core.lib;msdfgen-ext.lib;msdf-atlas-gen.lib;freetype.lib;%(AdditionalDependencies) @@ -156,7 +156,7 @@ true true true - $(SolutionDir)libs\$(Platform)\$(Configuration)\;C:/VulkanSDK/1.3.236.0/Lib;%(AdditionalLibraryDirectories) + $(SolutionDir)libs\$(Platform)\$(Configuration)\;$(VULKAN_SDK)/Lib;%(AdditionalLibraryDirectories) vulkan-1.lib;glfw3.lib;shaderc_combined.lib;msdfgen-core.lib;msdfgen-ext.lib;msdf-atlas-gen.lib;freetype.lib;%(AdditionalDependencies) diff --git a/CopiumEngine/CopiumEngine.vcxproj.user b/CopiumEngine/CopiumEngine.vcxproj.user index 21b8a9b..abb4d01 100644 --- a/CopiumEngine/CopiumEngine.vcxproj.user +++ b/CopiumEngine/CopiumEngine.vcxproj.user @@ -4,11 +4,11 @@ true - VK_LAYER_PATH=C:\VulkanSDK\1.3.236.0\Bin + VK_LAYER_PATH=$(VULKAN_SDK)\Bin WindowsLocalDebugger - VK_LAYER_PATH=C:\VulkanSDK\1.3.236.0\Bin + VK_LAYER_PATH=$(VULKAN_SDK)\Bin WindowsLocalDebugger \ No newline at end of file diff --git a/CopiumEngine/src/copium/core/Device.cpp b/CopiumEngine/src/copium/core/Device.cpp index 3616cbf..9caf411 100644 --- a/CopiumEngine/src/copium/core/Device.cpp +++ b/CopiumEngine/src/copium/core/Device.cpp @@ -63,25 +63,26 @@ namespace Copium std::vector devices(deviceCount); vkEnumeratePhysicalDevices(Vulkan::GetInstance(), &deviceCount, devices.data()); + + std::vector> devicePriorities; + devicePriorities.reserve(deviceCount); CP_INFO("Available devices:"); for (auto&& device : devices) { VkPhysicalDeviceProperties deviceProperties; vkGetPhysicalDeviceProperties(device, &deviceProperties); CP_INFO_CONT("\t%s", deviceProperties.deviceName); + devicePriorities.emplace_back(device, GetPhysicalDevicePriority(device)); } - for (auto&& device : devices) - { - if (IsPhysicalDeviceSuitable(device)) - { - VkPhysicalDeviceProperties deviceProperties; - vkGetPhysicalDeviceProperties(device, &deviceProperties); - physicalDevice = device; - CP_INFO("Selecting device: %s", deviceProperties.deviceName); - break; - } - } - CP_ASSERT(physicalDevice != VK_NULL_HANDLE, "Failed to find suitable GPU"); + + std::sort(devicePriorities.begin(), devicePriorities.end(), [](const std::pair& lhs, const std::pair& rhs) { return lhs.second > rhs.second; }); + auto&& it = devicePriorities.begin(); + CP_ASSERT(it->second != 0, "Failed to find suitable GPU"); + + VkPhysicalDeviceProperties deviceProperties; + vkGetPhysicalDeviceProperties(it->first, &deviceProperties); + physicalDevice = it->first; + CP_INFO("Selecting device: %s", deviceProperties.deviceName); } void Device::InitializeLogicalDevice() @@ -130,30 +131,33 @@ namespace Copium CP_VK_ASSERT(vkCreateCommandPool(device, &createInfo, nullptr, &commandPool), "Failed to initialize command pool"); } - bool Device::IsPhysicalDeviceSuitable(VkPhysicalDevice device) + uint32_t Device::GetPhysicalDevicePriority(VkPhysicalDevice device) { + uint32_t priority = 0; VkPhysicalDeviceProperties deviceProperties; vkGetPhysicalDeviceProperties(device, &deviceProperties); - if (deviceProperties.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - return false; + if (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) + priority = 100; + else + priority = 50; VkPhysicalDeviceFeatures deviceFeatures; vkGetPhysicalDeviceFeatures(device, &deviceFeatures); if (!deviceFeatures.fillModeNonSolid || !deviceFeatures.samplerAnisotropy) - return false; + return 0; QueueFamiliesQuery query{Vulkan::GetWindow().GetSurface(), device}; if (!query.AllRequiredFamiliesSupported()) - return false; + return 0; if (!CheckDeviceExtensionSupport(device)) - return false; + return 0; SwapChainSupportDetails details{Vulkan::GetWindow().GetSurface(), device}; if (!details.Valid()) - return false; + return 0; - return true; + return priority; } bool Device::CheckDeviceExtensionSupport(VkPhysicalDevice device) diff --git a/CopiumEngine/src/copium/core/Device.h b/CopiumEngine/src/copium/core/Device.h index 24b6687..9d5696a 100644 --- a/CopiumEngine/src/copium/core/Device.h +++ b/CopiumEngine/src/copium/core/Device.h @@ -38,7 +38,7 @@ namespace Copium void SelectPhysicalDevice(); void InitializeLogicalDevice(); void InitializeCommandPool(); - bool IsPhysicalDeviceSuitable(VkPhysicalDevice device); + uint32_t GetPhysicalDevicePriority(VkPhysicalDevice device); bool CheckDeviceExtensionSupport(VkPhysicalDevice device); std::vector GetRequiredDeviceExtensions(); }; diff --git a/CopiumEngine/src/copium/core/Vulkan.cpp b/CopiumEngine/src/copium/core/Vulkan.cpp index 2a266fb..bf08857 100644 --- a/CopiumEngine/src/copium/core/Vulkan.cpp +++ b/CopiumEngine/src/copium/core/Vulkan.cpp @@ -17,7 +17,7 @@ namespace Copium void Vulkan::Initialize() { instance = std::make_unique("Copium Engine"); - window = std::make_unique("Copium Engine", 1920, 1080, WindowMode::Windowed); + window = std::make_unique("Copium Engine", 1440, 810, WindowMode::Windowed); device = std::make_unique(); swapChain = std::make_unique(); diff --git a/CopiumEngine/src/copium/core/Window.cpp b/CopiumEngine/src/copium/core/Window.cpp index 792dd27..bc146bd 100644 --- a/CopiumEngine/src/copium/core/Window.cpp +++ b/CopiumEngine/src/copium/core/Window.cpp @@ -45,15 +45,15 @@ namespace Copium { GLFWmonitor* monitor = glfwGetPrimaryMonitor(); const GLFWvidmode* mode = glfwGetVideoMode(monitor); - window = glfwCreateWindow(mode->width, mode->height, windowName.c_str(), glfwGetPrimaryMonitor(), nullptr); + window = glfwCreateWindow(mode->width, mode->height, windowName.c_str(), monitor, nullptr); break; } case WindowMode::BorderlessWindowed: { - GLFWmonitor* monitor = glfwGetPrimaryMonitor(); - const GLFWvidmode* mode = glfwGetVideoMode(monitor); + const GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); + + glfwWindowHint(GLFW_DECORATED, false); window = glfwCreateWindow(mode->width, mode->height, windowName.c_str(), nullptr, nullptr); - glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate); break; } case WindowMode::Windowed: @@ -83,6 +83,8 @@ namespace Copium void Window::FramebufferResizeCallback(GLFWwindow* glfwWindow, int width, int height) { + if (width == 0 || height == 0) + return; Vulkan::GetSwapChain().ResizeFramebuffer(); EventDispatcher::QueueEvent(WindowResizeEvent{width, height}); } diff --git a/ext/projects/glfw3/glfw3.vcxproj b/ext/projects/glfw3/glfw3.vcxproj index 64131ff..364b37c 100644 --- a/ext/projects/glfw3/glfw3.vcxproj +++ b/ext/projects/glfw3/glfw3.vcxproj @@ -161,6 +161,8 @@ + + diff --git a/ext/projects/glfw3/glfw3.vcxproj.filters b/ext/projects/glfw3/glfw3.vcxproj.filters index f398133..cba7e72 100644 --- a/ext/projects/glfw3/glfw3.vcxproj.filters +++ b/ext/projects/glfw3/glfw3.vcxproj.filters @@ -116,5 +116,11 @@ Header Files + + Header Files + + + Header Files + \ No newline at end of file