From 7f9a0d91a20b2e7bd3512d73a851100b4a3a7e07 Mon Sep 17 00:00:00 2001 From: Warwick New Date: Mon, 16 Dec 2024 16:22:30 +0000 Subject: [PATCH] Almost got the present family queue working (check todo) --- src/main.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main.c b/src/main.c index 5749c26..da40df5 100644 --- a/src/main.c +++ b/src/main.c @@ -35,10 +35,11 @@ typedef struct Application { GLFWwindow *window; VkInstance instance; VkDebugUtilsMessengerEXT debugMessenger; + VkSurfaceKHR surface; VkPhysicalDevice physicalDevice; VkDevice device; VkQueue graphicsQueue; - VkSurfaceKHR surface; + VkQueue presentQueue; } Application; bool checkValidationLayerSupport() { @@ -242,8 +243,7 @@ QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device, VkQueueFamilyProperties queueFamilies[queueFamilyCount]; vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies); - uint32_t i; - for (i = 0; i < queueFamilyCount; i++) { + for (uint32_t i = 0; i < queueFamilyCount; i++) { // Graphics support if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { indices.graphicsFamily = i; @@ -253,12 +253,14 @@ QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device, VkBool32 presentSupport = false; vkGetPhysicalDeviceSurfaceSupportKHR(device, i, *surface, &presentSupport); if (presentSupport) { - indices.presentFamilyExists = true; indices.presentFamily = i; + indices.presentFamilyExists = true; } // Early break if we've found everything if (indices.presentFamilyExists && indices.graphicsFamilyExists) { + fprintf(stderr, "yay? %d %d\n", indices.presentFamilyExists, + indices.graphicsFamilyExists); break; } } @@ -278,6 +280,7 @@ void pickPhysicalDevice(Application *app) { uint32_t physicalDeviceCount; vkEnumeratePhysicalDevices(app->instance, &physicalDeviceCount, NULL); if (physicalDeviceCount == 0) { + fprintf(stderr, "Failed to find GPU with vulkan support!\n"); fprintf(stderr, "Failed to find GPU with vulkan support!\n"); exit(EXIT_FAILURE); } @@ -303,13 +306,26 @@ void pickPhysicalDevice(Application *app) { void createLogicalDevice(Application *app) { // Specify Queues - QueueFamilyIndices indeces = findQueueFamilies(app->physicalDevice, &app->surface); - VkDeviceQueueCreateInfo queueCreateInfo = {}; - queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queueCreateInfo.queueFamilyIndex = indeces.graphicsFamily; - queueCreateInfo.queueCount = 1; - float queuePriority = 1.0f; - queueCreateInfo.pQueuePriorities = &queuePriority; + + QueueFamilyIndices indeces = + findQueueFamilies(app->physicalDevice, &app->surface); + + //TODO: stop duplicate queue indeces occurring in this array (A set would be so handy rn) + uint32_t uniqueQueueFamilies[] = {indeces.graphicsFamily, + indeces.presentFamily}; + size_t numQueues = sizeof(uniqueQueueFamilies) / sizeof(uint32_t); + VkDeviceQueueCreateInfo queueCreateInfos[numQueues]; + + for (uint i = 0; i < numQueues; i++) { + VkDeviceQueueCreateInfo queueCreateInfo = {}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfo.queueFamilyIndex = uniqueQueueFamilies[i]; + queueCreateInfo.queueCount = 1; + float queuePriority = 1.0f; + queueCreateInfo.pQueuePriorities = &queuePriority; + + queueCreateInfos[i] = queueCreateInfo; + } // Specify device features VkPhysicalDeviceFeatures deviceFeatures = {VK_FALSE}; @@ -317,9 +333,9 @@ void createLogicalDevice(Application *app) { // Specify logical device VkDeviceCreateInfo createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - createInfo.pQueueCreateInfos = &queueCreateInfo; + createInfo.pQueueCreateInfos = queueCreateInfos; + createInfo.queueCreateInfoCount = numQueues; createInfo.pEnabledFeatures = &deviceFeatures; - createInfo.queueCreateInfoCount = 1; // Old Vulkan specify layers createInfo.enabledLayerCount = 0;