Add basic Renderer and RenderDriver classes
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 ()
|
||||||
|
|||||||
@@ -6,6 +6,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <nova/api.h>
|
namespace Nova {
|
||||||
|
enum class RenderAPI { VULKAN };
|
||||||
NOVA_API void func();
|
} // 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