diff --git a/Hello_triangle/.gitignore b/Hello_triangle/.gitignore new file mode 100644 index 0000000..aa6623a --- /dev/null +++ b/Hello_triangle/.gitignore @@ -0,0 +1,3 @@ +.vscode +bin + diff --git a/Hello_triangle/Makefile b/Hello_triangle/Makefile index 92c7f60..2e84e5f 100644 --- a/Hello_triangle/Makefile +++ b/Hello_triangle/Makefile @@ -2,12 +2,12 @@ CFLAGS = -std=c++17 -O2 LDFLAGS = -lglfw3 -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi VulkanTest: main.cpp - g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS) + g++ $(CFLAGS) -o ./bin/VulkanTest main.cpp $(LDFLAGS) .PHONY: test clean test: VulkanTest - ./VulkanTest + ./bin/VulkanTest clean: rm -f VulkanTest diff --git a/Hello_triangle/VulkanTest b/Hello_triangle/VulkanTest deleted file mode 100755 index ad5442c..0000000 Binary files a/Hello_triangle/VulkanTest and /dev/null differ diff --git a/Hello_triangle/main.cpp b/Hello_triangle/main.cpp index 9c53d10..8513e1d 100644 --- a/Hello_triangle/main.cpp +++ b/Hello_triangle/main.cpp @@ -1,7 +1,6 @@ /* Following the vulkan tutorial on : - https://vulkan-tutorial.com/en/Drawing_a_triangle/Setup/Instance - + https://vulkan-tutorial.com/en/Drawing_a_triangle/Presentation/Window_surface */ #define GLFW_INCLUDE_VULKAN @@ -12,8 +11,7 @@ #include #include #include - - + const uint32_t WIDTH = 800; const uint32_t HEIGHT = 600; @@ -45,6 +43,9 @@ class HelloTriangleApplication{ VkInstance instance; VkDebugUtilsMessengerEXT debugMessenger; VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; + VkDevice device; + VkQueue graphicsQueue; + void initWindow(){ glfwInit(); @@ -59,8 +60,49 @@ class HelloTriangleApplication{ createInstance(); setupDebugMessenger(); pickPhysicalDevice(); + createLogicalDevice(); + } + + 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; + + float queuePriority = 1.0f; + queueCreateInfo.pQueuePriorities = &queuePriority; + + VkPhysicalDeviceFeatures deviceFeatures{}; + + + VkDeviceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + createInfo.queueCreateInfoCount = 1; + createInfo.pEnabledFeatures = &deviceFeatures; + + createInfo.enabledExtensionCount = 0; + if(enableValidationLayers){ + createInfo.enabledLayerCount = static_cast(validationLayers.size()); + createInfo.ppEnabledLayerNames = validationLayers.data(); + } else{ + createInfo.enabledLayerCount = 0 ; + } + + if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS){ + throw std::runtime_error("failed to create logical device"); + } + + + vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0 , &graphicsQueue); + + } + + + void pickPhysicalDevice(){ uint32_t deviceCount = 0; vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr); @@ -255,6 +297,7 @@ class HelloTriangleApplication{ } void cleanup(){ + vkDestroyDevice(device, nullptr); if(enableValidationLayers){ DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr); }