Moved RenderDriver/WindorDriver init code to static create functions

This commit is contained in:
2025-04-08 18:24:33 +10:00
parent 286dd0fb0e
commit 608af1b866
9 changed files with 44 additions and 65 deletions

View File

@@ -26,9 +26,10 @@ set(ENGINE_SRC
drivers/wayland/window_driver.cpp drivers/wayland/window_driver.cpp
drivers/win32/window_driver.cpp drivers/win32/window_driver.cpp
drivers/x11/window_driver.cpp drivers/x11/window_driver.cpp
platform/system.cpp platform/window_driver.cpp
render/renderer.cpp render/renderer.cpp
render/render_device.cpp render/render_device.cpp
render/render_driver.cpp
) )
list(TRANSFORM ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/) list(TRANSFORM ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/)

View File

@@ -1,19 +0,0 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#pragma once
#include <nova/api.h>
#include <nova/platform/window_driver.h>
namespace Nova {
class NOVA_API System {
public:
static void init();
static void shutdown();
static WindowDriver* get_driver();
};
} // namespace Nova

View File

@@ -7,7 +7,6 @@
#pragma once #pragma once
#include <nova/api.h> #include <nova/api.h>
#include <nova/render/render_driver.h>
#include <nova/types.h> #include <nova/types.h>
#include <string_view> #include <string_view>
@@ -17,6 +16,7 @@ namespace Nova {
class NOVA_API WindowDriver { class NOVA_API WindowDriver {
public: public:
static WindowDriver* create();
virtual ~WindowDriver() = default; virtual ~WindowDriver() = default;
virtual void poll_events() = 0; virtual void poll_events() = 0;

View File

@@ -7,6 +7,7 @@
#pragma once #pragma once
#include <nova/api.h> #include <nova/api.h>
#include <nova/platform/window_driver.h>
#include <nova/render/render_api.h> #include <nova/render/render_api.h>
#include <nova/render/render_device.h> #include <nova/render/render_device.h>
#include <nova/types.h> #include <nova/types.h>
@@ -16,6 +17,7 @@
namespace Nova { namespace Nova {
class NOVA_API RenderDriver { class NOVA_API RenderDriver {
public: public:
static RenderDriver* create(RenderAPI api, WindowDriver* window_driver = nullptr);
virtual ~RenderDriver() = default; virtual ~RenderDriver() = default;
[[nodiscard]] virtual RenderAPI get_api() const = 0; [[nodiscard]] virtual RenderAPI get_api() const = 0;

View File

@@ -9,7 +9,6 @@
#include "drivers/vulkan/render_driver.h" #include "drivers/vulkan/render_driver.h"
#include <nova/core/debug.h> #include <nova/core/debug.h>
#include <nova/platform/system.h>
#include <nova/version.h> #include <nova/version.h>
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
@@ -20,7 +19,7 @@
using namespace Nova; using namespace Nova;
VulkanRenderDriver::VulkanRenderDriver() { VulkanRenderDriver::VulkanRenderDriver(WindowDriver* window_driver) : m_window_driver(window_driver) {
NOVA_AUTO_TRACE(); NOVA_AUTO_TRACE();
_check_version(); _check_version();
_check_extensions(); _check_extensions();
@@ -118,7 +117,7 @@ void VulkanRenderDriver::_check_extensions() {
u32 count; u32 count;
std::unordered_map<std::string_view, bool> requested; // <extension, required> std::unordered_map<std::string_view, bool> requested; // <extension, required>
const auto surface_extension = System::get_driver()->get_surface_extension(); const auto surface_extension = m_window_driver->get_surface_extension();
if (!surface_extension) { if (!surface_extension) {
throw std::runtime_error("Could not determine required surface extension"); throw std::runtime_error("Could not determine required surface extension");
} }

View File

@@ -16,7 +16,7 @@
namespace Nova { namespace Nova {
class VulkanRenderDriver final : public RenderDriver { class VulkanRenderDriver final : public RenderDriver {
public: public:
VulkanRenderDriver(); VulkanRenderDriver(WindowDriver* window_driver);
~VulkanRenderDriver() override; ~VulkanRenderDriver() override;
[[nodiscard]] RenderAPI get_api() const override; [[nodiscard]] RenderAPI get_api() const override;
@@ -29,6 +29,7 @@ namespace Nova {
void create_device(u32 index) override; void create_device(u32 index) override;
private: private:
WindowDriver* m_window_driver = nullptr;
VkInstance m_instance = VK_NULL_HANDLE; VkInstance m_instance = VK_NULL_HANDLE;
VkPhysicalDevice m_physical_device = VK_NULL_HANDLE; VkPhysicalDevice m_physical_device = VK_NULL_HANDLE;
VkDevice m_device = VK_NULL_HANDLE; VkDevice m_device = VK_NULL_HANDLE;

View File

@@ -9,31 +9,23 @@
#include "drivers/x11/window_driver.h" // IWYU pragma: keep #include "drivers/x11/window_driver.h" // IWYU pragma: keep
#include <nova/core/debug.h> #include <nova/core/debug.h>
#include <nova/platform/system.h> #include <nova/platform/window_driver.h>
#include <memory>
using namespace Nova; using namespace Nova;
static std::unique_ptr<WindowDriver> s_driver; WindowDriver* WindowDriver::create() {
void System::init() {
NOVA_AUTO_TRACE(); NOVA_AUTO_TRACE();
NOVA_ASSERT(!s_driver);
#ifdef NOVA_WINDOWS #ifdef NOVA_WINDOWS
s_driver = std::make_unique<WindowsSystemDriver>(); return new Win32WindowDriver();
#elif NOVA_LINUX #elif NOVA_LINUX
#ifdef NOVA_WAYLAND #ifdef NOVA_WAYLAND
if (std::getenv("WAYLAND_DISPLAY")) { if (std::getenv("WAYLAND_DISPLAY")) {
s_driver = std::make_unique<WaylandWindowDriver>(); return new WaylandWindowDriver();
return;
} }
#endif #endif
#ifdef NOVA_X11 #ifdef NOVA_X11
if (std::getenv("DISPLAY")) { if (std::getenv("DISPLAY")) {
s_driver = std::make_unique<X11WindowDriver>(); return new X11WindowDriver();
return;
} }
#endif #endif
throw std::runtime_error("No suitable display server found"); throw std::runtime_error("No suitable display server found");
@@ -41,13 +33,3 @@ void System::init() {
throw std::runtime_error("Unsupported platform"); throw std::runtime_error("Unsupported platform");
#endif #endif
} }
void System::shutdown() {
NOVA_AUTO_TRACE();
s_driver.reset();
}
WindowDriver* System::get_driver() {
NOVA_ASSERT(s_driver);
return s_driver.get();
}

View File

@@ -0,0 +1,29 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* 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 <nova/core/debug.h>
#include <nova/render/render_driver.h>
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");
}
}

View File

@@ -4,9 +4,6 @@
* SPDX-License-Identifier: BSD-3-Clause * 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 <nova/core/debug.h> #include <nova/core/debug.h>
#include <nova/render/renderer.h> #include <nova/render/renderer.h>
@@ -20,20 +17,7 @@ void Renderer::init(const RenderAPI api) {
NOVA_AUTO_TRACE(); NOVA_AUTO_TRACE();
NOVA_ASSERT(!s_driver); NOVA_ASSERT(!s_driver);
switch (api) { s_driver = std::unique_ptr<RenderDriver>(RenderDriver::create(api, nullptr));
#ifdef NOVA_DX12
case RenderAPI::DX12:
s_driver = std::make_unique<DX12RenderDriver>();
break;
#endif
#ifdef NOVA_VULKAN
case RenderAPI::VULKAN:
s_driver = std::make_unique<VulkanRenderDriver>();
break;
#endif
default:
throw std::runtime_error("Unsupported render API");
}
} }
void Renderer::shutdown() { void Renderer::shutdown() {