Almost got the present family queue working (check todo)
This commit is contained in:
parent
4a40ed5d90
commit
7f9a0d91a2
1 changed files with 29 additions and 13 deletions
32
src/main.c
32
src/main.c
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue