diff --git a/src/emulator.h b/src/emulator.h index bcb9e775..8d34ef67 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -2,8 +2,8 @@ #include #include #include -#include +#include namespace Emulator { @@ -18,7 +18,9 @@ struct VulkanExt { struct VulkanSurfaceCapabilities {}; -struct VulkanQueues {}; +struct VulkanQueues { + u32 family_count = 0; +}; struct WindowCtx { HLE::Libs::Graphics::GraphicCtx m_graphic_ctx; diff --git a/src/vulkan_util.cpp b/src/vulkan_util.cpp index 6c191496..9552332d 100644 --- a/src/vulkan_util.cpp +++ b/src/vulkan_util.cpp @@ -4,6 +4,7 @@ #include #include #include +#include constexpr bool log_file_vulkanutil = true; // disable it to disable logging @@ -103,5 +104,41 @@ void Graphics::Vulkan::vulkanFindCompatiblePhysicalDevice(VkInstance instance, V Emulator::VulkanQueues found_best_queues; for (const auto& device : devices) { + + VkPhysicalDeviceProperties device_properties{}; + VkPhysicalDeviceFeatures2 device_features2{}; + + vkGetPhysicalDeviceProperties(device, &device_properties); + vkGetPhysicalDeviceFeatures2(device, &device_features2); + if (device_properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU) { + continue; // we don't want integrated gpu for now .Later we will check the requirements and see what we can support (TODO fix me) + } + LOG_INFO_IF(log_file_vulkanutil,"Vulkan device: {}\n", device_properties.deviceName); + + auto qs = vulkanFindQueues(device, surface); } } + +Emulator::VulkanQueues Graphics::Vulkan::vulkanFindQueues(VkPhysicalDevice device, VkSurfaceKHR surface) { + Emulator::VulkanQueues qs; + + u32 queue_family_count = 0; + vkGetPhysicalDeviceQueueFamilyProperties(device, &queue_family_count, nullptr); + std::vector queue_families(queue_family_count); + vkGetPhysicalDeviceQueueFamilyProperties(device, &queue_family_count, queue_families.data()); + + qs.family_count = queue_family_count; + + u32 family = 0; + for (auto& f : queue_families) { + VkBool32 presentation_supported = VK_FALSE; + vkGetPhysicalDeviceSurfaceSupportKHR(device, family, surface, &presentation_supported); + + LOG_INFO_IF(log_file_vulkanutil, "queue family: {}, count = {}, present = {}\n", string_VkQueueFlags(f.queueFlags).c_str(), f.queueCount, + (presentation_supported == VK_TRUE ? "true" : "false")); + + family++; + } + + return qs; +} diff --git a/src/vulkan_util.h b/src/vulkan_util.h index a7299118..995edefc 100644 --- a/src/vulkan_util.h +++ b/src/vulkan_util.h @@ -12,4 +12,5 @@ void vulkanCreate(Emulator::WindowCtx* ctx); void vulkanGetInstanceExtensions(Emulator::VulkanExt* ext); void vulkanFindCompatiblePhysicalDevice(VkInstance instance, VkSurfaceKHR surface, const std::vector& device_extensions, Emulator::VulkanSurfaceCapabilities* out_capabilities, VkPhysicalDevice* out_device, Emulator::VulkanQueues* out_queues); +Emulator::VulkanQueues vulkanFindQueues(VkPhysicalDevice device, VkSurfaceKHR surface); }; // namespace Graphics::Vulkan \ No newline at end of file