diff --git a/CMakeLists.txt b/CMakeLists.txt index fa1fcba..ad30cf3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,8 +8,9 @@ endif() set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -project ("EtrediaEmpires") +project (EtrediaEmpires) -add_subdirectory ("p7lib") -add_subdirectory ("ECSAPI") -add_subdirectory ("frontend") \ No newline at end of file +add_subdirectory(utils) +add_subdirectory (p7lib) +add_subdirectory (ECSAPI) +add_subdirectory (frontend) \ No newline at end of file diff --git a/frontend/CMakeLists.txt b/frontend/CMakeLists.txt index bf4a0f5..b4e38a1 100644 --- a/frontend/CMakeLists.txt +++ b/frontend/CMakeLists.txt @@ -13,14 +13,15 @@ project (EEfrontend) # List sources -#set(HEADERS "RmlVulkanInterface.hpp") -set(SOURCES "main.cpp") +set(HEADERS "Renderer.hpp") +set(SOURCES "main.cpp" "Renderer.cpp") -#list(TRANSFORM HEADERS PREPEND "include/") +list(TRANSFORM HEADERS PREPEND "include/") list(TRANSFORM SOURCES PREPEND "src/") # Find dependencies +find_package(Boost REQUIRED COMPONENTS lockfree) find_package(SDL2 CONFIG REQUIRED) find_package(Vulkan REQUIRED) find_package(RmlUi CONFIG REQUIRED) @@ -29,6 +30,9 @@ find_package(RmlUi CONFIG REQUIRED) add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES}) +target_link_libraries(${PROJECT_NAME} PUBLIC utils) + +target_link_libraries(${PROJECT_NAME} PRIVATE Boost::lockfree) target_link_libraries(${PROJECT_NAME} PRIVATE p7) target_link_libraries( ${PROJECT_NAME} diff --git a/frontend/include/Renderer.hpp b/frontend/include/Renderer.hpp new file mode 100644 index 0000000..6c91a69 --- /dev/null +++ b/frontend/include/Renderer.hpp @@ -0,0 +1,31 @@ +#pragma once +#include +#include + +#include +#include +#include +#include + +class Renderer +{ +private: + std::stop_token *stoken; + std::jthread renderThread; + + SDL_Window *window; + VkInstance vulkan; + Rml::Context *uiContext; + + void Threading(); + void Loop(); + void Release(); + +public: + std::atomic isRunning; + + Renderer(SDL_Window *window); + + void Start(); + void Stop(); +}; \ No newline at end of file diff --git a/frontend/src/Renderer.cpp b/frontend/src/Renderer.cpp new file mode 100644 index 0000000..aad2dba --- /dev/null +++ b/frontend/src/Renderer.cpp @@ -0,0 +1,89 @@ +#include "Renderer.hpp" +#include "Logger.h" +#include + +Renderer::Renderer(SDL_Window *window) : isRunning(false) +{ + this->window = window; +} + +void Renderer::Start() +{ + isRunning = true; + renderThread = std::jthread([this](std::stop_token stop) { + this->stoken = &stop; + Threading(); + }); +} + +void Renderer::Threading() +{ + Logger::trace->Register_Thread(L"Renderer", 0); + LOG(INFO, "Renderer thread started"); + + // Setup Vulkan + uint32_t sdlExtensionsCount = 0; + if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, nullptr) ) + LOG(CRITICAL, "Fail to get SDL Vulkan extensions number! %hs", SDL_GetError()); + + const char **sdlExtentions = AllocateArray(sdlExtensionsCount); + + if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, sdlExtentions) ) + LOG(CRITICAL, "Fail to load SDL Vulkan extentions! %hs", SDL_GetError()); + else LOG(INFO, "Load %d SDL Vulkan extenstions", sdlExtensionsCount); + + VkInstanceCreateInfo vkCreateConfig = { + .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, + .enabledLayerCount = 0, + .enabledExtensionCount = sdlExtensionsCount, + .ppEnabledExtensionNames = sdlExtentions + }; + + VkResult vkCreateResult = vkCreateInstance(&vkCreateConfig, nullptr, &vulkan); + if (vkCreateResult != VK_SUCCESS) + LOG(CRITICAL, "Vulkan is not instantiated! Code: %d", vkCreateResult); + else LOG(INFO, "Vulkan is instantiated"); + + DeallocateArray(sdlExtentions); + + //Setup RmlUi + if (!Rml::Initialise()) + LOG(CRITICAL, "RmlUi initialization failed!"); + else LOG(INFO, "RmlUi initialized"); + + int32_t screenWidth, screenHeight; + SDL_GetWindowSize(window, &screenWidth, &screenHeight); + uiContext = Rml::CreateContext("default", Rml::Vector2i(screenWidth, screenHeight)); + if (!uiContext) + LOG(CRITICAL, "RmlUi context creation failed!"); + else LOG(INFO, "RmlUi context created"); + + Loop(); + + Release(); +} + +void Renderer::Loop() +{ + while (!stoken->stop_requested()) + { + /* */ + LOG(DEBUG, "..."); + Sleep(1000); + } +} + +void Renderer::Stop() +{ + renderThread.request_stop(); +} + +void Renderer::Release() +{ + Rml::Shutdown(); + vkDestroyInstance(vulkan, nullptr); + + isRunning = false; + + LOG(INFO, "Renderer released"); +} \ No newline at end of file diff --git a/frontend/src/main.cpp b/frontend/src/main.cpp index 245bf92..3c8ffb5 100644 --- a/frontend/src/main.cpp +++ b/frontend/src/main.cpp @@ -1,23 +1,24 @@ +#include "Logger.h" +#include + +#include "Renderer.hpp" + + #ifdef _DEBUG #define P7_SINK L"/P7.Sink=Console" #else #define P7_SINK L"/P7.Sink=FileTxt" #endif -#include "P7_Client.h" -#include "P7_Trace.h" -#include -#include -#include -#include +IP7_Trace* Logger::trace; int SDL_main(int argc, char **argv) { // Setup P7 logger IP7_Client *p7client = P7_Create_Client(P7_SINK); P7_Set_Crash_Handler(); - IP7_Trace *logger = P7_Create_Trace(p7client, L"TC 1"); - logger->Register_Thread(L"MainThread", 0); + Logger::trace = P7_Create_Trace(p7client, L"TC 1"); + Logger::trace->Register_Thread(L"Main", 0); // Setup SDL bool quit = false; @@ -37,45 +38,13 @@ int SDL_main(int argc, char **argv) if (!window) { quit = true; - LOG(logger, CRITICAL, "SDL Window fails: %hs", SDL_GetError()); + LOG(CRITICAL, "SDL Window fails: %hs", SDL_GetError()); } - else LOG(logger, INFO, "SDL Window created"); + else LOG(INFO, "SDL Window created"); - // Setup Vulkan - VkInstance vulkan; - - uint32_t sdlExtensionsCount = 0; - if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, nullptr) ) - LOG(logger, CRITICAL, "Fail to get SDL Vulkan extensions number! %hs", SDL_GetError()); - - const char **sdlExtentions = new const char*[sdlExtensionsCount](); - - if ( !SDL_Vulkan_GetInstanceExtensions(window, &sdlExtensionsCount, sdlExtentions) ) - LOG(logger, CRITICAL, "Fail to load SDL Vulkan extentions! %hs", SDL_GetError()); - else LOG(logger, INFO, "Load %d SDL Vulkan extenstions", sdlExtensionsCount); - - VkInstanceCreateInfo vkCreateConfig = { - .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, - .enabledLayerCount = 0, - .enabledExtensionCount = sdlExtensionsCount, - .ppEnabledExtensionNames = sdlExtentions - }; - - VkResult vkCreateResult = vkCreateInstance(&vkCreateConfig, nullptr, &vulkan); - if (vkCreateResult != VK_SUCCESS) - LOG(logger, CRITICAL, "Vulkan is not instantiated! Code: %d", vkCreateResult); - else LOG(logger, INFO, "Vulkan is instantiated"); - - delete[] sdlExtentions; - - //Setup RmlUi - if (!Rml::Initialise()) - LOG(logger, CRITICAL, "RmlUi initialization failed!"); - else LOG(logger, INFO, "RmlUi initialized"); - - int32_t screenWidth, screenHeight; - SDL_GetWindowSize(window, &screenWidth, &screenHeight); - Rml::Context *uiContext = Rml::CreateContext("default", Rml::Vector2i(screenWidth, screenHeight)); + // Setup Renderer + Renderer renderer(window); + renderer.Start(); // Process SDL events while(!quit) @@ -96,7 +65,8 @@ int SDL_main(int argc, char **argv) { case SDL_WINDOWEVENT_RESIZED: { - uiContext->SetDimensions(Rml::Vector2i(event.window.data1, event.window.data2)); + //TODO: move to renderer + //uiContext->SetDimensions(Rml::Vector2i(event.window.data1, event.window.data2)); break; } } @@ -108,12 +78,11 @@ int SDL_main(int argc, char **argv) } // Free memory - LOG(logger, INFO, "Exit..."); - Rml::Shutdown(); - vkDestroyInstance(vulkan, nullptr); + LOG(INFO, "Exit..."); + renderer.Stop(); while(renderer.isRunning) {/* */} SDL_Quit(); - logger->Unregister_Thread(0); - logger->Release(); + Logger::trace->Unregister_Thread(0); + Logger::trace->Release(); p7client->Release(); return 0; diff --git a/p7lib/Headers/Logger.h b/p7lib/Headers/Logger.h new file mode 100644 index 0000000..74efe10 --- /dev/null +++ b/p7lib/Headers/Logger.h @@ -0,0 +1,10 @@ +#pragma once +#include "P7_Trace.h" + +#define LOG(level, format, ...) Logger::trace->P7_DELIVER(0, EP7TRACE_LEVEL_##level, NULL, TM(format), __VA_ARGS__) + +class Logger +{ +public: + static IP7_Trace *trace; +}; diff --git a/p7lib/Headers/P7_Trace.h b/p7lib/Headers/P7_Trace.h index 46f5435..93c3c1b 100644 --- a/p7lib/Headers/P7_Trace.h +++ b/p7lib/Headers/P7_Trace.h @@ -140,9 +140,6 @@ enum eP7Trace_Level i_hModule,\ __VA_ARGS__) -//////////////////////////////////////////////////////////////////////////////// -#define LOG(logger, level, format, ...) logger->P7_DELIVER(0, EP7TRACE_LEVEL_##level, NULL, TM(format), __VA_ARGS__) - //////////////////////////////////////////////////////////////////////////////// /////////////////////////////IP7_Trace////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt new file mode 100644 index 0000000..db955b2 --- /dev/null +++ b/utils/CMakeLists.txt @@ -0,0 +1,4 @@ +project(utils) + +add_library(${PROJECT_NAME} INTERFACE) +target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) \ No newline at end of file diff --git a/utils/include/allocator.hpp b/utils/include/allocator.hpp new file mode 100644 index 0000000..7239548 --- /dev/null +++ b/utils/include/allocator.hpp @@ -0,0 +1,21 @@ +#pragma once + +template T* Allocate() +{ + return new T(); +} + +template void Deallocate(T* obj) +{ + delete obj; +} + +template T* AllocateArray(size_t size) +{ + return new T[size]; +} + +template void DeallocateArray(T* obj) +{ + delete[] obj; +} \ No newline at end of file diff --git a/vcpkg.json b/vcpkg.json index fc7170b..eedad37 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,5 +1,6 @@ { "dependencies": [ + "boost-lockfree", "entt", "vulkan", {"name": "sdl2", "features": ["vulkan"]},