From e66a3e8599f3741243b65ee6f1d7ba78fe6bdc04 Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Wed, 12 Feb 2025 13:08:09 +0700 Subject: [PATCH 1/5] fix: wrap vulkan gpu function --- engine/utils/hardware/gpu/vulkan/vulkan_gpu.h | 356 ++++++++++-------- engine/utils/hardware/gpu_info.h | 3 +- 2 files changed, 194 insertions(+), 165 deletions(-) diff --git a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h index 1b04029f0..20de5a1e8 100644 --- a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h +++ b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h @@ -251,193 +251,221 @@ inline int FreeLibrary(void* pLibrary) { } #endif -inline cpp::result, std::string> GetGpuInfoList() { - namespace fmu = file_manager_utils; - auto get_vulkan_path = [](const std::string& lib_vulkan) - -> cpp::result { - if (std::filesystem::exists(fmu::GetExecutableFolderContainerPath() / - lib_vulkan)) { - return fmu::GetExecutableFolderContainerPath() / lib_vulkan; - // fallback to deps path - } else if (std::filesystem::exists(fmu::GetCortexDataPath() / "deps" / - lib_vulkan)) { - return fmu::GetCortexDataPath() / "deps" / lib_vulkan; - } else { - CTL_WRN("Could not found " << lib_vulkan); - return cpp::fail("Could not found " + lib_vulkan); - } - }; +class VulkanGpu { + private: + VulkanGpu() {} +#if defined(__linux__) || defined(__APPLE__) + void* vulkan_library = nullptr; +#else + HMODULE vulkan_library = nullptr; +#endif + + public: + VulkanGpu(VulkanGpu const&) = delete; + VulkanGpu& operator=(VulkanGpu const&) = delete; + ~VulkanGpu() { + if (vulkan_library) + FreeLibrary(vulkan_library); + } + + static VulkanGpu& GetInstance() { + static VulkanGpu vg; + return vg; + } + + cpp::result, std::string> GetGpuInfoList() { + namespace fmu = file_manager_utils; + auto get_vulkan_path = [](const std::string& lib_vulkan) + -> cpp::result { + if (std::filesystem::exists(fmu::GetExecutableFolderContainerPath() / + lib_vulkan)) { + return fmu::GetExecutableFolderContainerPath() / lib_vulkan; + // fallback to deps path + } else if (std::filesystem::exists(fmu::GetCortexDataPath() / "deps" / + lib_vulkan)) { + return fmu::GetCortexDataPath() / "deps" / lib_vulkan; + } else { + CTL_WRN("Could not found " << lib_vulkan); + return cpp::fail("Could not found " + lib_vulkan); + } + }; // Load the Vulkan library #if defined(__APPLE__) && defined(__MACH__) - return std::vector{}; + return std::vector{}; #elif defined(__linux__) - auto vulkan_path = get_vulkan_path("libvulkan.so"); - if (vulkan_path.has_error()) { - return cpp::fail(vulkan_path.error()); - } - void* vulkan_library = - dlopen(vulkan_path.value().string().c_str(), RTLD_LAZY | RTLD_GLOBAL); + auto vulkan_path = get_vulkan_path("libvulkan.so"); + if (vulkan_path.has_error()) { + return cpp::fail(vulkan_path.error()); + } + if (vulkan_library == nullptr) { + vulkan_library = + dlopen(vulkan_path.value().string().c_str(), RTLD_LAZY | RTLD_GLOBAL); + } #else - auto vulkan_path = get_vulkan_path("vulkan-1.dll"); - if (vulkan_path.has_error()) { - return cpp::fail(vulkan_path.error()); - } - HMODULE vulkan_library = LoadLibraryW(vulkan_path.value().wstring().c_str()); + auto vulkan_path = get_vulkan_path("vulkan-1.dll"); + if (vulkan_path.has_error()) { + return cpp::fail(vulkan_path.error()); + } + if (vulkan_library == nullptr) { + vulkan_library = LoadLibraryW(vulkan_path.value().wstring().c_str()); + } #endif #if defined(_WIN32) || defined(_WIN64) || defined(__linux__) - if (!vulkan_library) { - std::cerr << "Failed to load the Vulkan library." << std::endl; - return cpp::fail("Failed to load the Vulkan library."); - } + if (!vulkan_library) { + std::cerr << "Failed to load the Vulkan library." << std::endl; + return cpp::fail("Failed to load the Vulkan library."); + } - // Get the function pointers for other Vulkan functions - auto vkEnumerateInstanceExtensionProperties = - reinterpret_cast( - GetProcAddress(vulkan_library, - "vkEnumerateInstanceExtensionProperties")); - auto vkCreateInstance = reinterpret_cast( - GetProcAddress(vulkan_library, "vkCreateInstance")); - auto vkEnumeratePhysicalDevices = - reinterpret_cast( - GetProcAddress(vulkan_library, "vkEnumeratePhysicalDevices")); - auto vkGetPhysicalDeviceProperties = - reinterpret_cast( - GetProcAddress(vulkan_library, "vkGetPhysicalDeviceProperties")); - auto vkDestroyInstance = reinterpret_cast( - GetProcAddress(vulkan_library, "vkDestroyInstance")); - auto vkGetPhysicalDeviceMemoryProperties = - (PFN_vkGetPhysicalDeviceMemoryProperties)GetProcAddress( - vulkan_library, "vkGetPhysicalDeviceMemoryProperties"); - - auto vkGetPhysicalDeviceProperties2 = - (PFN_vkGetPhysicalDeviceProperties2)GetProcAddress( - vulkan_library, "vkGetPhysicalDeviceProperties2"); - - uint32_t extension_count = 0; - vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr); - std::vector available_extensions(extension_count); - vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, - available_extensions.data()); - - // Create a Vulkan instance - VkInstanceCreateInfo instance_create_info = {}; - instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - // If the extension is available, enable it - std::vector enabled_extensions; - - for (const auto& extension : available_extensions) { - enabled_extensions.push_back(extension.extensionName); - } + // Get the function pointers for other Vulkan functions + auto vkEnumerateInstanceExtensionProperties = + reinterpret_cast( + GetProcAddress(vulkan_library, + "vkEnumerateInstanceExtensionProperties")); + auto vkCreateInstance = reinterpret_cast( + GetProcAddress(vulkan_library, "vkCreateInstance")); + auto vkEnumeratePhysicalDevices = + reinterpret_cast( + GetProcAddress(vulkan_library, "vkEnumeratePhysicalDevices")); + auto vkGetPhysicalDeviceProperties = + reinterpret_cast( + GetProcAddress(vulkan_library, "vkGetPhysicalDeviceProperties")); + auto vkDestroyInstance = reinterpret_cast( + GetProcAddress(vulkan_library, "vkDestroyInstance")); + auto vkGetPhysicalDeviceMemoryProperties = + (PFN_vkGetPhysicalDeviceMemoryProperties)GetProcAddress( + vulkan_library, "vkGetPhysicalDeviceMemoryProperties"); + + auto vkGetPhysicalDeviceProperties2 = + (PFN_vkGetPhysicalDeviceProperties2)GetProcAddress( + vulkan_library, "vkGetPhysicalDeviceProperties2"); + + uint32_t extension_count = 0; + vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr); + std::vector available_extensions(extension_count); + vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, + available_extensions.data()); + + // Create a Vulkan instance + VkInstanceCreateInfo instance_create_info = {}; + instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + // If the extension is available, enable it + std::vector enabled_extensions; + + for (const auto& extension : available_extensions) { + enabled_extensions.push_back(extension.extensionName); + } - instance_create_info.enabledExtensionCount = - static_cast(available_extensions.size()); - instance_create_info.ppEnabledExtensionNames = enabled_extensions.data(); - - VkInstance instance; - if (vkCreateInstance == nullptr || vkEnumeratePhysicalDevices == nullptr || - vkGetPhysicalDeviceProperties == nullptr || - vkDestroyInstance == nullptr || - vkGetPhysicalDeviceMemoryProperties == nullptr || - vkGetPhysicalDeviceProperties2 == nullptr) { - return cpp::fail("vulkan API is missing!"); - } + instance_create_info.enabledExtensionCount = + static_cast(available_extensions.size()); + instance_create_info.ppEnabledExtensionNames = enabled_extensions.data(); + + VkInstance instance; + if (vkCreateInstance == nullptr || vkEnumeratePhysicalDevices == nullptr || + vkGetPhysicalDeviceProperties == nullptr || + vkDestroyInstance == nullptr || + vkGetPhysicalDeviceMemoryProperties == nullptr || + vkGetPhysicalDeviceProperties2 == nullptr) { + return cpp::fail("vulkan API is missing!"); + } - VkResult result = vkCreateInstance(&instance_create_info, nullptr, &instance); - if (result != VK_SUCCESS) { - FreeLibrary(vulkan_library); - return cpp::fail("Failed to create a Vulkan instance."); - } + VkResult result = + vkCreateInstance(&instance_create_info, nullptr, &instance); + if (result != VK_SUCCESS) { + FreeLibrary(vulkan_library); + return cpp::fail("Failed to create a Vulkan instance."); + } - // Get the physical devices - uint32_t physical_device_count = 0; - result = - vkEnumeratePhysicalDevices(instance, &physical_device_count, nullptr); - if (result != VK_SUCCESS) { - vkDestroyInstance(instance, nullptr); - FreeLibrary(vulkan_library); - return cpp::fail("Failed to enumerate physical devices."); - } - std::vector physical_devices(physical_device_count); - vkEnumeratePhysicalDevices(instance, &physical_device_count, - physical_devices.data()); - - auto uuid_to_string = [](const uint8_t* device_uuid) -> std::string { - std::stringstream ss; - ss << std::hex << std::setfill('0'); - for (uint32_t i = 0; i < VK_UUID_SIZE; ++i) { - if (i == 4 || i == 6 || i == 8 || i == 10) { - ss << '-'; - } - ss << std::setw(2) << static_cast(device_uuid[i]); + // Get the physical devices + uint32_t physical_device_count = 0; + result = + vkEnumeratePhysicalDevices(instance, &physical_device_count, nullptr); + if (result != VK_SUCCESS) { + vkDestroyInstance(instance, nullptr); + FreeLibrary(vulkan_library); + return cpp::fail("Failed to enumerate physical devices."); } - return ss.str(); - }; + std::vector physical_devices(physical_device_count); + vkEnumeratePhysicalDevices(instance, &physical_device_count, + physical_devices.data()); + + auto uuid_to_string = [](const uint8_t* device_uuid) -> std::string { + std::stringstream ss; + ss << std::hex << std::setfill('0'); + for (uint32_t i = 0; i < VK_UUID_SIZE; ++i) { + if (i == 4 || i == 6 || i == 8 || i == 10) { + ss << '-'; + } + ss << std::setw(2) << static_cast(device_uuid[i]); + } + return ss.str(); + }; - std::vector gpus; + std::vector gpus; #if defined(__linux__) - auto gpus_usages = - GetGpuUsage().value_or(std::unordered_map{}); + auto gpus_usages = + GetGpuUsage().value_or(std::unordered_map{}); #elif defined(_WIN32) - auto gpus_usages = - GetGpuUsage().value_or(std::unordered_map{}); + auto gpus_usages = + GetGpuUsage().value_or(std::unordered_map{}); #endif - // Get the device properties - size_t id = 0; - for (const auto& physical_device : physical_devices) { - VkPhysicalDeviceProperties device_properties; - vkGetPhysicalDeviceProperties(physical_device, &device_properties); - - VkPhysicalDeviceIDProperties device_id_properties = {}; - VkPhysicalDeviceProperties2 device_properties2 = {}; - device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; - device_properties2.pNext = &device_id_properties; - device_id_properties.sType = - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES; - - vkGetPhysicalDeviceProperties2(physical_device, &device_properties2); - - VkPhysicalDeviceMemoryProperties memory_properties; - vkGetPhysicalDeviceMemoryProperties(physical_device, &memory_properties); - int gpu_avail_MiB = 0; - for (uint32_t i = 0; i < memory_properties.memoryHeapCount; ++i) { - if (memory_properties.memoryHeaps[i].flags & - VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) { - gpu_avail_MiB += - memory_properties.memoryHeaps[i].size / (1024ull * 1024ull); + // Get the device properties + size_t id = 0; + for (const auto& physical_device : physical_devices) { + VkPhysicalDeviceProperties device_properties; + vkGetPhysicalDeviceProperties(physical_device, &device_properties); + + VkPhysicalDeviceIDProperties device_id_properties = {}; + VkPhysicalDeviceProperties2 device_properties2 = {}; + device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + device_properties2.pNext = &device_id_properties; + device_id_properties.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES; + + vkGetPhysicalDeviceProperties2(physical_device, &device_properties2); + + VkPhysicalDeviceMemoryProperties memory_properties; + vkGetPhysicalDeviceMemoryProperties(physical_device, &memory_properties); + int gpu_avail_MiB = 0; + for (uint32_t i = 0; i < memory_properties.memoryHeapCount; ++i) { + if (memory_properties.memoryHeaps[i].flags & + VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) { + gpu_avail_MiB += + memory_properties.memoryHeaps[i].size / (1024ull * 1024ull); + } } - } - int64_t total_vram_MiB = 0; - int64_t used_vram_MiB = 0; + int64_t total_vram_MiB = 0; + int64_t used_vram_MiB = 0; #if defined(__linux__) - total_vram_MiB = gpus_usages[device_properties.deviceID].total_vram_MiB; - used_vram_MiB = gpus_usages[device_properties.deviceID].used_vram_MiB; + total_vram_MiB = gpus_usages[device_properties.deviceID].total_vram_MiB; + used_vram_MiB = gpus_usages[device_properties.deviceID].used_vram_MiB; #elif defined(_WIN32) - total_vram_MiB = gpu_avail_MiB; - used_vram_MiB = gpus_usages[device_properties.deviceName]; + total_vram_MiB = gpu_avail_MiB; + used_vram_MiB = gpus_usages[device_properties.deviceName]; #endif - int free_vram_MiB = - total_vram_MiB > used_vram_MiB ? total_vram_MiB - used_vram_MiB : 0; - gpus.emplace_back(cortex::hw::GPU{ - .id = std::to_string(id), - .device_id = device_properties.deviceID, - .name = device_properties.deviceName, - .version = std::to_string(device_properties.driverVersion), - .add_info = cortex::hw::AmdAddInfo{}, - .free_vram = free_vram_MiB, - .total_vram = total_vram_MiB, - .uuid = uuid_to_string(device_id_properties.deviceUUID), - .vendor = GetVendorStr(device_properties.vendorID)}); - id++; - } + int free_vram_MiB = + total_vram_MiB > used_vram_MiB ? total_vram_MiB - used_vram_MiB : 0; + gpus.emplace_back(cortex::hw::GPU{ + .id = std::to_string(id), + .device_id = device_properties.deviceID, + .name = device_properties.deviceName, + .version = std::to_string(device_properties.driverVersion), + .add_info = cortex::hw::AmdAddInfo{}, + .free_vram = free_vram_MiB, + .total_vram = total_vram_MiB, + .uuid = uuid_to_string(device_id_properties.deviceUUID), + .vendor = GetVendorStr(device_properties.vendorID)}); + id++; + } - // Clean up - vkDestroyInstance(instance, nullptr); - FreeLibrary(vulkan_library); - return gpus; + // Clean up + vkDestroyInstance(instance, nullptr); + + return gpus; #endif -} + } +}; } // namespace cortex::hw \ No newline at end of file diff --git a/engine/utils/hardware/gpu_info.h b/engine/utils/hardware/gpu_info.h index b9f7173fe..14096d4bb 100644 --- a/engine/utils/hardware/gpu_info.h +++ b/engine/utils/hardware/gpu_info.h @@ -9,7 +9,8 @@ namespace cortex::hw { inline std::vector GetGPUInfo() { auto nvidia_gpus = system_info_utils::GetGpuInfoList(); - auto vulkan_gpus = GetGpuInfoList().value_or(std::vector{}); + auto vulkan_gpus = VulkanGpu::GetInstance().GetGpuInfoList().value_or( + std::vector{}); auto use_vulkan_info = nvidia_gpus.empty(); // In case we have vulkan info, add more information for GPUs From 563d138a3d4beeaf94b2a3037d5c5afbcffed1a7 Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Wed, 12 Feb 2025 13:36:24 +0700 Subject: [PATCH 2/5] fix: init --- engine/utils/hardware/gpu/vulkan/vulkan_gpu.h | 77 +++++++++++++------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h index 20de5a1e8..d8349f214 100644 --- a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h +++ b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h @@ -253,27 +253,15 @@ inline int FreeLibrary(void* pLibrary) { class VulkanGpu { private: - VulkanGpu() {} + VulkanGpu() { Init(); } #if defined(__linux__) || defined(__APPLE__) void* vulkan_library = nullptr; #else HMODULE vulkan_library = nullptr; #endif + std::vector gpus_; - public: - VulkanGpu(VulkanGpu const&) = delete; - VulkanGpu& operator=(VulkanGpu const&) = delete; - ~VulkanGpu() { - if (vulkan_library) - FreeLibrary(vulkan_library); - } - - static VulkanGpu& GetInstance() { - static VulkanGpu vg; - return vg; - } - - cpp::result, std::string> GetGpuInfoList() { + bool Init() { namespace fmu = file_manager_utils; auto get_vulkan_path = [](const std::string& lib_vulkan) -> cpp::result { @@ -291,11 +279,12 @@ class VulkanGpu { }; // Load the Vulkan library #if defined(__APPLE__) && defined(__MACH__) - return std::vector{}; + return true; #elif defined(__linux__) auto vulkan_path = get_vulkan_path("libvulkan.so"); if (vulkan_path.has_error()) { - return cpp::fail(vulkan_path.error()); + LOG_INFO << vulkan_path.error(); + return false; } if (vulkan_library == nullptr) { vulkan_library = @@ -304,7 +293,8 @@ class VulkanGpu { #else auto vulkan_path = get_vulkan_path("vulkan-1.dll"); if (vulkan_path.has_error()) { - return cpp::fail(vulkan_path.error()); + LOG_WARN << vulkan_path.error(); + return false; } if (vulkan_library == nullptr) { vulkan_library = LoadLibraryW(vulkan_path.value().wstring().c_str()); @@ -313,7 +303,7 @@ class VulkanGpu { #if defined(_WIN32) || defined(_WIN64) || defined(__linux__) if (!vulkan_library) { std::cerr << "Failed to load the Vulkan library." << std::endl; - return cpp::fail("Failed to load the Vulkan library."); + return false; } // Get the function pointers for other Vulkan functions @@ -365,14 +355,16 @@ class VulkanGpu { vkDestroyInstance == nullptr || vkGetPhysicalDeviceMemoryProperties == nullptr || vkGetPhysicalDeviceProperties2 == nullptr) { - return cpp::fail("vulkan API is missing!"); + LOG_WARN << "vulkan API is missing!"; + return false; } VkResult result = vkCreateInstance(&instance_create_info, nullptr, &instance); if (result != VK_SUCCESS) { FreeLibrary(vulkan_library); - return cpp::fail("Failed to create a Vulkan instance."); + LOG_WARN << "Failed to create a Vulkan instance."; + return false; } // Get the physical devices @@ -382,7 +374,8 @@ class VulkanGpu { if (result != VK_SUCCESS) { vkDestroyInstance(instance, nullptr); FreeLibrary(vulkan_library); - return cpp::fail("Failed to enumerate physical devices."); + LOG_WARN << "Failed to enumerate physical devices."; + return false; } std::vector physical_devices(physical_device_count); vkEnumeratePhysicalDevices(instance, &physical_device_count, @@ -464,8 +457,46 @@ class VulkanGpu { // Clean up vkDestroyInstance(instance, nullptr); - return gpus; + gpus_ = gpus; +#endif + return true; + } + + public: + VulkanGpu(VulkanGpu const&) = delete; + VulkanGpu& operator=(VulkanGpu const&) = delete; + ~VulkanGpu() { + if (vulkan_library) + FreeLibrary(vulkan_library); + } + + static VulkanGpu& GetInstance() { + static VulkanGpu vg; + return vg; + } + + cpp::result, std::string> GetGpuInfoList() { + for (size_t i = 0; i < gpus_.size(); i++) { + int64_t total_vram_MiB = 0; + int64_t used_vram_MiB = 0; + +#if defined(__linux__) + auto gpus_usages = + GetGpuUsage().value_or(std::unordered_map{}); + total_vram_MiB = gpus_usages[gpus_[i].device_id].total_vram_MiB; + used_vram_MiB = gpus_usages[gpus_[i].device_id].used_vram_MiB; +#elif defined(_WIN32) + auto gpus_usages = + GetGpuUsage().value_or(std::unordered_map{}); + total_vram_MiB = gpu_avail_MiB; + used_vram_MiB = gpus_usages[device_properties.deviceName]; #endif + int free_vram_MiB = + total_vram_MiB > used_vram_MiB ? total_vram_MiB - used_vram_MiB : 0; + gpus_[i].free_vram = free_vram_MiB; + } + + return gpus_; } }; } // namespace cortex::hw \ No newline at end of file From 30368b07b2bf432d1db04edf569f55b506b6bfab Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Wed, 12 Feb 2025 14:04:54 +0700 Subject: [PATCH 3/5] fix: cpu usage --- engine/utils/hardware/cpu_info.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/engine/utils/hardware/cpu_info.h b/engine/utils/hardware/cpu_info.h index 396184fa6..4b933b886 100644 --- a/engine/utils/hardware/cpu_info.h +++ b/engine/utils/hardware/cpu_info.h @@ -16,7 +16,16 @@ inline CPU GetCPUInfo() { return CPU{}; auto cpu = res[0]; cortex::cpuid::CpuInfo inst; + +#if defined(__linux__) + float usage = 0; + for (auto const& c : res) { + usage += c.currentUtilisation(); + } + usage = usage / res.size() * 100; +#else float usage = GetCPUUsage(); +#endif // float usage = 0; return CPU{.cores = cpu.numPhysicalCores(), .arch = std::string(GetArch()), From 1a972120287c38d674b3b9a875a5bde881a7810e Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Wed, 12 Feb 2025 14:23:51 +0700 Subject: [PATCH 4/5] fix: build windows --- engine/utils/hardware/gpu/vulkan/vulkan_gpu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h index d8349f214..5ea5144a4 100644 --- a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h +++ b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h @@ -488,8 +488,8 @@ class VulkanGpu { #elif defined(_WIN32) auto gpus_usages = GetGpuUsage().value_or(std::unordered_map{}); - total_vram_MiB = gpu_avail_MiB; - used_vram_MiB = gpus_usages[device_properties.deviceName]; + total_vram_MiB = gpus_[i].free_vram; + used_vram_MiB = gpus_usages[gpus_[i].name]; #endif int free_vram_MiB = total_vram_MiB > used_vram_MiB ? total_vram_MiB - used_vram_MiB : 0; From aa0c427af8342d181bd3cbb91680d15e8978d9c7 Mon Sep 17 00:00:00 2001 From: vansangpfiev Date: Wed, 12 Feb 2025 14:43:26 +0700 Subject: [PATCH 5/5] fix: buld macos --- engine/utils/hardware/gpu/vulkan/vulkan_gpu.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h index 5ea5144a4..bf1157931 100644 --- a/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h +++ b/engine/utils/hardware/gpu/vulkan/vulkan_gpu.h @@ -466,8 +466,10 @@ class VulkanGpu { VulkanGpu(VulkanGpu const&) = delete; VulkanGpu& operator=(VulkanGpu const&) = delete; ~VulkanGpu() { +#if defined(_WIN32) || defined(_WIN64) || defined(__linux__) if (vulkan_library) FreeLibrary(vulkan_library); +#endif } static VulkanGpu& GetInstance() {