From b8e236d680bde7a705c96499ef14f74fff3b985f Mon Sep 17 00:00:00 2001 From: Nigel Barink Date: Thu, 4 May 2023 23:02:42 +0200 Subject: [PATCH] Creating a window surface --- Hello_triangle/main.cpp | 67 ++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/Hello_triangle/main.cpp b/Hello_triangle/main.cpp index 4112365..b81a8a9 100644 --- a/Hello_triangle/main.cpp +++ b/Hello_triangle/main.cpp @@ -11,14 +11,14 @@ #include #include #include - +#include + + const uint32_t WIDTH = 800; const uint32_t HEIGHT = 600; const std::vector validationLayers ={ - //"VK_LAYER_KHRONOS_validation" - - "VK_LAYER_LUNARG_standard_validation" + "VK_LAYER_KHRONOS_validation" }; #ifdef NDEBUG @@ -42,10 +42,11 @@ class HelloTriangleApplication{ GLFWwindow* window; VkInstance instance; VkDebugUtilsMessengerEXT debugMessenger; + VkSurfaceKHR surface; VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; VkDevice device; VkQueue graphicsQueue; - + VkQueue presentQueue; void initWindow(){ glfwInit(); @@ -59,30 +60,46 @@ class HelloTriangleApplication{ void initVulkan(){ createInstance(); setupDebugMessenger(); + createSurface(); pickPhysicalDevice(); createLogicalDevice(); } + void createSurface() { + if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) { + throw std::runtime_error("failed ot create window surface!"); + } + } + void createLogicalDevice(){ QueueFamilyIndices indices = findQueueFamilies(physicalDevice); - VkDeviceQueueCreateInfo queueCreateInfo {}; - queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queueCreateInfo.queueFamilyIndex = indices.graphicsFamily.value(); - queueCreateInfo.queueCount = 1; + + std::vectorqueueCreateInfos; + std::set uniqueQueueFamilies = { indices.graphicsFamily.value(), indices.presentFamily.value() }; float queuePriority = 1.0f; - queueCreateInfo.pQueuePriorities = &queuePriority; + for (uint32_t queueFamily : uniqueQueueFamilies) { + VkDeviceQueueCreateInfo queueCreateInfo{}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + queueCreateInfo.queueFamilyIndex = queueFamily; + queueCreateInfo.queueCount = 1; + queueCreateInfo.pQueuePriorities = &queuePriority; + queueCreateInfos.push_back(queueCreateInfo); + } + VkPhysicalDeviceFeatures deviceFeatures{}; VkDeviceCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - createInfo.pQueueCreateInfos = &queueCreateInfo; - createInfo.queueCreateInfoCount = 1; + + createInfo.queueCreateInfoCount = static_cast(queueCreateInfos.size()); + createInfo.pQueueCreateInfos = queueCreateInfos.data(); + createInfo.pEnabledFeatures = &deviceFeatures; createInfo.enabledExtensionCount = 0; @@ -99,11 +116,9 @@ class HelloTriangleApplication{ vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0 , &graphicsQueue); - + vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue); } - - void pickPhysicalDevice(){ uint32_t deviceCount = 0; vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr); @@ -142,9 +157,10 @@ class HelloTriangleApplication{ struct QueueFamilyIndices { std::optional graphicsFamily; + std::optional presentFamily; bool isComplete(){ - return graphicsFamily.has_value(); + return graphicsFamily.has_value() && presentFamily.has_value(); } }; @@ -158,8 +174,20 @@ class HelloTriangleApplication{ std::vector queueFamilies(queueFamilyCount); vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); + + int i = 0; for (const auto& queueFamily : queueFamilies){ + + + VkBool32 presentSupport = false; + vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); + + if (presentSupport) { + indices.presentFamily = i; + } + + if(queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT){ indices.graphicsFamily = i; } @@ -174,9 +202,6 @@ class HelloTriangleApplication{ return indices; } - - - VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) { auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); if (func != nullptr) { @@ -186,7 +211,6 @@ class HelloTriangleApplication{ } } - void setupDebugMessenger(){ if(!enableValidationLayers) return; @@ -303,6 +327,8 @@ class HelloTriangleApplication{ DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr); } + + vkDestroySurfaceKHR(instance, surface, nullptr); vkDestroyInstance(instance, nullptr); @@ -339,7 +365,6 @@ class HelloTriangleApplication{ }; - int main ( ) { HelloTriangleApplication app;