Add basic Renderer and RenderDriver classes

This commit is contained in:
2025-02-12 00:59:07 +10:00
parent 5f718ff966
commit 3009a4c6d9
9 changed files with 186 additions and 23 deletions

View File

@@ -4,8 +4,22 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
#include <nova/test.h> #include <nova/render/renderer.h>
#include <cstdio>
#include <cstdlib>
using namespace Nova;
int main() { int main() {
func(); Renderer::create(RenderAPI::VULKAN);
const auto api = Renderer::get_driver()->get_api();
const auto version = Renderer::get_driver()->get_api_version();
printf("API: %d\n", static_cast<u32>(api));
printf("Version: %d\n", version);
Renderer::shutdown();
return EXIT_SUCCESS;
} }

View File

@@ -1,11 +1,15 @@
# Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com> # Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
set(SRC find_package(Vulkan REQUIRED)
test.cpp include(FetchContent)
set(ENGINE_SRC
drivers/vulkan/render_driver.cpp
render/renderer.cpp
) )
list(TRANSFORM SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/) list(TRANSFORM ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/)
include_directories( include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -13,12 +17,22 @@ include_directories(
${Vulkan_INCLUDE_DIRS} ${Vulkan_INCLUDE_DIRS}
) )
set(ENGINE_LIBS
Vulkan::Vulkan
)
if (NOVA_ENGINE_SHARED) if (NOVA_ENGINE_SHARED)
add_library(nova SHARED ${SRC}) add_library(nova SHARED ${ENGINE_SRC})
target_compile_definitions(nova PRIVATE target_compile_definitions(nova PRIVATE
NOVA_DLL_EXPORT NOVA_DLL_EXPORT
) )
target_link_libraries(nova PRIVATE
${ENGINE_LIBS}
)
endif () endif ()
if (NOVA_ENGINE_STATIC) if (NOVA_ENGINE_STATIC)
add_library(nova_static STATIC ${SRC}) add_library(nova_static STATIC ${ENGINE_SRC})
target_link_libraries(nova_static PRIVATE
${ENGINE_LIBS}
)
endif () endif ()

View File

@@ -6,6 +6,6 @@
#pragma once #pragma once
#include <nova/api.h> namespace Nova {
enum class RenderAPI { VULKAN };
NOVA_API void func(); } // namespace Nova

View File

@@ -0,0 +1,21 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#pragma once
#include <nova/api.h>
#include <nova/render/render_api.h>
#include <nova/types.h>
namespace Nova {
class NOVA_API RenderDriver {
public:
virtual ~RenderDriver() = default;
[[nodiscard]] virtual RenderAPI get_api() const = 0;
[[nodiscard]] virtual u32 get_api_version() const = 0;
};
} // namespace Nova

View File

@@ -0,0 +1,29 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#pragma once
#include <nova/api.h>
#include <nova/render/render_api.h>
#include <nova/render/render_driver.h>
#include <memory>
namespace Nova {
class NOVA_API Renderer {
public:
static void create(RenderAPI api);
static void shutdown();
static Renderer* get();
static RenderDriver* get_driver();
private:
std::unique_ptr<RenderDriver> m_driver;
Renderer() = default;
~Renderer() = default;
};
} // namespace Nova

View File

@@ -0,0 +1,31 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "drivers/vulkan/render_driver.h"
#include <vulkan/vulkan.h>
#include <cstdio>
using namespace Nova;
VulkanRenderDriver::VulkanRenderDriver() {
std::printf("VulkanRenderDriver::VulkanRenderDriver()\n");
}
VulkanRenderDriver::~VulkanRenderDriver() {
std::printf("VulkanRenderDriver::~VulkanRenderDriver()\n");
}
RenderAPI VulkanRenderDriver::get_api() const {
return RenderAPI::VULKAN;
}
u32 VulkanRenderDriver::get_api_version() const {
u32 version;
vkEnumerateInstanceVersion(&version);
return version;
}

View File

@@ -0,0 +1,20 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#pragma once
#include <nova/render/render_driver.h>
namespace Nova {
class VulkanRenderDriver final : public RenderDriver {
public:
VulkanRenderDriver();
~VulkanRenderDriver() override;
[[nodiscard]] RenderAPI get_api() const override;
[[nodiscard]] u32 get_api_version() const override;
};
} // namespace Nova

View File

@@ -0,0 +1,47 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <nova/render/renderer.h>
#include <memory>
#include "drivers/vulkan/render_driver.h"
using namespace Nova;
static Renderer* s_instance = nullptr;
void Renderer::create(const RenderAPI api) {
if (s_instance) {
// TODO: Log error
return;
}
s_instance = new Renderer();
switch (api) {
case RenderAPI::VULKAN:
get()->m_driver = std::make_unique<VulkanRenderDriver>();
break;
default:
// TODO: Log error
break;
}
}
void Renderer::shutdown() {
if (!s_instance) {
// TODO: Log error
return;
}
delete s_instance;
}
Renderer* Renderer::get() {
return s_instance;
}
RenderDriver* Renderer::get_driver() {
return get()->m_driver.get();
}

View File

@@ -1,13 +0,0 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <nova/test.h>
#include <cstdio>
void func() {
std::printf("Hello, world!\n");
}