Moved RenderDriver/WindorDriver init code to static create functions
This commit is contained in:
@@ -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/)
|
||||
|
||||
@@ -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
|
||||
@@ -7,7 +7,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <nova/api.h>
|
||||
#include <nova/render/render_driver.h>
|
||||
#include <nova/types.h>
|
||||
|
||||
#include <string_view>
|
||||
@@ -17,6 +16,7 @@ namespace Nova {
|
||||
|
||||
class NOVA_API WindowDriver {
|
||||
public:
|
||||
static WindowDriver* create();
|
||||
virtual ~WindowDriver() = default;
|
||||
|
||||
virtual void poll_events() = 0;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <nova/api.h>
|
||||
#include <nova/platform/window_driver.h>
|
||||
#include <nova/render/render_api.h>
|
||||
#include <nova/render/render_device.h>
|
||||
#include <nova/types.h>
|
||||
@@ -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;
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "drivers/vulkan/render_driver.h"
|
||||
|
||||
#include <nova/core/debug.h>
|
||||
#include <nova/platform/system.h>
|
||||
#include <nova/version.h>
|
||||
#include <vulkan/vulkan.h>
|
||||
|
||||
@@ -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<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) {
|
||||
throw std::runtime_error("Could not determine required surface extension");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -9,31 +9,23 @@
|
||||
#include "drivers/x11/window_driver.h" // IWYU pragma: keep
|
||||
|
||||
#include <nova/core/debug.h>
|
||||
#include <nova/platform/system.h>
|
||||
|
||||
#include <memory>
|
||||
#include <nova/platform/window_driver.h>
|
||||
|
||||
using namespace Nova;
|
||||
|
||||
static std::unique_ptr<WindowDriver> s_driver;
|
||||
|
||||
void System::init() {
|
||||
WindowDriver* WindowDriver::create() {
|
||||
NOVA_AUTO_TRACE();
|
||||
NOVA_ASSERT(!s_driver);
|
||||
|
||||
#ifdef NOVA_WINDOWS
|
||||
s_driver = std::make_unique<WindowsSystemDriver>();
|
||||
return new Win32WindowDriver();
|
||||
#elif NOVA_LINUX
|
||||
#ifdef NOVA_WAYLAND
|
||||
if (std::getenv("WAYLAND_DISPLAY")) {
|
||||
s_driver = std::make_unique<WaylandWindowDriver>();
|
||||
return;
|
||||
return new WaylandWindowDriver();
|
||||
}
|
||||
#endif
|
||||
#ifdef NOVA_X11
|
||||
if (std::getenv("DISPLAY")) {
|
||||
s_driver = std::make_unique<X11WindowDriver>();
|
||||
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();
|
||||
}
|
||||
29
engine/src/render/render_driver.cpp
Normal file
29
engine/src/render/render_driver.cpp
Normal 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");
|
||||
}
|
||||
}
|
||||
@@ -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 <nova/core/debug.h>
|
||||
#include <nova/render/renderer.h>
|
||||
|
||||
@@ -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<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");
|
||||
}
|
||||
s_driver = std::unique_ptr<RenderDriver>(RenderDriver::create(api, nullptr));
|
||||
}
|
||||
|
||||
void Renderer::shutdown() {
|
||||
|
||||
Reference in New Issue
Block a user