diff --git a/CMakeLists.txt b/CMakeLists.txt index 8780340..979f592 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(VulkanRenderer src/managers/GLFWManager.cpp src/managers/VulkanManager.cpp src/managers/VulkanManager.h + src/VulkanRenderer.h ) # Links the libraries to the binary # diff --git a/main.cpp b/main.cpp index 98320a2..d3b86bf 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,22 @@ +#include "src/VulkanRenderer.h" + #include "src/managers/GLFWManager.h" #include "src/managers/VulkanManager.h" +namespace PB::Renderer +{ + void CleanupAllAndExit() + { + if (!GLFWManager::Cleanup()) + std::exit(EXIT_FAILURE); + + if (VulkanManager::Cleanup()) + std::exit(EXIT_FAILURE); + + std::exit(EXIT_SUCCESS); + } +} + int main() { using namespace PB::Renderer; // Project namespace @@ -13,13 +29,19 @@ int main() if (!window) return -1; - /* Creates the Vulkan instance */ + /* Creates the Vulkan instance and surface */ if (std::optional instance = VulkanManager::Init(); !instance) { GLFWManager::Cleanup(); return -1; } + if (std::optional surface = VulkanManager::CreateSurface(window); !surface) + { + CleanupAllAndExit(); + return -1; + } + /* Polls window events whilst it is still open */ while (!glfwWindowShouldClose(window)) { @@ -27,6 +49,5 @@ int main() } /* Cleans up GLFW and Vulkan */ - if (!GLFWManager::Cleanup() || !VulkanManager::Cleanup()) - return -1; + CleanupAllAndExit(); } diff --git a/src/VulkanRenderer.h b/src/VulkanRenderer.h new file mode 100644 index 0000000..deb073b --- /dev/null +++ b/src/VulkanRenderer.h @@ -0,0 +1,14 @@ +#pragma once + +/* Includes dependencies */ + +#include + +#define GLFW_INCLUDE_VULKAN +#include + +/* Commonly used C++ STD files */ + +#include +#include +#include diff --git a/src/managers/GLFWManager.cpp b/src/managers/GLFWManager.cpp index 597fe2f..a25a096 100644 --- a/src/managers/GLFWManager.cpp +++ b/src/managers/GLFWManager.cpp @@ -1,7 +1,5 @@ #include "GLFWManager.h" -#include - namespace PB::Renderer { std::vector GLFWManager::s_Windows; diff --git a/src/managers/GLFWManager.h b/src/managers/GLFWManager.h index 5f9a6a0..2d4b7d0 100644 --- a/src/managers/GLFWManager.h +++ b/src/managers/GLFWManager.h @@ -1,8 +1,6 @@ #pragma once -#include "GLFW/glfw3.h" - -#include +#include "../VulkanRenderer.h" namespace PB::Renderer { diff --git a/src/managers/VulkanManager.cpp b/src/managers/VulkanManager.cpp index 0719cca..23c5231 100644 --- a/src/managers/VulkanManager.cpp +++ b/src/managers/VulkanManager.cpp @@ -1,12 +1,9 @@ #include "VulkanManager.h" -#include - -#include "GLFW/glfw3.h" - namespace PB::Renderer { std::optional VulkanManager::s_Instance = std::nullopt; + std::optional VulkanManager::s_Surface = std::nullopt; std::optional VulkanManager::Init() { @@ -48,8 +45,23 @@ namespace PB::Renderer return instance; } + std::optional VulkanManager::CreateSurface(GLFWwindow* window) + { + VkSurfaceKHR surface; + if (glfwCreateWindowSurface(s_Instance.value(), window, nullptr, &surface) != VK_SUCCESS) + { + std::cout << "PB::Renderer::VulkanManager::CreateSurface(): Failed to create Vulkan Surface" << std::endl; + return std::nullopt; + } + + return surface; + } + bool VulkanManager::Cleanup() { + if (s_Surface != std::nullopt) + vkDestroySurfaceKHR(s_Instance.value(), s_Surface.value(), nullptr); + if (s_Instance != std::nullopt) vkDestroyInstance(s_Instance.value(), nullptr); diff --git a/src/managers/VulkanManager.h b/src/managers/VulkanManager.h index 3f54532..0d604d2 100644 --- a/src/managers/VulkanManager.h +++ b/src/managers/VulkanManager.h @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include "../VulkanRenderer.h" namespace PB::Renderer { @@ -9,9 +8,12 @@ namespace PB::Renderer { private: static std::optional s_Instance; + static std::optional s_Surface; public: static std::optional Init(); static bool Cleanup(); + + static std::optional CreateSurface(GLFWwindow* window); }; }