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; GLFWwindow *window;
VkInstance instance; VkInstance instance;
VkDebugUtilsMessengerEXT debugMessenger; VkDebugUtilsMessengerEXT debugMessenger;
VkSurfaceKHR surface;
VkPhysicalDevice physicalDevice; VkPhysicalDevice physicalDevice;
VkDevice device; VkDevice device;
VkQueue graphicsQueue; VkQueue graphicsQueue;
VkSurfaceKHR surface; VkQueue presentQueue;
} Application; } Application;
bool checkValidationLayerSupport() { bool checkValidationLayerSupport() {
@ -242,8 +243,7 @@ QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device,
VkQueueFamilyProperties queueFamilies[queueFamilyCount]; VkQueueFamilyProperties queueFamilies[queueFamilyCount];
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount,
queueFamilies); queueFamilies);
uint32_t i; for (uint32_t i = 0; i < queueFamilyCount; i++) {
for (i = 0; i < queueFamilyCount; i++) {
// Graphics support // Graphics support
if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
indices.graphicsFamily = i; indices.graphicsFamily = i;
@ -253,12 +253,14 @@ QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device,
VkBool32 presentSupport = false; VkBool32 presentSupport = false;
vkGetPhysicalDeviceSurfaceSupportKHR(device, i, *surface, &presentSupport); vkGetPhysicalDeviceSurfaceSupportKHR(device, i, *surface, &presentSupport);
if (presentSupport) { if (presentSupport) {
indices.presentFamilyExists = true;
indices.presentFamily = i; indices.presentFamily = i;
indices.presentFamilyExists = true;
} }
// Early break if we've found everything // Early break if we've found everything
if (indices.presentFamilyExists && indices.graphicsFamilyExists) { if (indices.presentFamilyExists && indices.graphicsFamilyExists) {
fprintf(stderr, "yay? %d %d\n", indices.presentFamilyExists,
indices.graphicsFamilyExists);
break; break;
} }
} }
@ -278,6 +280,7 @@ void pickPhysicalDevice(Application *app) {
uint32_t physicalDeviceCount; uint32_t physicalDeviceCount;
vkEnumeratePhysicalDevices(app->instance, &physicalDeviceCount, NULL); vkEnumeratePhysicalDevices(app->instance, &physicalDeviceCount, NULL);
if (physicalDeviceCount == 0) { if (physicalDeviceCount == 0) {
fprintf(stderr, "Failed to find GPU with vulkan support!\n");
fprintf(stderr, "Failed to find GPU with vulkan support!\n"); fprintf(stderr, "Failed to find GPU with vulkan support!\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -303,23 +306,36 @@ void pickPhysicalDevice(Application *app) {
void createLogicalDevice(Application *app) { void createLogicalDevice(Application *app) {
// Specify Queues // Specify Queues
QueueFamilyIndices indeces = findQueueFamilies(app->physicalDevice, &app->surface);
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 = {}; VkDeviceQueueCreateInfo queueCreateInfo = {};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueCreateInfo.queueFamilyIndex = indeces.graphicsFamily; queueCreateInfo.queueFamilyIndex = uniqueQueueFamilies[i];
queueCreateInfo.queueCount = 1; queueCreateInfo.queueCount = 1;
float queuePriority = 1.0f; float queuePriority = 1.0f;
queueCreateInfo.pQueuePriorities = &queuePriority; queueCreateInfo.pQueuePriorities = &queuePriority;
queueCreateInfos[i] = queueCreateInfo;
}
// Specify device features // Specify device features
VkPhysicalDeviceFeatures deviceFeatures = {VK_FALSE}; VkPhysicalDeviceFeatures deviceFeatures = {VK_FALSE};
// Specify logical device // Specify logical device
VkDeviceCreateInfo createInfo = {}; VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pQueueCreateInfos = &queueCreateInfo; createInfo.pQueueCreateInfos = queueCreateInfos;
createInfo.queueCreateInfoCount = numQueues;
createInfo.pEnabledFeatures = &deviceFeatures; createInfo.pEnabledFeatures = &deviceFeatures;
createInfo.queueCreateInfoCount = 1;
// Old Vulkan specify layers // Old Vulkan specify layers
createInfo.enabledLayerCount = 0; createInfo.enabledLayerCount = 0;