Add basic Renderer and RenderDriver classes
This commit is contained in:
@@ -4,8 +4,22 @@
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <nova/test.h>
|
||||
#include <nova/render/renderer.h>
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
using namespace Nova;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
# Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
set(SRC
|
||||
test.cpp
|
||||
find_package(Vulkan REQUIRED)
|
||||
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(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
@@ -13,12 +17,22 @@ include_directories(
|
||||
${Vulkan_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(ENGINE_LIBS
|
||||
Vulkan::Vulkan
|
||||
)
|
||||
|
||||
if (NOVA_ENGINE_SHARED)
|
||||
add_library(nova SHARED ${SRC})
|
||||
add_library(nova SHARED ${ENGINE_SRC})
|
||||
target_compile_definitions(nova PRIVATE
|
||||
NOVA_DLL_EXPORT
|
||||
)
|
||||
target_link_libraries(nova PRIVATE
|
||||
${ENGINE_LIBS}
|
||||
)
|
||||
endif ()
|
||||
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 ()
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <nova/api.h>
|
||||
|
||||
NOVA_API void func();
|
||||
namespace Nova {
|
||||
enum class RenderAPI { VULKAN };
|
||||
} // namespace Nova
|
||||
21
engine/include/nova/render/render_driver.h
Normal file
21
engine/include/nova/render/render_driver.h
Normal 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
|
||||
29
engine/include/nova/render/renderer.h
Normal file
29
engine/include/nova/render/renderer.h
Normal 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
|
||||
31
engine/src/drivers/vulkan/render_driver.cpp
Normal file
31
engine/src/drivers/vulkan/render_driver.cpp
Normal 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;
|
||||
}
|
||||
20
engine/src/drivers/vulkan/render_driver.h
Normal file
20
engine/src/drivers/vulkan/render_driver.h
Normal 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
|
||||
47
engine/src/render/renderer.cpp
Normal file
47
engine/src/render/renderer.cpp
Normal 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();
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
Reference in New Issue
Block a user