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/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/)
|
||||||
|
|||||||
@@ -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
|
#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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
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
|
* 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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user