create graphics queue for vulkan

This commit is contained in:
Gregory Wells
2026-05-25 14:09:02 -04:00
parent 0eff3c62ee
commit fb2aa8504f
3 changed files with 44 additions and 10 deletions
+4 -4
View File
@@ -1,8 +1,8 @@
#pragma once
typedef enum gnReturnCode {
GN_SUCCESS,
GN_FAILED_TO_FIND_LIBARY,
GN_UNSUPPORTED_BACKEND,
GN_EXTENSION_NOT_PRESENT
GN_SUCCESS = 0,
GN_FAILED_TO_FIND_LIBARY = 1,
GN_UNSUPPORTED_BACKEND = 2,
GN_EXTENSION_NOT_PRESENT = 3
} gnReturnCode;
+33 -6
View File
@@ -7,6 +7,7 @@
#include <string.h>
#include <stdio.h>
#include <vulkan/vulkan_core.h>
#include "vulkan_device.h"
gnPhysicalDeviceType vulkanDeviceTypeToGryphnDeviceType(VkPhysicalDeviceType type) {
switch (type) {
@@ -58,6 +59,7 @@ gnReturnCode vulkanGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysic
}
gnReturnCode vulkanCreateDevice(gnInstance instance, gnDeviceCreateInfo* info, gnDevice device) {
// create a list of the vulkan extentions to enable from gryphn extententions
const char** extensions = malloc(sizeof(const char*) * info->enabledExtensionCount);
int realEnabledExtensionCount = 0;
for (int i = 0; i < info->enabledExtensionCount; i++) {
@@ -69,6 +71,27 @@ gnReturnCode vulkanCreateDevice(gnInstance instance, gnDeviceCreateInfo* info, g
}
}
// find queue familes for managment (ive decided that gryphn will manage vulkan queues for you cuz fuck queue manangment)
uint32_t graphicsFamily;
uint32_t queueFamilyCount = 0;
vkGetPhysicalDeviceQueueFamilyProperties(info->physicalDevice->internalData, &queueFamilyCount, NULL);
VkQueueFamilyProperties* queueFamilyProperties = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount);
vkGetPhysicalDeviceQueueFamilyProperties(info->physicalDevice->internalData, &queueFamilyCount, queueFamilyProperties);
for (int i = 0; i < queueFamilyCount; i++)
if ((queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT)
graphicsFamily = i;
float queuePriority = 1.0f;
VkDeviceQueueCreateInfo graphicsQueueCreateInfo = {
.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
.pNext = NULL,
.flags = 0,
.queueFamilyIndex = graphicsFamily,
.queueCount = 1,
.pQueuePriorities = &queuePriority
};
VkPhysicalDeviceFeatures deviceFeatures = {
};
@@ -77,22 +100,26 @@ gnReturnCode vulkanCreateDevice(gnInstance instance, gnDeviceCreateInfo* info, g
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
.pNext = NULL,
.flags = 0,
.queueCreateInfoCount = 0,
.pQueueCreateInfos = NULL,
.queueCreateInfoCount = 1,
.pQueueCreateInfos = (VkDeviceQueueCreateInfo[]){ graphicsQueueCreateInfo },
.enabledExtensionCount = realEnabledExtensionCount,
.ppEnabledExtensionNames = extensions,
.pEnabledFeatures = &deviceFeatures,
};
VkDevice vulkanDevice;
VkResult result = vkCreateDevice(info->physicalDevice->internalData, &createInfo, NULL, &vulkanDevice);
device->internalData = vulkanDevice;
VkDevice vkDevice;
VkResult result = vkCreateDevice(info->physicalDevice->internalData, &createInfo, NULL, &vkDevice);
device->internalData = malloc(sizeof(vulkanDevice));
((vulkanDevice*)device->internalData)->device = vkDevice;
vkGetDeviceQueue(vkDevice, graphicsFamily, 0, &((vulkanDevice*)device->internalData)->graphicsQueue);
device->dispatchTable.destroyDevice = vulkanDestroyDevice;
free(extensions);
return vulkanCodeToGryphnCode(result);
}
gnReturnCode vulkanDestroyDevice(gnDevice device) {
vkDestroyDevice(device->internalData, NULL);
vkDestroyDevice(((vulkanDevice*)device->internalData)->device, NULL);
free(device->internalData);
return GN_SUCCESS;
}
@@ -0,0 +1,7 @@
#pragma once
#include <vulkan/vulkan_core.h>
typedef struct vulkanDevice {
VkDevice device;
VkQueue graphicsQueue;
} vulkanDevice;