From e8406a9d64fc7b1c69da36f7e1a61c606cbe6a7b Mon Sep 17 00:00:00 2001 From: Sebastian Gaida <gaida@ca-digit.com> Date: Tue, 24 Aug 2021 12:01:27 +0200 Subject: [PATCH] [#89] create Window and Swapchain Manager --- config/Sources.cmake | 6 +++ include/vkcv/SwapchainManager.hpp | 41 ++++++++++++++++++ include/vkcv/WindowManager.hpp | 47 ++++++++++++++++++++ src/vkcv/SwapchainManager.cpp | 36 ++++++++++++++++ src/vkcv/WindowManager.cpp | 71 +++++++++++++++++++++++++++++++ 5 files changed, 201 insertions(+) create mode 100644 include/vkcv/SwapchainManager.hpp create mode 100644 include/vkcv/WindowManager.hpp create mode 100644 src/vkcv/SwapchainManager.cpp create mode 100644 src/vkcv/WindowManager.cpp diff --git a/config/Sources.cmake b/config/Sources.cmake index 41cd0c20..66068e64 100644 --- a/config/Sources.cmake +++ b/config/Sources.cmake @@ -75,6 +75,12 @@ set(vkcv_sources ${vkcv_source}/vkcv/SamplerManager.hpp ${vkcv_source}/vkcv/SamplerManager.cpp + + ${vkcv_include}/vkcv/WindowManager.hpp + ${vkcv_source}/vkcv/WindowManager.cpp + + ${vkcv_include}/vkcv/SwapchainManager.hpp + ${vkcv_source}/vkcv/SwapchainManager.cpp ${vkcv_include}/vkcv/DescriptorWrites.hpp diff --git a/include/vkcv/SwapchainManager.hpp b/include/vkcv/SwapchainManager.hpp new file mode 100644 index 00000000..197bbc73 --- /dev/null +++ b/include/vkcv/SwapchainManager.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include <vector> +#include <GLFW/glfw3.h> + +#include "vkcv/WindowManager.hpp" +#include "vkcv/Swapchain.hpp" +#include "vkcv/Handles.hpp" + +namespace vkcv { + class Core; + + class SwapchainManager { + friend class Core; + + friend class WindowManager; + + private: + + void destroySwapchainById(uint64_t id); + + public: + SwapchainManager() noexcept; + + ~SwapchainManager() noexcept; + + SwapchainManager(SwapchainManager &&other) = delete; + + SwapchainManager(const SwapchainManager &other) = delete; + + SwapchainManager &operator=(SwapchainManager &&other) = delete; + + SwapchainManager &operator=(const SwapchainManager &other) = delete; + + SwapchainHandle createSwapchain(Window &window, Context &context); + + [[nodiscard]] + Swapchain &getSwapchain(const SwapchainHandle handle) const; + + }; +} \ No newline at end of file diff --git a/include/vkcv/WindowManager.hpp b/include/vkcv/WindowManager.hpp new file mode 100644 index 00000000..3fe66ade --- /dev/null +++ b/include/vkcv/WindowManager.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include <vector> +#include <GLFW/glfw3.h> + +#include "vkcv/Window.hpp" +#include "vkcv/Handles.hpp" + +namespace vkcv { + class Core; + + class WindowManager { + friend class Core; + + private: + + void destroyWindowById(uint64_t id); + + public: + WindowManager() noexcept; + + ~WindowManager() noexcept; + + WindowManager(WindowManager &&other) = delete; + + WindowManager(const WindowManager &other) = delete; + + WindowManager &operator=(WindowManager &&other) = delete; + + WindowManager &operator=(const WindowManager &other) = delete; + + WindowHandle createWindow(Core &core, const char *applicationName, uint32_t windowWidth, uint32_t windowHeight, + bool resizeable); + + [[nodiscard]] + Window &getWindow(const WindowHandle handle) const; + + /** + * Forwards the event poll to "vkcv/Window.hpp" + */ + static void pollEvents(); + + static bool hasOpenWindow(); + + static const Window getFocusedWindow(); + }; +} \ No newline at end of file diff --git a/src/vkcv/SwapchainManager.cpp b/src/vkcv/SwapchainManager.cpp new file mode 100644 index 00000000..b97a645e --- /dev/null +++ b/src/vkcv/SwapchainManager.cpp @@ -0,0 +1,36 @@ +#include <vkcv/SwapchainManager.hpp> + +namespace vkcv { + static std::vector<Swapchain> m_swapchains; + + SwapchainManager::SwapchainManager() noexcept { + } + + SwapchainManager::~SwapchainManager() noexcept { + for (uint64_t id = 0; id < m_swapchains.size(); id++) { + destroySwapchainById(id); + } + m_swapchains.clear(); + } + + [[maybe_unused]] SwapchainHandle SwapchainManager::createSwapchain(Window &window, Context &context) { + const uint64_t id = m_swapchains.size(); + + Swapchain swapchain = Swapchain::create(window, context); + + m_swapchains.push_back(swapchain); + return SwapchainHandle(id, [&](uint64_t id) { destroySwapchainById(id); }); + } + + Swapchain &SwapchainManager::getSwapchain(const SwapchainHandle handle) const { + return m_swapchains[handle.getId()]; + } + + void SwapchainManager::destroySwapchainById(uint64_t id) { + + if (id >= m_swapchains.size()) { + vkcv_log(LogLevel::ERROR, "Invalid id"); + return; + } + } +} \ No newline at end of file diff --git a/src/vkcv/WindowManager.cpp b/src/vkcv/WindowManager.cpp new file mode 100644 index 00000000..73d98266 --- /dev/null +++ b/src/vkcv/WindowManager.cpp @@ -0,0 +1,71 @@ +#include "vkcv/WindowManager.hpp" +#include "vkcv/Core.hpp" + +namespace vkcv { + static std::vector<Window> m_windows; + + WindowManager::WindowManager() noexcept { + } + + WindowManager::~WindowManager() noexcept { + for (uint64_t id = 0; id < m_windows.size(); id++) { + destroyWindowById(id); + } + m_windows.clear(); + } + + WindowHandle WindowManager::createWindow( + Core &core, + const char *applicationName, + uint32_t windowWidth, + uint32_t windowHeight, + bool resizeable) { + const uint64_t id = m_windows.size(); + + vkcv::Window window = vkcv::Window(applicationName, windowWidth, windowHeight, resizeable); + + Swapchain swapChain = Swapchain::create(window, core.getContext()); + + if (resizeable) { + window.e_resize.add([&](int width, int height) { + // m_swapchain.signalSwapchainRecreation(); // swapchain signal + }); + } + + m_windows.push_back(window); + return WindowHandle(id, [&](uint64_t id) { destroyWindowById(id); }); + } + + Window &WindowManager::getWindow(const WindowHandle handle) const { + return m_windows[handle.getId()]; + } + + void WindowManager::destroyWindowById(uint64_t id) { + + if (id >= m_windows.size()) { + vkcv_log(LogLevel::ERROR, "Invalid id"); + return; + } + + Window &window = m_windows[id]; + window.destroyWindow(); + m_windows[id] = nullptr; + } + + void WindowManager::pollEvents() { + Window::pollEvents(); + } + + bool WindowManager::hasOpenWindow() { + for (auto &window : m_windows) { + if (window.isOpen()) { + return true; + } + } + return false; + } + + const Window WindowManager::getFocusedWindow() { + return Window::getFocusedWindow(); + } +} \ No newline at end of file -- GitLab