diff --git a/projects/apis/vulkan/src/extensions/queues/vulkan_device_queues.c b/projects/apis/vulkan/src/extensions/queues/vulkan_device_queues.c new file mode 100644 index 0000000..38aed06 --- /dev/null +++ b/projects/apis/vulkan/src/extensions/queues/vulkan_device_queues.c @@ -0,0 +1,23 @@ +#include +#include "extensions/queues/gryphn_physcial_device_queue.h" + +gnReturnCode vulkanPhysicalDeviceQueueProperties(gnPhysicalOutputDeviceHandle device, uint32_t queueFamilyCount, gnQueueFamilyProperties* queues) { + vkGetPhysicalDeviceQueueFamilyProperties(device->physicalDevice->device, &queueFamilyCount, NULL); + if (queues == NULL) return GN_SUCCESS; + + VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(device->physicalDevice->device, &queueFamilyCount, queueFamilies); + + for (int i = 0; i < queueFamilyCount; i++) { + queues[i].queueCount = queueFamilies[i].queueCount; + queues[i].queueTypeFlags = 0; + + if ((queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) queues[i].queueTypeFlags |= GN_QUEUE_GRAPHICS_BIT; + if ((queueFamilies[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == VK_QUEUE_COMPUTE_BIT) queues[i].queueTypeFlags |= GN_QUEUE_COMPUTE_BIT; + if ((queueFamilies[i].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) queues[i].queueTypeFlags |= GN_QUEUE_TRANSFER_BIT; + if ((queueFamilies[i].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) == VK_QUEUE_SPARSE_BINDING_BIT) queues[i].queueTypeFlags |= GN_QUEUE_SPARSE_BINDING_BIT; + if ((queueFamilies[i].queueFlags & VK_QUEUE_PROTECTED_BIT) == VK_QUEUE_PROTECTED_BIT) queues[i].queueTypeFlags |= GN_QUEUE_PROTECTED_BIT; + } + + return GN_SUCCESS; +} 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 b52e451..4784d86 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_physical_device.c +++ b/projects/apis/vulkan/src/output_device/vulkan_physical_device.c @@ -31,6 +31,43 @@ VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts) { return sampleCount; } +void vulkanLoadNeededQueues(VkPhysicalDevice vulkanDevice, gnPhysicalDevice gryphnDevice) { + uint32_t queueFamilyCount = 0; + vkGetPhysicalDeviceQueueFamilyProperties(vulkanDevice, &queueFamilyCount, NULL); + VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(vulkanDevice, &queueFamilyCount, queueFamilies); + + gryphnDevice->physicalDevice->neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount); + gnBool foundGraphicsQueueFamily = gnFalse, foundTransferQueueFamily = gnFalse; + for (int c = 0; c < queueFamilyCount; c++) { + gnBool hasNeededQueue = gnFalse; + + if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) { + foundGraphicsQueueFamily = true; + hasNeededQueue = gnTrue; + } + if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) { + foundTransferQueueFamily = true; + hasNeededQueue = gnTrue; + } + + if (hasNeededQueue) { + vulkanNeededQueue neededQueue = { + .queueIndex = c, + .createFlags = 0, + .usedForPresent = gnFalse + }; + 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; + + gryphnDevice->physicalDevice->neededQueues[gryphnDevice->physicalDevice->neededQueueCount] = neededQueue; + gryphnDevice->physicalDevice->neededQueueCount++; + } + } + + free(queueFamilies); +} + gnPhysicalDevice* getPhysicalDevices(gnInstanceHandle instance, uint32_t* deviceCount) { vkEnumeratePhysicalDevices(instance->instance->vk_instance, deviceCount, NULL); if (deviceCount == 0) @@ -57,38 +94,9 @@ gnPhysicalDevice* getPhysicalDevices(gnInstanceHandle instance, uint32_t* device case VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM: outputDevices[i]->properties.deviceType = GN_INTEGRATED_DEVICE; } - uint32_t queueFamilyCount = 0; - vkGetPhysicalDeviceQueueFamilyProperties(physicalDevices[i], &queueFamilyCount, NULL); - VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount); - vkGetPhysicalDeviceQueueFamilyProperties(physicalDevices[i], &queueFamilyCount, queueFamilies); + if (instance->enabledExtensions[GN_EXT_QUEUES] == gnFalse) + vulkanLoadNeededQueues(physicalDevices[i], outputDevices[i]); - outputDevices[i]->physicalDevice->neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount); - gnBool foundGraphicsQueueFamily = gnFalse, foundTransferQueueFamily = gnFalse; - for (int c = 0; c < queueFamilyCount; c++) { - gnBool hasNeededQueue = gnFalse; - - if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) { - foundGraphicsQueueFamily = true; - hasNeededQueue = gnTrue; - } - if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) { - foundTransferQueueFamily = true; - hasNeededQueue = gnTrue; - } - - if (hasNeededQueue) { - vulkanNeededQueue neededQueue = { - .queueIndex = c, - .createFlags = 0, - .usedForPresent = gnFalse - }; - 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; - - outputDevices[i]->physicalDevice->neededQueues[outputDevices[i]->physicalDevice->neededQueueCount] = neededQueue; - outputDevices[i]->physicalDevice->neededQueueCount++; - } - } VkPhysicalDeviceProperties physicalDeviceProperties; vkGetPhysicalDeviceProperties(physicalDevices[i], &physicalDeviceProperties); @@ -96,8 +104,6 @@ gnPhysicalDevice* getPhysicalDevices(gnInstanceHandle instance, uint32_t* device outputDevices[i]->features.maxDepthSamples = vkSampleCountToGryphn(physicalDeviceProperties.limits.framebufferDepthSampleCounts); outputDevices[i]->features.maxMemoryAllocations = physicalDeviceProperties.limits.maxMemoryAllocationCount; outputDevices[i]->features.maxPushConstantSize = physicalDeviceProperties.limits.maxPushConstantsSize; - - free(queueFamilies); } free(physicalDevices); diff --git a/projects/core/gryphn_extensions.h b/projects/core/gryphn_extensions.h index ba37c3a..1f6d4cd 100644 --- a/projects/core/gryphn_extensions.h +++ b/projects/core/gryphn_extensions.h @@ -1,6 +1,7 @@ #pragma once -#include "stdint.h" -typedef uint32_t gnExtension; -#define GN_EXT_SYNCHRONIZATION 0 -#define GN_EXT_QUEUES 1 +typedef enum gnExtension { + GN_EXT_SYNCHRONIZATION = 0, + GN_EXT_QUEUES = 1, + GN_EXT_MAX +} gnExtension; diff --git a/projects/core/src/gryphn_handles.h b/projects/core/src/gryphn_handles.h index 5985e22..8dc141b 100644 --- a/projects/core/src/gryphn_handles.h +++ b/projects/core/src/gryphn_handles.h @@ -1,6 +1,8 @@ #pragma once +#include #define GN_NULL_HANDLE 0 +typedef uint32_t gnFlags; #define GN_HANDLE(type) \ typedef struct type##_t* type##Handle; \ diff --git a/projects/core/src/instance/gryphn_instance.c b/projects/core/src/instance/gryphn_instance.c index d9f2d46..12d97ef 100644 --- a/projects/core/src/instance/gryphn_instance.c +++ b/projects/core/src/instance/gryphn_instance.c @@ -14,10 +14,10 @@ gnReturnCode gnCreateInstance(gnInstanceHandle* instance, gnInstanceInfo info) { .layerToLoad = api_layer })); - // TODO: still needs to check to see if the extension is supported - for (int i = 0; i < info.extensionCount; i++) { - if (info.extensions[i] == GN_EXT_SYNCHRONIZATION) (*instance)->layers.data[0].syncFunctions = loadAPISyncFunctions(info.renderingAPI); - } + for (int c = 0; c < GN_EXT_MAX; c++) (*instance)->enabledExtensions[c] = gnFalse; + for (int i = 0; i < info.extensionCount; i++) (*instance)->enabledExtensions[info.extensions[i]] = gnTrue; + + if ((*instance)->enabledExtensions[GN_EXT_SYNCHRONIZATION]) (*instance)->layers.data[0].syncFunctions = loadAPISyncFunctions(info.renderingAPI); gnBool loaderFunctionChecker = gnFalse; if (info.debugger != NULL) { diff --git a/projects/core/src/instance/gryphn_instance.h b/projects/core/src/instance/gryphn_instance.h index 96f0d51..8277cf0 100644 --- a/projects/core/src/instance/gryphn_instance.h +++ b/projects/core/src/instance/gryphn_instance.h @@ -30,6 +30,8 @@ struct gnInstance_t { loaderLayer* callingLayer; uint32_t currentLayer; + gnBool enabledExtensions[GN_EXT_MAX]; + gnBool hasDebugger; gnDebuggerInfo debugger; }; diff --git a/projects/core/src/output_device/gryphn_physical_output_device.c b/projects/core/src/output_device/gryphn_physical_output_device.c index 49a8ebf..fc0789d 100644 --- a/projects/core/src/output_device/gryphn_physical_output_device.c +++ b/projects/core/src/output_device/gryphn_physical_output_device.c @@ -14,41 +14,3 @@ gnBool gnPhysicalDeviceCanPresentToSurface(gnPhysicalOutputDeviceHandle device, gnPhysicalDeviceProperties gnGetPhysicalDeviceProperties(gnPhysicalOutputDeviceHandle device) { return device->properties; } gnPhysicalDeviceFeatures gnGetPhysicalDeviceFeatures(gnPhysicalOutputDeviceHandle device) { return device->features; } - -// gnBool gnHasGraphicsQueue(gnPhysicalDevice device) { -// for (int i = 0; i < device->queueProperties.queueCount; i++) { -// if ((device->queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) == GN_QUEUE_GRAPHICS) { -// return gnTrue; -// } -// } -// return gnFalse; -// } -// gnBool gnHasPresentQueue(gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface) { -// for (int i = 0; i < device->queueProperties.queueCount; i++) { -// if (gnQueueCanPresentToSurface(device, i, windowSurface)) { -// return gnTrue; -// } -// } -// return gnFalse; -// } - -// int gnGetGraphicsQueueIndex(gnPhysicalDevice device) { -// for (int i = 0; i < device->queueProperties.queueCount; i++) { -// if ((device->queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) == GN_QUEUE_GRAPHICS) { -// return i; -// break; -// } -// } -// return -1; -// } -// int gnGetPresentQueueIndex(gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface) { -// for (int i = 0; i < device->queueProperties.queueCount; i++) { -// if (gnQueueCanPresentToSurface(device, i, windowSurface)) { -// return i; -// break; -// } -// } -// return -1; -// } - -// gnPhysicalDeviceQueueProperties gnGetPhysicalDeviceQueueProperties(gnPhysicalOutputDeviceHandle device) { return device->queueProperties; } diff --git a/projects/core/src/output_device/gryphn_physical_output_device.h b/projects/core/src/output_device/gryphn_physical_output_device.h index 91a1910..d8e3372 100644 --- a/projects/core/src/output_device/gryphn_physical_output_device.h +++ b/projects/core/src/output_device/gryphn_physical_output_device.h @@ -28,29 +28,11 @@ typedef struct gnPhysicalDeviceFeatures { uint32_t maxPushConstantSize; } gnPhysicalDeviceFeatures; -// typedef enum gnQueueTypeFlags { -// GN_QUEUE_GRAPHICS = 1 << 0, -// GN_QUEUE_COMPUTE = 1 << 1, -// GN_QUEUE_TRANSFER = 1 << 2, -// GN_QUEUE_SPARSE_BINDING = 1 << 3 -// } gnQueueTypeFlags; - -// typedef struct gnQueueProperties { -// uint32_t queueCount; -// gnQueueTypeFlags queueType; -// } gnQueueProperties; - -// typedef struct gnPhysicalDeviceQueueProperties { -// uint32_t queueCount; -// gnQueueProperties* queueProperties; -// } gnPhysicalDeviceQueueProperties; - #ifdef GN_REVEAL_IMPL typedef struct gnPhysicalOutputDevice_t { struct gnPlatformPhysicalDevice_t* physicalDevice; gnPhysicalDeviceProperties properties; gnPhysicalDeviceFeatures features; - // gnPhysicalDeviceQueueProperties queueProperties; gnInstanceHandle instance; } gnPhysicalOutputDevice_t; @@ -61,10 +43,3 @@ gnBool gnPhysicalDeviceCanPresentToSurface(gnPhysicalOutputDeviceHandle device, gnPhysicalDeviceProperties gnGetPhysicalDeviceProperties(gnPhysicalOutputDeviceHandle device); gnPhysicalDeviceFeatures gnGetPhysicalDeviceFeatures(gnPhysicalOutputDeviceHandle device); -// gnPhysicalDeviceQueueProperties gnGetPhysicalDeviceQueueProperties(gnPhysicalOutputDeviceHandle device); - -// gnBool gnHasGraphicsQueue(gnPhysicalOutputDeviceHandle device); -// gnBool gnHasPresentQueue(gnPhysicalOutputDeviceHandle device, gnWindowSurfaceHandle windowSurface); - -// int gnGetGraphicsQueueIndex(gnPhysicalOutputDeviceHandle device); -// int gnGetPresentQueueIndex(gnPhysicalOutputDeviceHandle device, gnWindowSurfaceHandle windowSurface); diff --git a/projects/extensions/queues/gryphn_physcial_device_queue.h b/projects/extensions/queues/gryphn_physcial_device_queue.h new file mode 100644 index 0000000..b83769c --- /dev/null +++ b/projects/extensions/queues/gryphn_physcial_device_queue.h @@ -0,0 +1,19 @@ +#pragma once +#include "utils/gryphn_error_code.h" +#include "gryphn_handles.h" + +typedef enum gnQueueTypeBits { + GN_QUEUE_GRAPHICS_BIT = 1 << 0, + GN_QUEUE_COMPUTE_BIT = 1 << 1, + GN_QUEUE_TRANSFER_BIT = 1 << 2, + GN_QUEUE_SPARSE_BINDING_BIT = 1 << 3, + GN_QUEUE_PROTECTED_BIT = 1 << 4 +} gnQueueTypeBits; +typedef gnFlags gnQueueTypeFlags; + +typedef struct gnQueueFamilyProperties { + uint32_t queueCount; + gnQueueTypeFlags queueTypeFlags; +} gnQueueFamilyProperties; + +gnReturnCode gnGetPhysicalDeviceQueueProperties(gnPhysicalOutputDeviceHandle device, uint32_t queueCount, gnQueueFamilyProperties* queues);