Renderer thread base

- Renderer class
- Vulkan and RmlUi moved from main to Renderer thread
This commit is contained in:
legatt 2025-08-08 20:25:47 +03:00
parent 32f4597c4d
commit 0062aa85e5
10 changed files with 188 additions and 61 deletions

View File

@ -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")
add_subdirectory(utils)
add_subdirectory (p7lib)
add_subdirectory (ECSAPI)
add_subdirectory (frontend)

View File

@ -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}

View File

@ -0,0 +1,31 @@
#pragma once
#include <thread>
#include <atomic>
#include <SDL2/SDL.h>
#include <SDL2/SDL_vulkan.h>
#include <vulkan/vulkan.h>
#include <RmlUi/Core.h>
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<bool> isRunning;
Renderer(SDL_Window *window);
void Start();
void Stop();
};

89
frontend/src/Renderer.cpp Normal file
View File

@ -0,0 +1,89 @@
#include "Renderer.hpp"
#include "Logger.h"
#include <allocator.hpp>
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<const char*>(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");
}

View File

@ -1,23 +1,24 @@
#include "Logger.h"
#include <SDL2/SDL.h>
#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 <SDL2/SDL.h>
#include <SDL2/SDL_vulkan.h>
#include <vulkan/vulkan.h>
#include <RmlUi/Core.h>
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;

10
p7lib/Headers/Logger.h Normal file
View File

@ -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;
};

View File

@ -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//////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

4
utils/CMakeLists.txt Normal file
View File

@ -0,0 +1,4 @@
project(utils)
add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)

View File

@ -0,0 +1,21 @@
#pragma once
template<typename T> T* Allocate()
{
return new T();
}
template<typename T> void Deallocate(T* obj)
{
delete obj;
}
template<typename T> T* AllocateArray(size_t size)
{
return new T[size];
}
template<typename T> void DeallocateArray(T* obj)
{
delete[] obj;
}

View File

@ -1,5 +1,6 @@
{
"dependencies": [
"boost-lockfree",
"entt",
"vulkan",
{"name": "sdl2", "features": ["vulkan"]},