Compare commits
4 Commits
v2
...
bf937f5678
| Author | SHA1 | Date | |
|---|---|---|---|
|
bf937f5678
|
|||
|
12237c6e4f
|
|||
|
c9474e1214
|
|||
|
aa838c5824
|
@@ -17,18 +17,8 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build (Debug, Release, RelWithDebInfo, MinSizeRel)" FORCE)
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build (Debug, Release, RelWithDebInfo, MinSizeRel)" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
|
|
||||||
|
|
||||||
set(NOVA_SANITIZERS "" CACHE STRING "Sanitizers to enable (address, undefined, leak)")
|
set(NOVA_SANITIZERS "" CACHE STRING "Sanitizers to enable (address, undefined, leak)")
|
||||||
set(NOVA_WERROR OFF CACHE BOOL "Treat compiler warnings as errors")
|
set(NOVA_WERROR OFF CACHE BOOL "Treat compiler warnings as errors")
|
||||||
set(NOVA_LIBRARY_INSTALL OFF CACHE BOOL "Enable library installation targets")
|
|
||||||
|
|
||||||
# set(NOVA_BACKEND_DX12 ON CACHE BOOL "Enable DX12 backend")
|
|
||||||
# set(NOVA_BACKEND_METAL ON CACHE BOOL "Enable Metal backend")
|
|
||||||
set(NOVA_BACKEND_VULKAN ON CACHE BOOL "Enable Vulkan backend")
|
|
||||||
# set(NOVA_BACKEND_WEBGPU ON CACHE BOOL "Enable WebGPU backend")
|
|
||||||
|
|
||||||
set(NOVA_USE_VOLK ON CACHE BOOL "Use volk for Vulkan function loading")
|
|
||||||
|
|
||||||
add_compile_definitions(
|
add_compile_definitions(
|
||||||
NOVA_VERSION_MAJOR=${PROJECT_VERSION_MAJOR}
|
NOVA_VERSION_MAJOR=${PROJECT_VERSION_MAJOR}
|
||||||
@@ -51,11 +41,7 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
|||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_compile_definitions(
|
add_compile_definitions(NOVA_COMPILER_MSVC)
|
||||||
NOVA_COMPILER_MSVC
|
|
||||||
_CRT_SECURE_NO_WARNINGS
|
|
||||||
_CRT_NONSTDC_NO_WARNINGS
|
|
||||||
)
|
|
||||||
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
-Wall
|
-Wall
|
||||||
@@ -90,6 +76,8 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
|||||||
NOVA_PLATFORM_WINDOWS
|
NOVA_PLATFORM_WINDOWS
|
||||||
NOMINMAX
|
NOMINMAX
|
||||||
WIN32_LEAN_AND_MEAN
|
WIN32_LEAN_AND_MEAN
|
||||||
|
_CRT_SECURE_NO_WARNINGS
|
||||||
|
_CRT_NONSTDC_NO_WARNINGS
|
||||||
)
|
)
|
||||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||||
add_compile_definitions(NOVA_PLATFORM_MACOS)
|
add_compile_definitions(NOVA_PLATFORM_MACOS)
|
||||||
@@ -99,10 +87,5 @@ else()
|
|||||||
message(FATAL_ERROR "Unsupported platform")
|
message(FATAL_ERROR "Unsupported platform")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOVA_LIBRARY_INSTALL)
|
|
||||||
include(CMakePackageConfigHelpers)
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(engine)
|
add_subdirectory(engine)
|
||||||
add_subdirectory(editor)
|
add_subdirectory(editor)
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ target_include_directories(nova-editor
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(nova-editor
|
target_link_libraries(nova-editor
|
||||||
PUBLIC nova::nova
|
PUBLIC nova
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,102 +1,19 @@
|
|||||||
# 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
|
||||||
|
|
||||||
include(FetchContent)
|
|
||||||
|
|
||||||
set(NOVA_ENGINE_SRC
|
set(NOVA_ENGINE_SRC
|
||||||
core/debug.cpp
|
core/debug.cpp
|
||||||
graphics/context.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(TRANSFORM NOVA_ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/)
|
list(TRANSFORM NOVA_ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/)
|
||||||
|
|
||||||
add_library(nova ${NOVA_ENGINE_SRC})
|
add_library(nova SHARED ${NOVA_ENGINE_SRC})
|
||||||
|
|
||||||
target_include_directories(nova
|
target_include_directories(nova
|
||||||
PUBLIC
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOVA_BACKEND_VULKAN)
|
target_compile_definitions(nova
|
||||||
find_package(Vulkan REQUIRED)
|
PRIVATE NOVA_EXPORT_SYMBOLS
|
||||||
|
|
||||||
set(NOVA_VULKAN_SRC
|
|
||||||
backends/vulkan/context.cpp
|
|
||||||
backends/vulkan/device.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(TRANSFORM NOVA_VULKAN_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/)
|
|
||||||
|
|
||||||
target_sources(nova PRIVATE ${NOVA_VULKAN_SRC})
|
|
||||||
target_compile_definitions(nova PRIVATE NOVA_BACKEND_VULKAN)
|
|
||||||
target_include_directories(nova PRIVATE ${Vulkan_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
if (NOVA_USE_VOLK)
|
|
||||||
FetchContent_Declare(
|
|
||||||
volk
|
|
||||||
GIT_REPOSITORY https://github.com/zeux/volk.git
|
|
||||||
GIT_TAG f30088b3f4160810b53e19258dd2f7395e5f0ba3 # 1.4.328.1
|
|
||||||
)
|
|
||||||
FetchContent_MakeAvailable(volk)
|
|
||||||
|
|
||||||
target_compile_definitions(nova PRIVATE NOVA_USE_VOLK)
|
|
||||||
target_include_directories(nova PRIVATE ${volk_INCLUDE_DIRS})
|
|
||||||
target_link_libraries(nova PRIVATE volk::volk)
|
|
||||||
else()
|
|
||||||
target_link_libraries(nova PRIVATE Vulkan::Vulkan)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_target_properties(nova PROPERTIES
|
|
||||||
DEFINE_SYMBOL NOVA_EXPORT_SYMBOLS
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
SOVERSION ${PROJECT_VERSION_MAJOR}
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(nova::nova ALIAS nova)
|
|
||||||
|
|
||||||
if (NOVA_LIBRARY_INSTALL)
|
|
||||||
configure_package_config_file(
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/nova-config.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/nova-config.cmake
|
|
||||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nova
|
|
||||||
)
|
|
||||||
|
|
||||||
write_basic_package_version_file(
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/nova-config-version.cmake
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
COMPATIBILITY SameMajorVersion
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
TARGETS nova
|
|
||||||
EXPORT nova-targets
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/nova
|
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
FILES_MATCHING PATTERN "*.hpp"
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
EXPORT nova-targets
|
|
||||||
FILE nova-targets.cmake
|
|
||||||
NAMESPACE nova::
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nova
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
FILES
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/nova-config.cmake
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/nova-config-version.cmake
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nova
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
@PACKAGE_INIT@
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/nova-targets.cmake")
|
|
||||||
|
|
||||||
check_required_components(nova)
|
|
||||||
@@ -15,14 +15,13 @@
|
|||||||
#else
|
#else
|
||||||
#define NOVA_API __declspec(dllimport)
|
#define NOVA_API __declspec(dllimport)
|
||||||
#endif
|
#endif
|
||||||
#elif defined(NOVA_PLATFORM_MACOS) || defined(NOVA_PLATFORM_LINUX)
|
#elif defined(NOVA_PLATFORM_LINUX) || defined(NOVA_PLATFORM_MACOS)
|
||||||
#if defined(NOVA_EXPORT_SYMBOLS)
|
#if defined(NOVA_EXPORT_SYMBOLS)
|
||||||
#define NOVA_API __attribute__((visibility("default")))
|
#define NOVA_API __attribute__((visibility("default")))
|
||||||
#else
|
#else
|
||||||
#define NOVA_API
|
#define NOVA_API
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#warning "NOVA_API is not defined for this platform"
|
|
||||||
#define NOVA_API
|
#define NOVA_API
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
namespace nova::types {
|
namespace Nova::Types {
|
||||||
|
|
||||||
using u8 = uint8_t;
|
using u8 = uint8_t;
|
||||||
using u16 = uint16_t;
|
using u16 = uint16_t;
|
||||||
@@ -30,6 +30,6 @@ using imax = intmax_t;
|
|||||||
using f32 = float;
|
using f32 = float;
|
||||||
using f64 = double;
|
using f64 = double;
|
||||||
|
|
||||||
} // namespace nova::types
|
} // namespace Nova::Types
|
||||||
|
|
||||||
using namespace nova::types;
|
using namespace Nova::Types;
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <nova/core/api.hpp>
|
|
||||||
#include <nova/core/types.hpp>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace nova::gfx {
|
|
||||||
|
|
||||||
class IDevice;
|
|
||||||
|
|
||||||
enum class API {
|
|
||||||
UNDEFINED,
|
|
||||||
VULKAN,
|
|
||||||
};
|
|
||||||
|
|
||||||
class NOVA_API IContext {
|
|
||||||
public:
|
|
||||||
static std::unique_ptr<IContext> create(API api);
|
|
||||||
virtual ~IContext() = default;
|
|
||||||
|
|
||||||
virtual API get_api() const = 0;
|
|
||||||
virtual std::string get_api_name() const = 0;
|
|
||||||
|
|
||||||
virtual u32 get_api_version() const = 0;
|
|
||||||
virtual std::string get_api_version_string() const = 0;
|
|
||||||
|
|
||||||
virtual std::unique_ptr<IDevice> create_device() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace nova::gfx
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <nova/core/api.hpp>
|
|
||||||
#include <nova/core/types.hpp>
|
|
||||||
|
|
||||||
namespace nova::gfx {
|
|
||||||
|
|
||||||
class NOVA_API IDevice {};
|
|
||||||
|
|
||||||
} // namespace nova::gfx
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(NOVA_USE_VOLK)
|
|
||||||
#include <volk.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
|
|
||||||
#include <format>
|
|
||||||
|
|
||||||
#include "backends/vulkan/context.hpp"
|
|
||||||
#include "backends/vulkan/device.hpp"
|
|
||||||
|
|
||||||
namespace nova::gfx {
|
|
||||||
|
|
||||||
VulkanContext::VulkanContext() {
|
|
||||||
#if defined(NOVA_USE_VOLK)
|
|
||||||
if (volkInitialize() != VK_SUCCESS) {
|
|
||||||
throw std::runtime_error("Failed to initialize volk");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
API VulkanContext::get_api() const {
|
|
||||||
return API::VULKAN;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string VulkanContext::get_api_name() const {
|
|
||||||
return "Vulkan";
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 VulkanContext::get_api_version() const {
|
|
||||||
u32 version;
|
|
||||||
vkEnumerateInstanceVersion(&version);
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string VulkanContext::get_api_version_string() const {
|
|
||||||
const u32 version = get_api_version();
|
|
||||||
return std::format(
|
|
||||||
"{}.{}.{}-{}",
|
|
||||||
VK_API_VERSION_MAJOR(version),
|
|
||||||
VK_API_VERSION_MINOR(version),
|
|
||||||
VK_API_VERSION_PATCH(version),
|
|
||||||
VK_API_VERSION_VARIANT(version)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<IDevice> VulkanContext::create_device() {
|
|
||||||
return std::make_unique<VulkanDevice>();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace nova::gfx
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <nova/graphics/context.hpp>
|
|
||||||
|
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
|
|
||||||
namespace nova::gfx {
|
|
||||||
|
|
||||||
class VulkanContext final : public IContext {
|
|
||||||
public:
|
|
||||||
VulkanContext();
|
|
||||||
|
|
||||||
API get_api() const override;
|
|
||||||
std::string get_api_name() const override;
|
|
||||||
|
|
||||||
u32 get_api_version() const override;
|
|
||||||
std::string get_api_version_string() const override;
|
|
||||||
|
|
||||||
std::unique_ptr<IDevice> create_device() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
VkInstance m_instance = VK_NULL_HANDLE;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace nova::gfx
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <vulkan/vulkan.h>
|
|
||||||
|
|
||||||
#include "backends/vulkan/device.hpp"
|
|
||||||
|
|
||||||
namespace nova::gfx {
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <nova/graphics/device.hpp>
|
|
||||||
|
|
||||||
namespace nova::gfx {
|
|
||||||
|
|
||||||
class VulkanDevice final : public IDevice {
|
|
||||||
public:
|
|
||||||
// TODO
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace nova::gfx
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <nova/graphics/context.hpp>
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
#if defined(NOVA_BACKEND_VULKAN)
|
|
||||||
#include "backends/vulkan/context.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace nova::gfx {
|
|
||||||
|
|
||||||
std::unique_ptr<IContext> IContext::create(API p_api) {
|
|
||||||
switch (p_api) {
|
|
||||||
#if defined(NOVA_BACKEND_VULKAN)
|
|
||||||
case API::VULKAN:
|
|
||||||
return std::make_unique<VulkanContext>();
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
throw std::runtime_error("Unsupported graphics API");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace nova::gfx
|
|
||||||
Reference in New Issue
Block a user