Almost got the present family queue working (check todo)

This commit is contained in:
Warwick New 2024-12-16 16:22:30 +00:00
parent 4a40ed5d90
commit 7f9a0d91a2

View file

@ -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;