From 56fb7bf1139251020300554b9dd92e74809dc27d Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Thu, 19 Jan 2023 10:36:26 +0000 Subject: [PATCH] first vulkan + glfw window --- .gitignore | 1 + README.md | 2 +- main | Bin 42865 -> 0 bytes main.cpp | 128 +++++++++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 112 insertions(+), 19 deletions(-) delete mode 100755 main diff --git a/.gitignore b/.gitignore index 259148f..139e668 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +main # Prerequisites *.d diff --git a/README.md b/README.md index 02726dc..edfad05 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,5 @@ Install VulkanSDK: https://vulkan.lunarg.com/ brew install glfw glm export VULKAN_SDK=$HOME/path/to/your/VulkanSDK/1.3.236.0 -make +make run ``` diff --git a/main b/main deleted file mode 100755 index 142a19b49d8dd302d7c9f2d11b7c65e6627f9acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42865 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 diff --git a/main.cpp b/main.cpp index e7335bc..bcc5a70 100644 --- a/main.cpp +++ b/main.cpp @@ -1,35 +1,127 @@ +#include #define GLFW_INCLUDE_VULKAN #include -#define GLM_FORCE_RADIANS -#define GLM_FORCE_DEPTH_ZERO_TO_ONE -#include -#include - +#include #include +#include +#include -int main() { +class HelloTriangleApplication { +public: + void run() { + initWindow(); + initVulkan(); + mainLoop(); + cleanup(); + } + +private: + GLFWwindow* window; + + VkInstance instance; + + const uint32_t WIDTH = 800; + const uint32_t HEIGHT = 600; + + void initWindow() { glfwInit(); - glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr); + glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); - uint32_t extensionCount = 0; - vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); + window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr); + } - std::cout << extensionCount << " extensions supported\n"; + void createInstance() { + VkApplicationInfo appInfo{}; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pApplicationName = "Hello Triangle"; + appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.pEngineName = "No Engine"; + appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.apiVersion = VK_API_VERSION_1_0; - glm::mat4 matrix; - glm::vec4 vec; - auto test = matrix * vec; + VkInstanceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + createInfo.pApplicationInfo = &appInfo; - while(!glfwWindowShouldClose(window)) { - glfwPollEvents(); + std::vector requiredExtensions; + + uint32_t glfwExtensionCount = 0; + const char** glfwExtensions; + + // Enable glfw extensions + glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); + + for (uint32_t i = 0; i < glfwExtensionCount; i++) { + requiredExtensions.emplace_back(glfwExtensions[i]); } + // Enable Portability Enumeration extension (required for macOS) + requiredExtensions.emplace_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + + createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + + createInfo.enabledExtensionCount = (uint32_t) requiredExtensions.size(); + createInfo.ppEnabledExtensionNames = requiredExtensions.data(); + createInfo.enabledLayerCount = 0; + + VkResult result = vkCreateInstance(&createInfo, nullptr, &instance); + if (result != VK_SUCCESS) { + std::cout << "error creating instance: " << result << std::endl; + throw std::runtime_error("failed to create instance!"); + } + + std::cout << "Created instance" << std::endl; + + // Check for available extensions + uint32_t extensionCount = 0; + vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); + std::vector extensions(extensionCount); + + vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.data()); + + std::cout << "available extensions:" << std::endl; + for (const auto& extension : extensions) { + std::cout << '\t' << extension.extensionName; + for (const char* required : requiredExtensions) { + if (strcmp(required, extension.extensionName) == 0) { + std::cout << " *"; + } + } + + std::cout << std::endl; + } + } + + void initVulkan() { + createInstance(); + } + + void mainLoop() { + while (!glfwWindowShouldClose(window)) { + glfwPollEvents(); + } + } + + void cleanup() { + vkDestroyInstance(instance, nullptr); + glfwDestroyWindow(window); - glfwTerminate(); + } +}; - return 0; + +int main() { + HelloTriangleApplication app; + + try { + app.run(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; }