diff --git a/editor/src/main.cpp b/editor/src/main.cpp index f7528f7..21c333c 100644 --- a/editor/src/main.cpp +++ b/editor/src/main.cpp @@ -4,8 +4,22 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include +#include + +#include +#include + +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(api)); + printf("Version: %d\n", version); + + Renderer::shutdown(); + return EXIT_SUCCESS; } diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 2bb2dde..5d1b98f 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -1,11 +1,15 @@ # Copyright (c) 2025, Jayden Grubb # 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 () diff --git a/engine/include/nova/test.h b/engine/include/nova/render/render_api.h similarity index 64% rename from engine/include/nova/test.h rename to engine/include/nova/render/render_api.h index 66b58a9..d42a3d4 100644 --- a/engine/include/nova/test.h +++ b/engine/include/nova/render/render_api.h @@ -6,6 +6,6 @@ #pragma once -#include - -NOVA_API void func(); +namespace Nova { + enum class RenderAPI { VULKAN }; +} // namespace Nova diff --git a/engine/include/nova/render/render_driver.h b/engine/include/nova/render/render_driver.h new file mode 100644 index 0000000..e2b610f --- /dev/null +++ b/engine/include/nova/render/render_driver.h @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +#include +#include +#include + +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 diff --git a/engine/include/nova/render/renderer.h b/engine/include/nova/render/renderer.h new file mode 100644 index 0000000..0de1086 --- /dev/null +++ b/engine/include/nova/render/renderer.h @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +#include +#include +#include + +#include + +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 m_driver; + + Renderer() = default; + ~Renderer() = default; + }; +} // namespace Nova diff --git a/engine/src/drivers/vulkan/render_driver.cpp b/engine/src/drivers/vulkan/render_driver.cpp new file mode 100644 index 0000000..fdc3785 --- /dev/null +++ b/engine/src/drivers/vulkan/render_driver.cpp @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "drivers/vulkan/render_driver.h" + +#include + +#include + +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; +} diff --git a/engine/src/drivers/vulkan/render_driver.h b/engine/src/drivers/vulkan/render_driver.h new file mode 100644 index 0000000..9ba5fab --- /dev/null +++ b/engine/src/drivers/vulkan/render_driver.h @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +#include + +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 diff --git a/engine/src/render/renderer.cpp b/engine/src/render/renderer.cpp new file mode 100644 index 0000000..7e202b8 --- /dev/null +++ b/engine/src/render/renderer.cpp @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +#include + +#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(); + 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(); +} diff --git a/engine/src/test.cpp b/engine/src/test.cpp deleted file mode 100644 index 5968b9b..0000000 --- a/engine/src/test.cpp +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) 2025, Jayden Grubb - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include - -#include - -void func() { - std::printf("Hello, world!\n"); -}