From 608af1b866602141794eef3511fd0cd05a5b8d6f Mon Sep 17 00:00:00 2001 From: Jayden Grubb Date: Tue, 8 Apr 2025 18:24:33 +1000 Subject: [PATCH] Moved RenderDriver/WindorDriver init code to static create functions --- engine/CMakeLists.txt | 3 +- engine/include/nova/platform/system.h | 19 ------------ engine/include/nova/platform/window_driver.h | 2 +- engine/include/nova/render/render_driver.h | 2 ++ engine/src/drivers/vulkan/render_driver.cpp | 5 ++-- engine/src/drivers/vulkan/render_driver.h | 3 +- .../{system.cpp => window_driver.cpp} | 28 ++++-------------- engine/src/render/render_driver.cpp | 29 +++++++++++++++++++ engine/src/render/renderer.cpp | 18 +----------- 9 files changed, 44 insertions(+), 65 deletions(-) delete mode 100644 engine/include/nova/platform/system.h rename engine/src/platform/{system.cpp => window_driver.cpp} (58%) create mode 100644 engine/src/render/render_driver.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index d9e8bf8..d9bc8db 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -26,9 +26,10 @@ set(ENGINE_SRC drivers/wayland/window_driver.cpp drivers/win32/window_driver.cpp drivers/x11/window_driver.cpp - platform/system.cpp + platform/window_driver.cpp render/renderer.cpp render/render_device.cpp + render/render_driver.cpp ) list(TRANSFORM ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/) diff --git a/engine/include/nova/platform/system.h b/engine/include/nova/platform/system.h deleted file mode 100644 index bd2231e..0000000 --- a/engine/include/nova/platform/system.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2025, Jayden Grubb - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#pragma once - -#include -#include - -namespace Nova { - class NOVA_API System { - public: - static void init(); - static void shutdown(); - static WindowDriver* get_driver(); - }; -} // namespace Nova diff --git a/engine/include/nova/platform/window_driver.h b/engine/include/nova/platform/window_driver.h index 55542d4..ecec94b 100644 --- a/engine/include/nova/platform/window_driver.h +++ b/engine/include/nova/platform/window_driver.h @@ -7,7 +7,6 @@ #pragma once #include -#include #include #include @@ -17,6 +16,7 @@ namespace Nova { class NOVA_API WindowDriver { public: + static WindowDriver* create(); virtual ~WindowDriver() = default; virtual void poll_events() = 0; diff --git a/engine/include/nova/render/render_driver.h b/engine/include/nova/render/render_driver.h index b0a8dea..18d9a0b 100644 --- a/engine/include/nova/render/render_driver.h +++ b/engine/include/nova/render/render_driver.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -16,6 +17,7 @@ namespace Nova { class NOVA_API RenderDriver { public: + static RenderDriver* create(RenderAPI api, WindowDriver* window_driver = nullptr); virtual ~RenderDriver() = default; [[nodiscard]] virtual RenderAPI get_api() const = 0; diff --git a/engine/src/drivers/vulkan/render_driver.cpp b/engine/src/drivers/vulkan/render_driver.cpp index 2836adc..904ca8c 100644 --- a/engine/src/drivers/vulkan/render_driver.cpp +++ b/engine/src/drivers/vulkan/render_driver.cpp @@ -9,7 +9,6 @@ #include "drivers/vulkan/render_driver.h" #include -#include #include #include @@ -20,7 +19,7 @@ using namespace Nova; -VulkanRenderDriver::VulkanRenderDriver() { +VulkanRenderDriver::VulkanRenderDriver(WindowDriver* window_driver) : m_window_driver(window_driver) { NOVA_AUTO_TRACE(); _check_version(); _check_extensions(); @@ -118,7 +117,7 @@ void VulkanRenderDriver::_check_extensions() { u32 count; std::unordered_map requested; // - const auto surface_extension = System::get_driver()->get_surface_extension(); + const auto surface_extension = m_window_driver->get_surface_extension(); if (!surface_extension) { throw std::runtime_error("Could not determine required surface extension"); } diff --git a/engine/src/drivers/vulkan/render_driver.h b/engine/src/drivers/vulkan/render_driver.h index 187b6a5..ebdbae6 100644 --- a/engine/src/drivers/vulkan/render_driver.h +++ b/engine/src/drivers/vulkan/render_driver.h @@ -16,7 +16,7 @@ namespace Nova { class VulkanRenderDriver final : public RenderDriver { public: - VulkanRenderDriver(); + VulkanRenderDriver(WindowDriver* window_driver); ~VulkanRenderDriver() override; [[nodiscard]] RenderAPI get_api() const override; @@ -29,6 +29,7 @@ namespace Nova { void create_device(u32 index) override; private: + WindowDriver* m_window_driver = nullptr; VkInstance m_instance = VK_NULL_HANDLE; VkPhysicalDevice m_physical_device = VK_NULL_HANDLE; VkDevice m_device = VK_NULL_HANDLE; diff --git a/engine/src/platform/system.cpp b/engine/src/platform/window_driver.cpp similarity index 58% rename from engine/src/platform/system.cpp rename to engine/src/platform/window_driver.cpp index 56f22fa..c6ba380 100644 --- a/engine/src/platform/system.cpp +++ b/engine/src/platform/window_driver.cpp @@ -9,31 +9,23 @@ #include "drivers/x11/window_driver.h" // IWYU pragma: keep #include -#include - -#include +#include using namespace Nova; -static std::unique_ptr s_driver; - -void System::init() { +WindowDriver* WindowDriver::create() { NOVA_AUTO_TRACE(); - NOVA_ASSERT(!s_driver); - #ifdef NOVA_WINDOWS - s_driver = std::make_unique(); + return new Win32WindowDriver(); #elif NOVA_LINUX #ifdef NOVA_WAYLAND if (std::getenv("WAYLAND_DISPLAY")) { - s_driver = std::make_unique(); - return; + return new WaylandWindowDriver(); } #endif #ifdef NOVA_X11 if (std::getenv("DISPLAY")) { - s_driver = std::make_unique(); - return; + return new X11WindowDriver(); } #endif throw std::runtime_error("No suitable display server found"); @@ -41,13 +33,3 @@ void System::init() { throw std::runtime_error("Unsupported platform"); #endif } - -void System::shutdown() { - NOVA_AUTO_TRACE(); - s_driver.reset(); -} - -WindowDriver* System::get_driver() { - NOVA_ASSERT(s_driver); - return s_driver.get(); -} diff --git a/engine/src/render/render_driver.cpp b/engine/src/render/render_driver.cpp new file mode 100644 index 0000000..7bfff84 --- /dev/null +++ b/engine/src/render/render_driver.cpp @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "drivers/dx12/render_driver.h" // IWYU pragma: keep +#include "drivers/vulkan/render_driver.h" // IWYU pragma: keep + +#include +#include + +using namespace Nova; + +RenderDriver* RenderDriver::create(RenderAPI api, WindowDriver* window_driver) { + NOVA_AUTO_TRACE(); + switch (api) { +#ifdef NOVA_DX12 + case RenderAPI::DX12: + return new DX12RenderDriver(); +#endif +#ifdef NOVA_VULKAN + case RenderAPI::VULKAN: + return new VulkanRenderDriver(window_driver); +#endif + default: + throw std::runtime_error("Unsupported render API"); + } +} diff --git a/engine/src/render/renderer.cpp b/engine/src/render/renderer.cpp index 4ffd81a..31ade66 100644 --- a/engine/src/render/renderer.cpp +++ b/engine/src/render/renderer.cpp @@ -4,9 +4,6 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include "drivers/dx12/render_driver.h" // IWYU pragma: keep -#include "drivers/vulkan/render_driver.h" // IWYU pragma: keep - #include #include @@ -20,20 +17,7 @@ void Renderer::init(const RenderAPI api) { NOVA_AUTO_TRACE(); NOVA_ASSERT(!s_driver); - switch (api) { -#ifdef NOVA_DX12 - case RenderAPI::DX12: - s_driver = std::make_unique(); - break; -#endif -#ifdef NOVA_VULKAN - case RenderAPI::VULKAN: - s_driver = std::make_unique(); - break; -#endif - default: - throw std::runtime_error("Unsupported render API"); - } + s_driver = std::unique_ptr(RenderDriver::create(api, nullptr)); } void Renderer::shutdown() {