Moved RenderDriver/WindorDriver init code to static create functions
This commit is contained in:
@@ -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