From 481f590234a22957ddde424aff9de5ca6b042fbb Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Wed, 1 Oct 2025 09:18:22 -0400 Subject: [PATCH] did some stuff in queue creation for vulkan --- .../extensions/queues/vulkan_device_queues.c | 7 ++- .../vulkan/src/instance/vulkan_instance.h | 2 - .../src/output_device/vulkan_output_device.c | 27 ++++----- .../output_device/vulkan_physical_device.c | 59 +++++++++---------- .../output_device/vulkan_physical_device.h | 1 + 5 files changed, 46 insertions(+), 50 deletions(-) diff --git a/projects/apis/vulkan/src/extensions/queues/vulkan_device_queues.c b/projects/apis/vulkan/src/extensions/queues/vulkan_device_queues.c index dd5e0fa..0d10c91 100644 --- a/projects/apis/vulkan/src/extensions/queues/vulkan_device_queues.c +++ b/projects/apis/vulkan/src/extensions/queues/vulkan_device_queues.c @@ -2,11 +2,11 @@ #include "output_device/vulkan_output_devices.h" gnReturnCode vulkanPhysicalDeviceQueueProperties(gnPhysicalDeviceHandle device, uint32_t queueFamilyCount, gnQueueFamilyProperties* queues) { - vkGetPhysicalDeviceQueueFamilyProperties(device->physicalDevice->device, &queueFamilyCount, NULL); + vkGetPhysicalDeviceQueueFamilyProperties((VkPhysicalDevice)device, &queueFamilyCount, NULL); if (queues == NULL) return GN_SUCCESS; VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); - vkGetPhysicalDeviceQueueFamilyProperties(device->physicalDevice->device, &queueFamilyCount, queueFamilies); + vkGetPhysicalDeviceQueueFamilyProperties((VkPhysicalDevice)device, &queueFamilyCount, queueFamilies); for (uint32_t i = 0; i < queueFamilyCount; i++) { queues[i].queueCount = queueFamilies[i].queueCount; @@ -21,8 +21,9 @@ gnReturnCode vulkanPhysicalDeviceQueueProperties(gnPhysicalDeviceHandle device, return GN_SUCCESS; } + void getVulkanDeviceQueue(gnOutputDevice device, uint32_t queueFamily, uint32_t queueIndex, gnQueue* queue) { VkQueue vulkanQueue; vkGetDeviceQueue(device->outputDevice->device, queueFamily, queueIndex, &vulkanQueue); - *queue = (uint64_t)vulkanQueue; + *queue = (gnQueue)vulkanQueue; } diff --git a/projects/apis/vulkan/src/instance/vulkan_instance.h b/projects/apis/vulkan/src/instance/vulkan_instance.h index 419f379..e784031 100644 --- a/projects/apis/vulkan/src/instance/vulkan_instance.h +++ b/projects/apis/vulkan/src/instance/vulkan_instance.h @@ -4,8 +4,6 @@ #include "utils/lists/gryphn_array_list.h" #include "loader/src/gryphn_instance_functions.h" -void vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice); - typedef struct vkUserData { gnDebuggerCallback debuggerCallback; void* userData; diff --git a/projects/apis/vulkan/src/output_device/vulkan_output_device.c b/projects/apis/vulkan/src/output_device/vulkan_output_device.c index ff102bd..98de9cf 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_output_device.c +++ b/projects/apis/vulkan/src/output_device/vulkan_output_device.c @@ -8,25 +8,26 @@ #include "vulkan_result_converter.h" #include "string.h" -#include "stdio.h" - gnReturnCode createVulkanOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device, gnOutputDeviceInfo deviceInfo) { device->outputDevice = malloc(sizeof(gnPlatformOutputDevice)); - device->outputDevice->physicalDevice = deviceInfo.physicalDevice->physicalDevice->device; + device->outputDevice->physicalDevice = (VkPhysicalDevice)deviceInfo.physicalDevice; int createQueueCount = 0; VkDeviceQueueCreateInfo* queueCreateInfos = NULL; if (!instance->enabledExtensions[GN_EXT_QUEUES]) { - queueCreateInfos = malloc(sizeof(VkDeviceQueueCreateInfo) * deviceInfo.physicalDevice->physicalDevice->neededQueueCount); - createQueueCount = deviceInfo.physicalDevice->physicalDevice->neededQueueCount; + uint32_t neededQueueCount; + vulkanNeededQueue* neededQueues = vulkanLoadNeededQueues(deviceInfo.physicalDevice, &neededQueueCount); + + queueCreateInfos = malloc(sizeof(VkDeviceQueueCreateInfo) * neededQueueCount); + createQueueCount = neededQueueCount; float queuePriority = 1.0f; - for (uint32_t i = 0; i < deviceInfo.physicalDevice->physicalDevice->neededQueueCount; i++) { + for (uint32_t i = 0; i < neededQueueCount; i++) { queueCreateInfos[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queueCreateInfos[i].pNext = NULL; queueCreateInfos[i].flags = 0; queueCreateInfos[i].queueCount = 1; - queueCreateInfos[i].queueFamilyIndex = deviceInfo.physicalDevice->physicalDevice->neededQueues[i].queueIndex; + queueCreateInfos[i].queueFamilyIndex = neededQueues[i].queueIndex; queueCreateInfos[i].pQueuePriorities = &queuePriority; } } else { @@ -54,7 +55,7 @@ gnReturnCode createVulkanOutputDevice(gnInstanceHandle instance, gnOutputDeviceH .pQueueCreateInfos = queueCreateInfos, .pEnabledFeatures = &deviceFeatures }; - deviceCreateInfo.ppEnabledExtensionNames = vkGetGryphnDeviceExtensions(&deviceCreateInfo.enabledExtensionCount, deviceInfo.physicalDevice->physicalDevice->device); + deviceCreateInfo.ppEnabledExtensionNames = vkGetGryphnDeviceExtensions(&deviceCreateInfo.enabledExtensionCount, (VkPhysicalDevice)deviceInfo.physicalDevice); device->outputDevice->enabledOversizedDescriptorPools = GN_FALSE; for (uint32_t i = 0; i < deviceCreateInfo.enabledExtensionCount; i++) @@ -68,17 +69,15 @@ gnReturnCode createVulkanOutputDevice(gnInstanceHandle instance, gnOutputDeviceH deviceCreateInfo.ppEnabledLayerNames = validation_layers; } - VkResult result = vkCreateDevice(deviceInfo.physicalDevice->physicalDevice->device, &deviceCreateInfo, NULL, &device->outputDevice->device); + VkResult result = vkCreateDevice((VkPhysicalDevice)deviceInfo.physicalDevice, &deviceCreateInfo, NULL, &device->outputDevice->device); if (result != VK_SUCCESS) return VkResultToGnReturnCode(result); - device->outputDevice->queues = malloc(sizeof(vulkanQueue) * deviceInfo.physicalDevice->physicalDevice->neededQueueCount); + device->outputDevice->queues = malloc(sizeof(vulkanQueue) * createQueueCount); uint32_t transferQueue = 0; gnBool foundTransferQueue = GN_FALSE, foundGraphicsQueue = GN_FALSE; - for (uint32_t i = 0; i < deviceInfo.physicalDevice->physicalDevice->neededQueueCount; i++) { - device->outputDevice->queues[i].queueInfo = deviceInfo.physicalDevice->physicalDevice->neededQueues[i]; - - vkGetDeviceQueue(device->outputDevice->device, deviceInfo.physicalDevice->physicalDevice->neededQueues[i].queueIndex, 0, &device->outputDevice->queues[i].queue); + for (uint32_t i = 0; i < createQueueCount; i++) { + vkGetDeviceQueue(device->outputDevice->device, queueCreateInfos[i].queueFamilyIndex, 0, &device->outputDevice->queues[i].queue); if ((device->outputDevice->queues[i].queueInfo.createFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT && !foundTransferQueue) { device->outputDevice->transferQueueIndex = i; transferQueue = device->outputDevice->queues[i].queueInfo.queueIndex; diff --git a/projects/apis/vulkan/src/output_device/vulkan_physical_device.c b/projects/apis/vulkan/src/output_device/vulkan_physical_device.c index 575c4cc..8d1e99d 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_physical_device.c +++ b/projects/apis/vulkan/src/output_device/vulkan_physical_device.c @@ -142,39 +142,36 @@ VkSampleCountFlags gnSampleCountToVulkan(gnSampleCountFlags counts) { return sampleCount; } -// void vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice) { -// VkPhysicalDevice device = (VkPhysicalDevice)physicalDevice; +vulkanNeededQueue* vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice, uint32_t* neededQueueCount) { + VkPhysicalDevice device = (VkPhysicalDevice)physicalDevice; + uint32_t queueFamilyCount = 0; + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, NULL); + VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies); + vulkanNeededQueue* neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount); + for (uint32_t c = 0; c < queueFamilyCount; c++) { + gnBool hasNeededQueue = GN_FALSE; + if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) + hasNeededQueue = GN_TRUE; + if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) + hasNeededQueue = GN_TRUE; -// uint32_t queueFamilyCount = 0; -// vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, NULL); -// VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); -// vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies); + if (hasNeededQueue) { + vulkanNeededQueue neededQueue = { + .queueIndex = c, + .createFlags = 0, + .usedForPresent = GN_FALSE + }; + if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT)) neededQueue.createFlags |= VK_QUEUE_GRAPHICS_BIT; + if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT)) neededQueue.createFlags |= VK_QUEUE_TRANSFER_BIT; -// device->neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount); -// for (uint32_t c = 0; c < queueFamilyCount; c++) { -// gnBool hasNeededQueue = GN_FALSE; - -// if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) -// hasNeededQueue = GN_TRUE; -// if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) -// hasNeededQueue = GN_TRUE; - -// if (hasNeededQueue) { -// vulkanNeededQueue neededQueue = { -// .queueIndex = c, -// .createFlags = 0, -// .usedForPresent = GN_FALSE -// }; -// if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT)) neededQueue.createFlags |= VK_QUEUE_GRAPHICS_BIT; -// if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT)) neededQueue.createFlags |= VK_QUEUE_TRANSFER_BIT; - -// device->neededQueues[device->neededQueueCount] = neededQueue; -// device->neededQueueCount++; -// } -// } - -// free(queueFamilies); -// } + neededQueues[*neededQueueCount] = neededQueue; + (*neededQueueCount)++; + } + } + free(queueFamilies); + return neededQueues; +} // gnBool deviceCanPresentToSurface(gnPhysicalDevice physicalDevice, gnWindowSurface surface) { diff --git a/projects/apis/vulkan/src/output_device/vulkan_physical_device.h b/projects/apis/vulkan/src/output_device/vulkan_physical_device.h index ccd137d..ebfed29 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_physical_device.h +++ b/projects/apis/vulkan/src/output_device/vulkan_physical_device.h @@ -8,6 +8,7 @@ typedef struct vulkanNeededQueue { gnBool usedForPresent; uint32_t queueIndex; } vulkanNeededQueue; +vulkanNeededQueue* vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice, uint32_t* neededQueueCount); gnPhysicalDeviceProperties vulkanQueryPhysicalDeviceProperties(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers); gnPhysicalDeviceFeatures vulkanQueryPhysicalDeviceFeatures(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers);